主页
Top.Mail.Ru Yandeks.Metrika
论坛:“主要”;
当前存档:2002.07.29;
下载:[xml.tar.bz2];

向下

在组件上处理WM_SIZE的问题 找到类似的分支


Андрусь   (2002-07-17 13:42) [0]

大家好! 存在这样的问题:除了创建组件的情况外,您需要在组件上捕获WM_SIZE。 这样的代码:

Procedure TCDSPanel.PanelResizeing(var Message: TWMSize);
Begin
Inherited;
If /условие/ Then SizeChanged:=True;
End;

建议在表单上创建组件时要砍掉的条件。 已检查FormState,ComponentState-空。
提前谢谢!



Skier   (2002-07-17 13:47) [1]

>安德鲁斯
HandleAllocated(...)?



Андрусь   (2002-07-17 14:04) [2]

当然,谢谢,但是并不能保持稳定:-{



Eugene Lachinov   (2002-07-17 14:37) [3]

过程SetParent(AParent:TWinControl); 覆盖

程序TCDSPanel.SetParent(AParent:TWinControl);
开始
继承了SetParent(AParent);
SizeChanged:= False
结束;



Андрусь   (2002-07-17 15:14) [4]

>尤金·拉奇诺夫©
也谢谢您,但是此过程将2次计算为WM_SIZE ...



Skier   (2002-07-17 15:28) [5]

>安德鲁斯


TMyPanel = class(TPanel)
private
FParentWasSet : Boolean;
FSizeChanged : Boolean;
procedure WMSize(var Message: TWMSize); message WM_SIZE;
protected
procedure SetParent(AParent: TWinControl); override;
public
constructor Create(AOwner : TComponent); override;
end; //TMyPanel


{ TMyPanel }

constructor TMyPanel.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FSizeChanged := False;
FParentWasSet := False;
end;

procedure TMyPanel.SetParent(AParent: TWinControl);
begin
inherited SetParent(AParent);
FSizeChanged := False;
FParentWasSet := True;
end;

procedure TMyPanel.WMSize(var Message: TWMSize);
begin
inherited;
if HandleAllocated and FParentWasSet then FSizeChanged := True;
end;





Eugene Lachinov   (2002-07-17 15:30) [6]

这很奇怪,但是在我之后,请查看PanelResizeing时的Call Stack(var Message:TWMSize),也许您会发现一些合适的东西可以阻止初始化此标志



Андрусь   (2002-07-17 15:38) [7]

我不明白这一点-我是说SetParent在WM_SIZE之前触发。 而且第一个WM_SIZE的条件为true,但是有必要不要...
我不想那样做

constructor TMyPanel.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FSizeChanged := False;
WasFirstCall:=False;
end;

procedure TMyPanel.WMSize(var Message: TWMSize);
begin
inherited;
if WasFirstCall then FSizeChanged := True
else WasFirstCall:=True;
end;



Skier   (2002-07-17 15:43) [8]

>安德鲁斯

;
> SetParent在WM_SIZE之前触发。


废话!


看这里:


constructor TCustomPanel.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
ControlStyle := [csAcceptsControls, csCaptureMouse, csClickEvents,
csSetCaption, csOpaque, csDoubleClicks, csReplicatable];
Width := 185; //здесь
Height := 41; //и здесь...
FAlignment := taCenter;
BevelOuter := bvRaised;
BevelWidth := 1;
FBorderStyle := bsNone;
Color := clBtnFace;
FFullRepaint := True;
UseDockManager := True;
end



Андрусь   (2002-07-17 16:26) [9]

>尤金·拉奇诺夫©
告诉我如何查看具有良好嵌套且不限于其模块的堆栈。

>滑雪者©
SetParent调用从何而来。
最有可能的

constructor TCustomPanel.Create(AOwner: TComponent);
begin

где-то там inherited Create(AOwner);




Skier   (2002-07-17 16:31) [10]

>安德鲁斯

>在某个地方继承了Create(AOwner);


如果Parent是TWinControl,那它在哪里呢?
所有者是TComponent吗?

想想......



Eugene Lachinov   (2002-07-17 16:32) [11]

>安德鲁斯
在一个表单中的项目中,这不能尝试吗?



Андрусь   (2002-07-17 16:42) [12]

>尤金·拉奇诺夫(Eugene Lachinov)
只需尝试一种形式。 但是我想看看-也许。 对我来说,一切都限于我写的东西。
>滑雪者
我同意这个说法-有逻辑,但是另一方面-我在调试器下-将SetParent调用为WM_Size的2。 逻辑在哪里..



Skier   (2002-07-17 16:47) [13]

>安德鲁斯
我认为它将使您相信它早先被称为:



TMyPanel = class(TPanel)
private
FParentWasSet : Boolean;
FSizeChanged : Boolean;
procedure WMSize(var Message: TWMSize); message WM_SIZE;
protected
procedure SetParent(AParent: TWinControl); override;
public
constructor Create(AOwner : TComponent); override;
end; //TMyPanel


{ TMyPanel }

constructor TMyPanel.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FSizeChanged := False;
FParentWasSet := False;
end;

procedure TMyPanel.SetParent(AParent: TWinControl);
begin
inherited SetParent(AParent);
WriteLn("SetParent");
FSizeChanged := False;
FParentWasSet := True;
end;

procedure TMyPanel.WMSize(var Message: TWMSize);
begin
inherited;
WriteLn("WMSize");
if HandleAllocated and FParentWasSet then FSizeChanged := True;
end;



Eugene Lachinov   (2002-07-17 16:50) [14]

>安德鲁斯
我从Delphi6 \ Lib中删除了Controls.dcu,并且Controls.pas可用于编译,也许这是堆栈较大的原因,
从Lib中删除后,需要重新启动Delphi



Андрусь   (2002-07-17 16:51) [15]

>滑雪者©
做了同样的事情,但是用ShowMessage-SetParent之前
对不起,但不相信。 最好告诉我从何处调用SetParent以及调用什么。



Андрусь   (2002-07-17 16:56) [16]

> Eugene Lachinov
然后发现了一切。 您有各种各样的机会。 那可能更好。
优先注册具有较高优先级的方式。
在我旁边,伙计们在Microsoft系统上工作-在那里解析堆栈,直到第v个调用为止,当然不能,但是请...



Skier   (2002-07-17 17:02) [17]

>安德鲁斯
显示代码。
1)面板类
2)以及如何创建它...



