delphi - 在Delphi 2007中将事件处理程序分配给窗体上的所有控件

标签 delphi oop

我正在尝试创建一小部分软件,以进行一些拖放操作。我刚开始只是动态创建TButton,并且效果很好。

但是,在泛化功能时,由于基类TControl的OnDragDrop和OnMouseDownEvent处于“保护”状态,我遇到了一个问题。

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;

最佳答案

将以下声明添加到您的单元中:

type
  TControlHack = class(TControl);


并为新控件使用类型转换:

TControlHack(newControl).OnMouseDown := ...

关于delphi - 在Delphi 2007中将事件处理程序分配给窗体上的所有控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7330606/

相关文章:

c++ - 切片在 C++ 中意味着什么?

delphi - 如何增加分配给变量的串行数据的数量?

javascript - 实现原型(prototype)继承的正确方式

java - 为什么我不能从事件监听器调用方法,但可以在类的其他地方调用方法?

.net - 如果 CIL 仅基于堆栈,为什么它支持实例

c++ - 如何为我正在编写的《神之浩劫》迷你游戏创建和访问对象数组

delphi - 如何检测 TadoConnection 是否失去了与服务器的通信?

c# - 如何在 C# 中做类似 Delphi 的框架?

delphi - 如何使用 FormatDateTime 返回与当前年份连接的默认日期?

delphi - 如何将 Indy UTF-8 响应转换为 native Delphi (Unicode) 字符串?