Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.191.44.23] |
|
Страницы: (2) [1] 2 все ( Перейти к последнему сообщению ) |
Сообщ.
#1
,
|
|
|
Проблема: Нужно при помощи компонента как-то отловить сообщения посланные форме (например: сообщение максимизации).
|
Сообщ.
#2
,
|
|
|
Назначь свой обработчик WndProc формы. Только старый не забудь вызывать
|
Сообщ.
#3
,
|
|
|
Вся проблема в том, что компонент не знает какая форма его родительная...
|
Сообщ.
#4
,
|
|
|
Цитата HyperTerraSoft @ Вся проблема в том, что компонент не знает какая форма его родительная... У какой-же тогда формы ты будешь сообщения перехватывать? |
Сообщ.
#5
,
|
|
|
Я имею в виду, что компонент не знает имени формы, ее хендела...
|
Сообщ.
#6
,
|
|
|
Цитата HyperTerraSoft @ Я имею в виду, что компонент не знает имени формы, ее хендела... Ну что-то о ней известно? |
Сообщ.
#7
,
|
|
|
Цитата HyperTerraSoft @ Вся проблема в том, что компонент не знает какая форма его родительная... Если компонент невизуальный (наследник TComponent), то по Owner'у (это всегда будет форма, на которой лежит компонент). Если визуальный, то перебирать паренты до достижения nil или TForm. |
Сообщ.
#8
,
|
|
|
В желаемом компоненте, я не указываю в поле uses юнит формы. И из-за этого не могу отловить сообщения посланные родительной форме. Если кто-то может помочь исходником с самым минимумом - буду благодарен (никогда не забуду ).
|
Сообщ.
#9
,
|
|
|
Цитата HyperTerraSoft @ В желаемом компоненте, я не указываю в поле uses юнит формы. Ну так используй. Зачем другие извращения? |
Сообщ.
#10
,
|
|
|
Проблема в том, что форма получает сообщения раньше, чем компонент.
|
Сообщ.
#11
,
|
|
|
Цитата HyperTerraSoft @ Проблема в том, что форма получает сообщения раньше, чем компонент. Ну так ответ в Сообщ. #2 от 11.11.05, 23:53 |
Сообщ.
#12
,
|
|
|
Цитата HyperTerraSoft @ Проблема в том, что форма получает сообщения раньше, чем компонент. Если ты будешь перехватывать WndProc, то компонент будет получать сообщения раньше, чем форма |
Сообщ.
#13
,
|
|
|
А как это сделать ? s-mike, если можно коротенький исходник юнита, который не имеет никаго отношения к форме, но отлавливает хоть какое-то ее сообщение.
|
Сообщ.
#14
,
|
|
|
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs; type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} type TFormProcCatch = class(TComponent) private OldWndProc: TWndMethod; procedure NewWndProc(var Message: TMessage); public constructor Create(AOwner: TComponent); override; destructor Destroy; override; end; { TFormProcCatch } constructor TFormProcCatch.Create(AOwner: TComponent); begin inherited; if AOwner is TCustomForm then begin OldWndProc := TCustomForm(AOwner).WindowProc; TCustomForm(AOwner).WindowProc := NewWndProc; end; end; destructor TFormProcCatch.Destroy; begin if Owner is TCustomForm then TCustomForm(Owner).WindowProc := OldWndProc; inherited; end; procedure TFormProcCatch.NewWndProc(var Message: TMessage); begin if (Message.Msg = WM_WINDOWPOSCHANGING) and (Owner is TForm) then with TWMWindowPosMsg(Message) do TForm(Owner).Caption := Format('X: %d, Y: %d', [WindowPos.x, WindowPos.y]); if Assigned(OldWndProc) then OldWndProc(Message); end; procedure TForm1.FormCreate(Sender: TObject); begin TFormProcCatch.Create(Self); end; end. |
Сообщ.
#15
,
|
|
|
Цитата HyperTerraSoft @ Я имею в виду, что компонент не знает имени формы, ее хендела... 1. Этого не может быть. Компонент всегда знает предка и владельца... 2. Написание компонента который ограничивает возможности оригинальных классов - не есть правильно... |