Андрусь   (2002-07-17 17:14) [18]

那里的一切都很简单...

type
TCDSPanel = class(TPanel)
private
{ Private declarations }
SettingsChanged:Boolean;
procedure PanelResizeing(var Message: TWMSize);message WM_SIZE;
procedure SetParent(AParent: TWinControl);override;
protected
{ Protected declarations }
public
{ Public declarations }
constructor Create(AOwner: TComponent); override;
published
{ Published declarations }
end;

implementation

constructor TCDSPanel.Create(AOwner: TComponent);
Begin
Inherited Create(AOwner);
// SettingsChanged:=False;
End;

procedure TCDSPanel.PanelResizeing(var Message: TWMSize);
Begin
Inherited;
If Self.HandleAllocated Then showMessage("WM_Size")
Else showMessage("WM_Size")
// SettingsChanged:=True;

End;


procedure TCDSPanel.SetParent(AParent: TWinControl);
begin
inherited SetParent(AParent);
// SizeChanged := False;
showMessage("setParent");

end;




Skier   (2002-07-17 17:15) [19]

>安德鲁斯
以及如何创建...



Андрусь   (2002-07-17 17:20) [20]

她在形式上-她创造了自己



Skier   (2002-07-17 17:26) [21]

>安德鲁斯
TCDSPanel是作为组件制造的吗?



Андрусь   (2002-07-17 17:34) [22]

雨果



Skier   (2002-07-17 17:35) [23]

>安德鲁斯
哦,天哪,你没说什么!
让我so翔,不好:)



Eugene Lachinov   (2002-07-17 17:39) [24]

如果将SettingsChanged重置插入到CreateWnd中; 覆盖;,那么它既可以在窗体上运行,也可以在动态创建时运行。



