Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.06.2011, 23:25   #1
Valio
Сливочное масло
Участник клуба
 
Аватар для Valio
 
Регистрация: 01.01.2011
Сообщений: 1,149
По умолчанию Повесить общую процедуру на событие кучки компонентов

Дано:
10 компонентов Image.

Надо:
Для всех 10 нужно на событие OnMouseEnter повесить код.

Вопрос:
Как это сделать динамически?

Суть вопроса:
Обычно это делают так: выбирают компонент, жмут вкладку Events, находят нужное событие, щёлкают, пишут куда показала среда.
Но мне както лениво набивать один и тотже текст таким вот образом.

Вот я в цикле перебираю и мне хочется сделать както так, тобишь назвначить на это событие общую процедуру:

Код:
(CompImg As TImage).OnMouseEnter(MySuperProcedure);
Но естественно это не работает.
Сливочное масло Valio - компиляция как по маслу
Valio вне форума Ответить с цитированием
Старый 03.06.2011, 23:27   #2
_Engine_
Форумчанин
 
Регистрация: 29.06.2008
Сообщений: 603
По умолчанию

(CompImg As TImage).OnMouseEnter := MySuperProcedure;
_Engine_ вне форума Ответить с цитированием
Старый 03.06.2011, 23:47   #3
Valio
Сливочное масло
Участник клуба
 
Аватар для Valio
 
Регистрация: 01.01.2011
Сообщений: 1,149
По умолчанию

Спасибо, я так тоже пробывал, но работать это стало только когда я написал:

Код:
Procedure TForm1.MySuperProcedure(Sender: TObject);
Begin
// ...
End;
Ну хоть стало работать, а то без Sender не работает )
Сливочное масло Valio - компиляция как по маслу
Valio вне форума Ответить с цитированием
Старый 04.06.2011, 00:01   #4
spamer
Software Developer
Старожил
 
Аватар для spamer
 
Регистрация: 19.12.2008
Сообщений: 2,070
По умолчанию

Цитата:
Сообщение от Valio Посмотреть сообщение
а то без Sender не работает )
Еще бы, ведь Sender ссылается на объект который сгенерировал событие...т.е. по сути Sender ссылается на компонент, который вызывает наш метод обработки события...как-то так...
Будь проще и люди к тебе потянутся
spamer вне форума Ответить с цитированием
Старый 04.06.2011, 15:16   #5
Swarog
Форумчанин
 
Аватар для Swarog
 
Регистрация: 26.01.2010
Сообщений: 215
По умолчанию

Цитата:
Обычно это делают так: выбирают компонент, жмут вкладку Events, находят нужное событие, щёлкают, пишут куда показала среда.
делаешь тоже самое для первого, для второго почти тоже самое только не щелкай дважды по полю а нажми один раз на треугольничек справа и выбери процедуру которая была определена для первого, повтори последний шаг для остальных компонентов
Могу лишь пнуть в нужном направлении (ну или как получится)
Swarog вне форума Ответить с цитированием
Старый 13.10.2014, 15:00   #6
zvygin1964
Старожил
 
Аватар для zvygin1964
 
Регистрация: 19.06.2013
Сообщений: 2,463
По умолчанию

Это возможно если компонентов мало, а если 300 штук?
Нашел, как это делается (http://zoo-mania.ru/delphi/tobjectlist/index.html), но этот пример не работает:
Код:
unit main;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls, ComCtrls, Contnrs;   //добавлен Contnrs

type
  TfrmCallbase = class(TForm)
     {TEditList имя нового класса, на основе TObjectList}
    Edit1: TEdit;
    Edit2: TEdit;
     procedure FormCreate(Sender: TObject);
     procedure FormDestroy(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 type
TEditList = class(TObjectList)
  private
    function GetItems(Index: Integer): TEdit;
    procedure SetItems(Index: Integer; const Value: TEdit);
  published
  public
    property Items[Index: Integer]: TEdit read GetItems write SetItems; default;
  end;
var
  frmCallbase: TfrmCallbase;
  EditList: TEditList;

implementation

{$R *.dfm}      { TEditList }
  procedure TfrmCallbase.FormCreate(Sender: TObject);
begin
  EditList := TEditList.Create();
  EditList.Add(Edit1);
  EditList.Add(Edit2);

  for i:=0 to EditList.Count - 1 do
  EditList[i].Text = 'default';
end;

  procedure TfrmCallbase.FormDestroy(Sender: TObject);
begin
 EditList.Free;
end;

function TEditList.GetItems(Index: Integer): TEdit;
begin
 Result := TEdit(inherited GetItem(Index));
end;

procedure TEditList.SetItems(Index: Integer; const Value: TEdit);
begin
  inherited SetItem(Index, Value);
end;

end.
Error in module main: Declaration of class TForm1 is missing or incorrect.

Где забыли (или стёрли) нужный:
Код:
type
  TForm1 = class(TForm)
Репутация: полный "0"
zvygin1964 вне форума Ответить с цитированием
Старый 13.10.2014, 15:24   #7
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,872
По умолчанию

А не надо было ручками в pas-файле менять Form1 на frmCallbase. Менять имя формы надо было в инспекторе объектов. Ну а раз уж так сделал, то теперь меняй имя формы ручками еще и в dfm-файле.
northener вне форума Ответить с цитированием
Старый 13.10.2014, 16:00   #8
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

zvygin1964, Все проще. Не надо никаких классов самому писать. Есть класс TComponentList. И есть оператор is.
Храни там определенный тип компонентов и не заморачивайся.


А с обобщенными типами данных(начиная с Delphi 2010) вообще все проще, только переменные объявить:
Код:
var
 EditsList:TObjectList<TEdit>;//Список полей ввода
 ButtonsList:TObjectList<TButton>; //Список кнопок

все эл-ы списка объектов автоматически TEdit, Tbutton
Человек_Борща вне форума Ответить с цитированием
Старый 13.10.2014, 16:07   #9
zvygin1964
Старожил
 
Аватар для zvygin1964
 
Регистрация: 19.06.2013
Сообщений: 2,463
По умолчанию

Информация о класс TComponentList обрывочна. У меня Delphi 7. Где посмотреть на работающий пример. Google дает миллион ссылок начиная от Delphi 3.
Работающий пример ищу со времён вопроса http://www.programmersforum.ru/showt...=118353&page=5
Репутация: полный "0"
zvygin1964 вне форума Ответить с цитированием
Старый 13.10.2014, 16:13   #10
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,551
По умолчанию

Цитата:
Сообщение от zvygin1964 Посмотреть сообщение
Это возможно если компонентов мало, а если 300 штук?
Ничего, что ТС на форуме уже два года не появлялся? Наверное, замерз в холодильнике.
Arigato вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как "повесить " передачу данных из формы на событие нажатия кнопки типа "button" ? vedro-compota JavaScript, Ajax 10 14.12.2010 21:05
На какое событие повесить процедуру изменения насыщенности шрифта в ячейке? O_H Microsoft Office Excel 3 19.08.2010 20:06
Как повесить обработчик на AfterRefresh QueryTable Dryou Microsoft Office Excel 0 21.04.2010 13:05
как повесить на кнопку 2 действия??? Только_Учусь Общие вопросы Delphi 4 22.09.2008 19:42
Повесить XP ERASERROR Свободное общение 9 28.02.2008 22:51