Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Объединение одинаковых событий от разных объектов


Автор: Dukalys 9.9.2010, 17:55
В программе встречается конструкция такого рода - 

Код

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
 XXX; //code
end;

...

 procedure TForm1.Image10MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
 XXX; //code
end; 



Где ххх почти одно и тоже(там меняется элемент массива i = № имейджа)

Возможно это объединить? а то у меня такой кусок текста огромный бесит просто !!!

Автор: cat512 9.9.2010, 20:58
ну так сделай отдельный метод, и вынеси общее туда, а потом вызывай этот метод в обработчиках. Была уже подобная тема недавно, ищи по форуму

Автор: Frees 9.9.2010, 21:08
Код

...
Image1.OnMouseDown := ImageMouseDown;
Image10.OnMouseDown := ImageMouseDown;
...

procedure TForm1.ImageMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  ShowMessage(TImage(Sender).Name);
end; 

Автор: БелАмор 9.9.2010, 21:40
Посмотрите ссылку:
http://www.delphikingdom.com/asp/answer.asp?IDAnswer=50218

Автор: Dukalys 10.9.2010, 07:37
Спасибо. Написал обработчик для MouseMove

Код

//************************Обработчик события мыши***********************
procedure TForm1.ImageMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var
  id   : integer; //задано свойством tag объекта
begin
  //Определяем id изображения
  id := (Sender as TImage).Tag;
  if NOT(Image[id]) then
  begin
    with (Sender as TImage) do begin
      Top    := Top  - dxy;
      Left   := Left - dxy;
      Height := 51;
      Width  := 51;
    end;
    Image[id] := true;
  end;
end;
//**********************************************************************
 


Теперь, когда он унифицирован под любой Image, хочу его применить для каждого Image.
Перехожу в события объекта,напротив onMouseMove  -  ввожу название  процедуры.

Спасиб. существовал небольшой барьер по работе с Sender'ami поэтому не мог "тыркнуться" с этим делом.



Интересен ещё такой момент -
как получить объект, зная его имя - примерный набросок кода 
Код

name : string;

name := 'Image' + '1';

with (name as TImage) do begin
  trololo;
end;


как заставить работать with (name as TImage)

Автор: Frees 10.9.2010, 09:00

Цитата(Dukalys @  10.9.2010,  10:37 Найти цитируемый пост)
как получить объект, зная его имя 

Код

with (FindComponent(name) as TImage) do begin


а что ты хочешь сделать.. поиск по имени не самое лучшее решение

Автор: Dukalys 10.9.2010, 11:01
В обработчике события  Panel.MouseMove у меня присутствует код

Код

....
case i of
        1:
          begin
            Form1.Image1.Left := Form1.Image1.Left + dxy;
            Form1.Image1.Top := Form1.Image1.Top + dxy;
            Form1.Image1.Height := 48;
            Form1.Image1.Width := 48;
          end;
        2: Тоже самое только Image2
        3 Image3
4
5
6
7... 


Получается огромный кусок кода, поэтому хочу сократить до 4 строчек.

Код

with (FindComponent(name) as TImage) do begin


Frees, Спасибо, помогло.

P.S. Кстати писать Form1.Image1..... считается признаком плохого тона или как ?  
можно просто писать     Image1   , или переменную по созданию формы получить Imagex1 := Form1.Image1

как лучше, и как правильно с точки зрения производительности. Всё время пишу Form1  и  не задумывался. может быть статья есть правила хорошего тона в Delphi )

Автор: Frees 10.9.2010, 12:51
Цитата(Dukalys @  10.9.2010,  14:01 Найти цитируемый пост)
Всё время пишу Form1

такой переменной может и не быть лучше писать Self или ниче не писать.

Автор: БелАмор 10.9.2010, 13:15
Цитата(Dukalys @  10.9.2010,  11:01 Найти цитируемый пост)
P.S. Кстати писать Form1.Image1..... считается признаком плохого тона или как ?

Это не "признак плохого тона", а грубейшая ошибка, хотя в частных случаях всё может нормально работать. Посмотрите ссылку:
http://www.delphikingdom.com/asp/answer.asp?IDAnswer=77021

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)