Skier   (2002-07-17 17:56) [25]

>安德鲁斯


unit CDSPanel;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls;

type

TCDSPanel = class(TPanel)
private
{ Private declarations }
FSizeChanged : Boolean;
FSettingsChanged : Boolean;
procedure PanelResizeing(var Message: TWMSize);message WM_SIZE;
protected
{ Protected declarations }
procedure CreateWnd; override;
public
{ Public declarations }
constructor Create(AOwner: TComponent); override;
published
{ Published declarations }
end;



procedure Register;

implementation

procedure Register;
begin
RegisterComponents("Samples", [TCDSPanel]);
end;

{ TCDSPanel }

constructor TCDSPanel.Create(AOwner: TComponent);
Begin
Inherited Create(AOwner);
FSettingsChanged := False;
FSizeChanged := False;
End;

procedure TCDSPanel.CreateWnd;
begin
inherited CreateWnd;
FSettingsChanged := True;
end;

procedure TCDSPanel.PanelResizeing(var Message: TWMSize);
Begin
Inherited;
If HandleAllocated and FSettingsChanged Then begin
if not FSizeChanged then FSizeChanged := True;
end; //if
End;



end.



Андрусь   (2002-07-17 18:15) [26]

>尤金·拉奇诺夫©
它工作正常。
>滑雪者©
我在一开始就写道,除了创造的情况外,事实是,现在我读起来很容易以不同的方式理解它。 触发SetParent有什么区别。



Skier   (2002-07-17 18:22) [27]

>安德鲁斯


If HandleAllocated and FSettingsChanged Then begin
//панель уже создалась и показалась
//засунь сюда всё что угодно...
end; //if


怎么了



Андрусь   (2002-07-17 18:29) [28]

好吧,我说,问题已经解决了,谢谢Eugene Lachinov©,处理程序
用一种状态写我自己-:-}
困惑-组件的SetParent触发与您将其作为类创建时有什么区别。



Страницы: 1 整个分支

论坛:“主要”;
当前存档:2002.07.29;
下载:[xml.tar.bz2];

楼上





内存:0.64 MB
时间:0.041 c
1-95422
阿里巴巴
2002-07-16 15:12
2002.07.29
自己的类型


6-95476
色狼
2002-05-16 18:52
2002.07.29
从服务器获取文件


1-95337
Victor n golutvin
2002-07-17 15:36
2002.07.29
德尔福6。 INDY - 工具。 怎么???


8-95461
谢尔盖萨夫
2002-03-21 12:15
2002.07.29
救命啊! !


4-95599
德米特里谢诺克
2002-05-20 14:51
2002.07.29
如何确定窗口句柄的状态?





南非荷兰语 阿尔巴尼亚人 阿拉伯语 亚美尼亚 阿塞拜疆 巴斯克 白俄罗斯 保加利亚语 加泰罗尼亚 简体中文 中国(繁体) 克罗地亚 捷克 丹麦语 荷兰人 英语 爱沙尼亚语 菲律宾人 芬兰 法语
加利亚西语 格鲁吉亚语 德语 希腊语 海地克里奥尔语 希伯来语 印地语 匈牙利 北日耳曼语 印度尼西亚人 爱尔兰语 意大利语 日本 韩语 拉脱维亚 立陶宛 马其顿 马来语 马耳他语 挪威语
波斯语 波兰语 葡萄牙语 罗马尼亚 俄语 塞尔维亚 斯洛伐克 斯洛文尼亚 西班牙语 斯瓦希里 瑞典语 泰国人 土耳其 乌克兰 乌尔都语 越南人 威尔士语 意第绪语 孟加拉 波斯尼亚
宿务 世界语 古吉拉特语 豪萨语 苗族 伊博 爪哇 卡纳达语 高棉 老挝 拉丁语 毛利 马拉 蒙古人 尼泊尔 旁遮普 索马里 淡米尔文 泰卢固语 约鲁巴语
祖鲁
英文 Французский Немецкий Итальянский Португальский 俄文 Испанский