Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 如何实现自定义TGraphicControl.OnResize?_Delphi_Delphi 7 - Fatal编程技术网

Delphi 如何实现自定义TGraphicControl.OnResize?

Delphi 如何实现自定义TGraphicControl.OnResize?,delphi,delphi-7,Delphi,Delphi 7,我是否应该使用WM\u WINDOWPOSCHANGED?(我没有看到CM\u WINDOWPOSCHANGED或类似内容) Tgraphic控件是否会收到此消息的通知(它没有句柄)?正确的方法是什么 谢谢 在接受答案后,我想: 奇怪地或可能是故意地OnResize触发,即使只有控制位置的顶部/左侧发生了更改: 在Delphi 7中,在t控件中调用Resize。在调用Perform(WM_WINDOWPOSCHANGED)之后,即使没有实际调整大小并且控件被移动,SetBounds也会立即停止

我是否应该使用
WM\u WINDOWPOSCHANGED?(我没有看到
CM\u WINDOWPOSCHANGED
或类似内容)

Tgraphic控件是否会收到此消息的通知(它没有句柄)?正确的方法是什么

谢谢


在接受答案后,我想:

奇怪地或可能是故意地
OnResize
触发,即使只有控制位置的顶部/左侧发生了更改:
在Delphi 7中,在
t控件中调用
Resize
。在调用
Perform(WM_WINDOWPOSCHANGED)
之后,即使没有实际调整大小并且控件被移动,SetBounds
也会立即停止。

这是故意的吗

OnResize事件已经在TControl中实现,它只是受到保护。要访问它,您只需为组件重新声明它。您还可以使用interposer类或“Hack”类来访问它。作为TImage的示例:

将其用于自己的组件:

TMycontrol=Class(TGraphicControl)
    published
    Property OnResize;
End;
使用插入器类:

type
  TImage=Class(ExtCtrls.TImage)
   Property OnResize; 
  End;

  TForm3 = class(TForm)
//....

procedure TForm3.MyResize(Sender: TObject);
begin
  Showmessage(Sender.ClassName)
end;


procedure TForm3.Button1Click(Sender: TObject);
begin
  Image1.OnResize := MyResize;
  Image1.Width := 300;
end;
使用刚刚到位的“黑客”:

implementation

{$R *.dfm}
Type THack=Class(TControl)
    Property OnResize;
End;

procedure TForm3.MyResize(Sender: TObject);
begin
  Showmessage(Sender.ClassName)
end;

procedure TForm3.Button1Click(Sender: TObject);
begin
  THack(Image1).OnResize :=  MyResize;
  Image1.Width := 300;
end;
事件由parentcontrol迭代TWinControl.AlignControls中包含的控件触发

OnResize
即使在以下情况下也会激发:。。。没有实际调整大小,控件被移动。这是故意的吗

对。“调整大小”不一定仅表示大小更改,而是表示定义其大小的任何属性的更改,即:左、上、宽和高

tgraphic控件是否会


您的问题意味着您正在设计自己的
tgraphic控件
后代。然后,您不仅应该发布已经存在的
OnResize
事件,还应该覆盖
Resize
方法,如和所述。

如果您正在寻找如何调整大小事件的方法,那么发布现成的
OnResize
事件是最佳选择。如果要在组件中实现一些额外的逻辑,请重写
Resize
方法。不用担心,即使
tgraphic控件
不是窗口控件,它的祖先
t控件
也会侦听许多消息。这是因为VCL通过
Perform
方法发送真实的系统消息(或模拟它们)。因此,即使使用
WM_WINDOWPOSCHANGED
的方法也可以,但它的级别太低了。@TLama,感谢您指出这一点!可能是@NGLN的副本,它不是直接的副本:我知道如何处理TCustomControl/TWinControl(网格控制)。我的迪莱玛完全可以控制。谢谢你的帮助!我忽略了OnResize受保护的事实。谢谢。是的,但如果要挑剔的话:左边,Top不定义“大小”。实际窗口具有不同的消息处理程序,用于调整大小/定位。只是说:)+1