Назначение обработчика событий в Delphi 2007 для всех элементов управления в форме - PullRequest
1 голос
/ 07 сентября 2011

Я пытаюсь создать небольшую часть программного обеспечения, которое можно просто перетаскивать.Я начал с динамического создания TButton, и он работал нормально.

Однако при обобщении функциональности я столкнулся с проблемой из-за «защищенного» статуса OnDragDrop и OnMouseDownEvent базового класса TControl.1003 *

procedure TForm1.FormDragDrop(Sender, Source: TObject; X, Y: Integer);
  var
    newControl: TControl;
    selClass: TControlClass;
    ctlName: string;
    selItem: string;
  begin
    if TControl(Sender).Parent = Self then
    begin
      with TWinControl(Source) do
      begin
        Left:= X;
        Top:= Y;
        EndDrag(True); {drop the control}
      end;
    end
    else begin
      selItem:= TypeList.Items[TypeList.ItemIndex];
      selClass:= TControlClass(GetClass(selItem));

      newControl:= selClass.Create(Self);
      newControl.Parent:= Self;

      ctlName:= newControl.ClassName + IntToStr(GetControlCount(selClass));
      Delete(ctlName, 1, 1); {Remove 'T' from name}

      newControl.Name:= ctlName;
      newControl.Left:= X;
      newControl.Top:= Y;

      { TODO : assign events onDragDrop and onMouseDown}
      (*
      newControl.OnMouseDown:= @ControlMouseDown;
      newControl.OnDragDrop:= @FormDragDrop;
      *)

    end;

  end;

Ответы [ 3 ]

9 голосов
/ 07 сентября 2011

Добавьте следующую декларацию к вашему устройству:

type
  TControlHack = class(TControl);

и используйте приведение типа для нового элемента управления:

TControlHack(newControl).OnMouseDown := ...
2 голосов
/ 07 сентября 2011

Вы можете использовать RTTI, RTTI "старого стиля" доступен через TypInfo единицу :

  • используйте IsPublishedProp(), чтобы проверить, есть ли у класса / объекта свойство;
  • используйте SetMethodProp() для назначения обработчика событий.
0 голосов
/ 08 сентября 2011

Для тех, кто читает это, кто использует D2010 или выше:

Я написал небольшую утилиту под названием «DelphiEventLogger», чтобы сделать именно эту вещь: то есть «назначить обработчик событий всем элементам управления в форме».Он использует более новый стиль RTTI, который не был доступен в Delphi до 2010 года (я верю).

Он очень прост в использовании;просто добавьте модуль в ваш список использований и затем выполните один вызов процедуры.

Загрузка - здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...