![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как отловить изменение размера владельца компонента? [D5, WinXP]
Нуину © (2006-03-16 22:07:00)Привет, мастера!
Пож. подскажите по теме.
К примеру, имею компонент TMyPanel унаследованный от TPanel, который лежит на TScrollBox и мне нужно непосредственно в TMyPanel отлавливать изменение размера владельца (TScrollBox). Надеюсь, что это возможно:)
Весь и-нет перерыл, но увы.
Нуину (2006-03-17 22:15:00) [1]Нет, не так. При изменении размера формы мышью условие
if (Msg.hwnd = Parent.Handle) and (Msg.message = WM_PAINT)не соблюдается:(
Нуину (2006-03-17 22:08:00) [2]Фух, кажется нашёл, как сделать.
type
TGrTxtPanel = class(TPanel)
private
AppEvent1: TApplicationEvents;
procedure SetPosition;
procedure AppEvent1OnMessage(var Msg: TMsg; var Handled: Boolean);
public
constructor Create(AOwner: TComponent); override;
end;
implementation
{ TGrTxtPanel }
constructor TGrTxtPanel.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
AppEvent1 := TApplicationEvents.Create(self);
AppEvent1.OnMessage := AppEvent1OnMessage;
end;
procedure TGrTxtPanel.AppEvent1OnMessage(var Msg: TMsg;
var Handled: Boolean);
begin
if Parent = nil then Exit;
if (Msg.hwnd = Parent.Handle) and (Msg.message = WM_PAINT) then
begin
SetPosition;
Handled := False;
end;
end;
Нуину (2006-03-17 19:49:00) [3]Спасибо за ответы, но - это решение в лоб. Первое, что я пытался использовать - Parent.OnResize, но из юнита моего TMyPanel свойства OnResize от Parent не видны. Anchors в моём случае не подходит - TMyPanel лежит на ScrollBox'е, у которого может влючаться прокрутка, если экземпляр TMyPanel больше самого ScrollBox, а если меньше, то панель должна находиться посередине ScrollBox'а.
Понятно, что ScrollBox может сам командовать, лежащей на нём панелью, но хотелось бы, что бы TMyPanel была полностью автономной, т.е., что бы из формы приложения можно было ограничиться только созданием экземпляра от TMyPanel и присвоением ему Parent и всё.
Я пытался и WndProc переписывать, и Application.OnMessage использовать, и перехватывать сообщение WM_SIZE, но ничего не получается, разумеется всё в юните для TMyPanel.
TUser (2006-03-17 08:48:00) [4]TMyPanel = class (TPanel)
private
FOldHandler: TNotifyEvent;
procedure ParentResizeHandler (Sender: TObject);
...
end;
FOldHandler:=Parent.OnResize;
Parent.OnResize = MyPanel.ParentResizeHandler;
procedure TMyPanel.ParentResizeHandler ();
begin
{ ... }
if assigned (FOldHandler) then
FOldHandler (Sender);
end;
Германн (2006-03-17 01:39:00) [5]
> Игорь Шевченко © (17.03.06 00:28) [1]
>
> А вообще, относительное расположение управляется свойством
> Anchors...
И во многих случаях Anchors вполне достаточно. Но увы не всегда. Тогда см. "procedure ParentResizeHandler (Sender: TObject);
Игорь Шевченко (2006-03-17 00:28:00) [6]Если грубо, то
type
TMyPanel = class (TPanel)
private
procedure ParentResizeHandler (Sender: TObject);
...
end;
Parent.OnResize = MyPanel.ParentResizeHandler;
А вообще, относительное расположение управляется свойством Anchors...