Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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);
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.51 MB
Время: 0.007 c
3-95236
grig
2002-07-08 15:49
2002.07.29
Как узнать, включены ли в TTable диапазоны (SetRange)


3-95224
Soft_solution
2002-07-05 04:18
2002.07.29
БД и Win98/Win200/XP


1-95427
id_privin
2002-07-16 14:55
2002.07.29
Глюк


3-95244
Alek_1
2002-07-06 02:27
2002.07.29
От BDE к ADO


14-95557
AlexLumpov
2002-07-03 21:50
2002.07.29
Как уменьшить rtl60.bpl





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский