gpt4 book ai didi

delphi - 我如何检测其他控件何时更改其边界?

转载 作者:行者123 更新时间:2023-12-03 15:06:16 25 4
gpt4 key购买 nike

我有一个自定义的TLabel,原则上可以将其附加到表单中的任何其他可视组件。该组件有一个属性position,它指示它将定位到附加控件的位置(左侧、上方等)。当附加相关控件并且组件根据 position 属性定位自身时,这种方法可以正常工作。

问题是我无法让组件检测到相关控件何时更改其边界,以便它可以正确地重新定位自身。我想这与 WMMoveWMResize 有关。如何让相关控件通知 TLabel 任何边界属性已更改?

最佳答案

只要控件的位置和/或尺寸发生变化,就会触发控件的 OnResize 事件。因此,一个简单的解决方案是在将标签附加到控件时为该事件分配一个处理程序,例如:

private
FControl: TControl;

// OnResize is protected in TControl so use an accessor class to reach it...
type
TControlAccess = class(TControl)
end;

procedure TMyLabel.Destroy;
begin
SetControl(nil);
inherited;
end;

procedure TMyLabel.SetControl(AControl: TControl);
begin
if FControl <> AControl then
begin
if FControl <> nil then
begin
TControlAccess(FControl).OnResize := nil;
FControl.RemoveFreeNotification(Self);
end;
FControl := AControl;
if FControl <> nil then
begin
FControl.FreeNotification(Self);
TControlAccess(FControl).OnResize := ControlResized;
end;
...
end;
end;

procedure TMyLabel.Notification(AComponent: TComponent; Operation: TOperation);
begin
inherited;
if (Operation = opRemove) and (AComponent = FControl) then
FControl := nil;
end;

procedure TMyLabel.ControlResized(Sender: TObject);
begin
// reposition as needed...
end;

当然,如果用户想要将自己的 OnResize 处理程序分配给控件,这会导致问题。

另一种方法是对控件的 WindowProc 属性进行子类化:

private
FControl: TControl;
FControlWndProc: TWndMethod;

procedure TMyLabel.Destroy;
begin
SetControl(nil);
inherited;
end;

procedure TMyLabel.SetControl(AControl: TControl);
begin
if FControl <> AControl then
begin
if FControl <> nil then
begin
FControl.WindowProc := FControlWndProc;
FControl.RemoveFreeNotification(Self);
end;
FControl := AControl;
if FControl <> nil then
begin
FControlWndProc := FControl.WindowProc;
FControl.WindowProc := ControlWndProc;
FControl.FreeNotification(Self);
end else
FControlWndProc := nil;
...
end;
end;

procedure TMyLabel.Notification(AComponent: TComponent; Operation: TOperation);
begin
inherited;
if (Operation = opRemove) and (AComponent = FControl) then
begin
FControl := nil;
FControlWndProc := nil;
end;
end;

procedure TMyLabel.ControlWndProc(var Message: TMessage);
begin
FControlWndProc(Message);
// now check for position/size messages and reposition as needed...
end;

关于delphi - 我如何检测其他控件何时更改其边界?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20597649/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com