Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

проблемка с обработкой WM_SIZE на компоненте [D6, Win2k]


Страницы:   1 2

Андрусь ©   (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);


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо