主页
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]

procedure SetParent(AParent: TWinControl); override;

procedure 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]

Странно, а у меня после, посмотри Call Stack на момент PanelResizeing(var Message: TWMSize), может найдешь что-нибудь подходящее, что можно перекрыть для инициализации этого флажка



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

Не понял смысла - я же говорю,что SetParent срабатывает до WM_SIZE. И условие на первый WM_SIZE будет тру,а надо бы нет...
Не хочется делать так

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]

>安德鲁斯

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


Как это где-то там если Parent - это TWinControl, а
AOwner - это TComponent ?

想想......



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

>安德鲁斯
А в проекте из одной формы это нельзя попробовать ?



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

> Eugene Lachinov
Как раз и пробую на одной форме. Но хочу видеть в стеке - поболе. А у меня чего-то всё ограничивается написанным мною.
>滑雪者
Согласен с замечанием - логика есть,но с другой стороны - смотрю под дебагером - 2 вызова SetParent до WM_Size. И где логика..



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]

>安德鲁斯
У меня Controls.dcu удален из Delphi6\Lib, и Controls.pas доступен для компиляции, может в этом причина большего стека,
после удаления из Lib требуется перезапуск Delphi



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

>滑雪者©
Делал то же самое,но с ShowMessage - SetParent раньше
Извини,но не убедил. Лучше подскажи откуда SetParent вызывается-и для чего.



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

> Eugene Lachinov
Тогда всё пнятно. У тебя все сорсы открыты. Так наверное лучше.
Проще туда пути прописать с большим приоритетом.
Тут рядом со мной парни работают на микрософтовских системах - там стек разбирается вплоть до вызовов виндозных ф-й,что конечно не может не нравиться...



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]

>安德鲁斯
Ё моё, что же ты сразу-то не сказал !
Заставил, нас парится, не хорошо это :)



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

Если вставить сброс SettingsChanged в CreateWnd; override;, то работает и если на форме, и если создавать динамически.



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]

> Eugene Lachinov ©
Работает,нормально.
>滑雪者©
Я же писал в начале,что кроме случая при создании - правда сейчас читаю легко по - другому понять. В чём отличие срабатывания 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 для компонента и если создаёшь как класс.Create.



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

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

楼上









内存:0.65 MB
时间:0.031 c
3-95234
Akhmadey
2002-07-08 21:04
2002.07.29
EhLib


14-95529
[NIKEL]
2002-07-03 00:30
2002.07.29
放松!


14-95568
变态
2002-07-03 18:23
2002.07.29
xolehlp.dll


14-95560
莱昂
2002-07-04 12:38
2002.07.29
扫描仪


1-95402
SDRAM
2002-07-16 11:19
2002.07.29
DBGrid中





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