Форум: "Основная";
Текущий архив: 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