怎样在组件中获取父窗体的事件?

hangguojun 2005-07-20 04:59:56
我要开发一个组件,希望组件能随父窗体的变化(比如:移动、大小等)而变化。

如何实现?
...全文
365 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
hangguojun 2005-07-28
  • 打赏
  • 举报
回复
明日散分
hangguojun 2005-07-27
  • 打赏
  • 举报
回复
To GoldParamer: Align可以,但是用它之后。我其他的控件对齐就不好解决了。

To gpg(snake): 捕获消息的问题其实没有彻底解决,正是因为增加了AParent,WndProc导致控件错误
GoldProgramer 2005-07-26
  • 打赏
  • 举报
回复
Align属性不行吗?
gpg 2005-07-26
  • 打赏
  • 举报
回复
关于捕获消息的问题已经解决了。楼主要考虑处理别的问题。
atsoftworld 2005-07-26
  • 打赏
  • 举报
回复
学习
hangguojun 2005-07-26
  • 打赏
  • 举报
回复
顶上去
hangguojun 2005-07-25
  • 打赏
  • 举报
回复
此贴很难!

难倒众人
hangguojun 2005-07-24
  • 打赏
  • 举报
回复
真的吗?不信!
阿呆_ 2005-07-23
  • 打赏
  • 举报
回复
hehe, 这么明显的出错地方都看不出来?

Hint: 请连续执行Parent := Form1两遍.
hangguojun 2005-07-23
  • 打赏
  • 举报
回复
有人会吗?
hangguojun 2005-07-22
  • 打赏
  • 举报
回复
谢谢,和我的想法一致
我原本想将你加的这一句写上去的。

启用这一句后,设计期是解决了,可是执行错误。

在ParentWndProc时出现错误:Stack overflow

为什么?
王集鹄 2005-07-22
  • 打赏
  • 举报
回复
procedure TTest.SetParent(AParent: TWinControl);
begin
inherited;
if csDesigning in ComponentState then Exit; //判断一下,在设计期间就不启用
if Assigned(AParent) then
begin
FParentWndMethod := AParent.WindowProc;
AParent.WindowProc := ParentWndProc;
end else FParentWndMethod := nil;
end;
hangguojun 2005-07-22
  • 打赏
  • 举报
回复
经测试,可以改变大小。
但是需自己修改父窗体的ClientWidth、ClientHeight。

还有一点:组件中修改了重载了父窗体的WindowProc,并以可视组件的形式放置到Form上时,造成Delphi突然关闭。

谁能帮助解决?
王集鹄 2005-07-22
  • 打赏
  • 举报
回复
//我测试了可以改变大小
procedure TTest.ParentWndProc(var Msg: TMessage);
begin
case Msg.Msg of
WM_WINDOWPOSCHANGED:
begin
Form1.Memo1.Lines.Add(
IntToStr(PWINDOWPOS(Msg.LParam).x) + ',' + IntToStr(PWINDOWPOS(Msg.LParam).y));
end;
end;
if Assigned(FParentWndMethod) then FParentWndMethod(Msg);
end;
//注意最后一条语句 //需要调用Parent原来的句柄处理方法
hangguojun 2005-07-21
  • 打赏
  • 举报
回复
我自己来提前
hangguojun 2005-07-21
  • 打赏
  • 举报
回复
感谢:zswang(伴水清清)(专家门诊清洁工)

这样可以截获父窗体信息WM_WINDOWPOSCHANGED,但是父窗体不能改变大小,而且将组件放到Form上时,Delphi突然无提示关闭(原来正常)。

不知何原因?
亮剑_ 2005-07-21
  • 打赏
  • 举报
回复
楼上的不错,可一试
王集鹄 2005-07-21
  • 打赏
  • 举报
回复
//参考如下代码
type
TTest = class(TControl)
private
FParentWndMethod: TWndMethod;
procedure ParentWndProc(var Msg: TMessage);
protected
procedure SetParent(AParent: TWinControl); override;
destructor Destroy; override;
end;

destructor TTest.Destroy;
begin
if Assigned(Parent) then
Parent.WindowProc := FParentWndMethod;
inherited;
end;

procedure TTest.ParentWndProc(var Msg: TMessage);
begin
case Msg.Msg of
WM_MOUSEMOVE:
begin
TForm1(Parent).Memo1.Lines.Add(
IntToStr(LOWORD(Msg.lParam)) + ',' + IntToStr(HIWORD(Msg.lParam))
);
end;
end;
if Assigned(FParentWndMethod) then FParentWndMethod(Msg);
end;

procedure TTest.SetParent(AParent: TWinControl);
begin
inherited;
if Assigned(AParent) then
begin
FParentWndMethod := AParent.WindowProc;
AParent.WindowProc := ParentWndProc;
end else FParentWndMethod := nil;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
with TTest.Create(Self) do
Parent := Self;
end;
hangguojun 2005-07-21
  • 打赏
  • 举报
回复
这样的问题很难吗?
hangguojun 2005-07-20
  • 打赏
  • 举报
回复
有人知道吗?
加载更多回复(2)

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