Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.07.29;
Скачать: CL | DM;

Вниз

проблемка с обработкой 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);
begin
inherited SetParent(AParent);
SizeChanged := False
end;


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

>Eugene Lachinov ©
Спасибо и вам,но эта процедура отрабатывает 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]

>Eugene Lachinov ©
Подскажите,как посмотреть стек с хорошей вложенностью,а не ограничивающейся своими модулями.

>Skier ©
Откуда идёт вызов 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
Как раз и пробую на одной форме. Но хочу видеть в стеке - поболе. А у меня чего-то всё ограничивается написанным мною.
> Skier
Согласен с замечанием - логика есть,но с другой стороны - смотрю под дебагером - 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]

>Skier ©
Делал то же самое,но с 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 ©
Работает,нормально.
> Skier ©
Я же писал в начале,что кроме случая при создании - правда сейчас читаю легко по - другому понять. В чём отличие срабатывания 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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.03 c
1-95279
roman002
2002-07-17 11:21
2002.07.29
Сканирование дерева каталогов


6-95482
uncle_m16
2002-05-18 12:53
2002.07.29
подскажите пожалуста !!


3-95270
Vell S
2002-07-09 13:22
2002.07.29
BDE (paradox)


4-95623
Sheriff
2002-05-22 13:37
2002.07.29
Вывод графики в чужом окне.


3-95237
MikeP
2002-07-08 18:29
2002.07.29
TSocketConnection не завершается работа Windows