![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
проблемка с обработкой WM_SIZE на компоненте [D6, Win2k]
Андрусь © (2002-07-17 13:42:00)Привет всем! Тут такая проблемка: нужно ловить на компоненте WM_SIZE, кроме случая создания компонента. Такой код:
Procedure TCDSPanel.PanelResizeing(var Message: TWMSize);
Begin
Inherited;
If /условие/ Then SizeChanged:=True;
End;
Посоветуйте условие,чтобы обрубать при создании компонента на форме. Проверял FormState,ComponentState - пусто.
Зараннее спасибо!
Андрусь (2002-07-17 18:29:00) [1]Я ж говорю-проблема решена-спасибо Eugene Lachinov ©,обработчик
написать в состоянии и сам - :-}
Неясность - в чем отличие срабатывания SetParent для компонента и если создаёшь как класс.Create.
Skier (2002-07-17 18:22:00) [2]>Андрусь
If HandleAllocated and FSettingsChanged Then begin
//панель уже создалась и показалась
//засунь сюда всё что угодно...
end; //if
В чём проблема-то ?
Андрусь (2002-07-17 18:15:00) [3]> Eugene Lachinov ©
Работает,нормально.
> Skier ©
Я же писал в начале,что кроме случая при создании - правда сейчас читаю легко по - другому понять. В чём отличие срабатывания SetParent.
Skier (2002-07-17 17:56:00) [4]>Андрусь
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.
Eugene Lachinov (2002-07-17 17:39:00) [5]Если вставить сброс SettingsChanged в CreateWnd; override;, то работает и если на форме, и если создавать динамически.
Skier (2002-07-17 17:35:00) [6]>Андрусь
Ё моё, что же ты сразу-то не сказал !
Заставил, нас парится, не хорошо это :)
Андрусь (2002-07-17 17:34:00) [7]Угу
Skier (2002-07-17 17:26:00) [8]>Андрусь
TCDSPanel сделана в как компонент что ли ?
Андрусь (2002-07-17 17:20:00) [9]Она на форме - та её создает
Skier (2002-07-17 17:15:00) [10]>Андрусь
И ещё как создаёшь...
Андрусь (2002-07-17 17:14:00) [11]Там всё просто...
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:02:00) [12]>Андрусь
Покажи код.
1) Класс панели
2) и как ты её создаёшь...
Андрусь (2002-07-17 16:56:00) [13]>Eugene Lachinov
Тогда всё пнятно. У тебя все сорсы открыты. Так наверное лучше.
Проще туда пути прописать с большим приоритетом.
Тут рядом со мной парни работают на микрософтовских системах - там стек разбирается вплоть до вызовов виндозных ф-й,что конечно не может не нравиться...
Андрусь (2002-07-17 16:51:00) [14]>Skier ©
Делал то же самое,но с ShowMessage - SetParent раньше
Извини,но не убедил. Лучше подскажи откуда SetParent вызывается-и для чего.
Eugene Lachinov (2002-07-17 16:50:00) [15]>Андрусь
У меня Controls.dcu удален из Delphi6\Lib, и Controls.pas доступен для компиляции, может в этом причина большего стека,
после удаления из Lib требуется перезапуск Delphi
Skier (2002-07-17 16:47:00) [16]>Андрусь
Я думаю это тебя убедит что раньше вызывается :
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;
Андрусь (2002-07-17 16:42:00) [17]> Eugene Lachinov
Как раз и пробую на одной форме. Но хочу видеть в стеке - поболе. А у меня чего-то всё ограничивается написанным мною.
> Skier
Согласен с замечанием - логика есть,но с другой стороны - смотрю под дебагером - 2 вызова SetParent до WM_Size. И где логика..
Eugene Lachinov (2002-07-17 16:32:00) [18]>Андрусь
А в проекте из одной формы это нельзя попробовать ?
Skier (2002-07-17 16:31:00) [19]>Андрусь
> где-то там inherited Create(AOwner);
Как это где-то там если Parent - это TWinControl, а
AOwner - это TComponent ?
Подумай...
Андрусь (2002-07-17 16:26:00) [20]>Eugene Lachinov ©
Подскажите,как посмотреть стек с хорошей вложенностью,а не ограничивающейся своими модулями.
>Skier ©
Откуда идёт вызов SetParent.
Скорее всего
constructor TCustomPanel.Create(AOwner: TComponent);
begin
где-то там inherited Create(AOwner);