На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! ПРАВИЛА РАЗДЕЛА · FAQ раздела Delphi · Книги по Delphi
Обязательно выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.

Этот раздел предназначен для вопросов, посвященных разработке компонентов, а также для тестирования собственных бесплатных компонентов с открытым исходным кодом.

Здесь запрещается:
1. Размещать ссылки на какие-либо коммерческие компоненты, реализующие требуемую функциональность.
2. Обсуждать и тестировать коммерческие компоненты или компоненты с закрытым кодом.
3. Давать ссылки на сайты с исходным кодом компонентов. Все тестируемые исходные коды должы быть размещены на сайте ИСХОДНИКИ.RU.
Модераторы: Rouse_, DimaBr
  
> Отлавливание сообщений для формы , Как при помощи компонента отловаить сообщения форм
    Проблема: Нужно при помощи компонента как-то отловить сообщения посланные форме (например: сообщение максимизации). :wall:
      Назначь свой обработчик WndProc формы. Только старый не забудь вызывать ;)
        Вся проблема в том, что компонент не знает какая форма его родительная...
          Цитата HyperTerraSoft @
          Вся проблема в том, что компонент не знает какая форма его родительная...


          У какой-же тогда формы ты будешь сообщения перехватывать?
            Я имею в виду, что компонент не знает имени формы, ее хендела...
              Цитата HyperTerraSoft @
              Я имею в виду, что компонент не знает имени формы, ее хендела...


              Ну что-то о ней известно?
                Цитата HyperTerraSoft @
                Вся проблема в том, что компонент не знает какая форма его родительная...

                Если компонент невизуальный (наследник TComponent), то по Owner'у (это всегда будет форма, на которой лежит компонент). Если визуальный, то перебирать паренты до достижения nil или TForm.
                  В желаемом компоненте, я не указываю в поле uses юнит формы. И из-за этого не могу отловить сообщения посланные родительной форме. Если кто-то может помочь исходником с самым минимумом - буду благодарен (никогда не забуду ;) ).
                    Цитата HyperTerraSoft @
                    В желаемом компоненте, я не указываю в поле uses юнит формы.

                    Ну так используй. Зачем другие извращения?
                      Проблема в том, что форма получает сообщения раньше, чем компонент.
                        Цитата HyperTerraSoft @
                        Проблема в том, что форма получает сообщения раньше, чем компонент.


                        Ну так ответ в Сообщ. #2 от 11.11.05, 23:53
                          Цитата HyperTerraSoft @
                          Проблема в том, что форма получает сообщения раньше, чем компонент.

                          Если ты будешь перехватывать WndProc, то компонент будет получать сообщения раньше, чем форма ;)
                            А как это сделать :wacko: ? s-mike, если можно коротенький исходник юнита, который не имеет никаго отношения к форме, но отлавливает хоть какое-то ее сообщение.
                              ExpandedWrap disabled
                                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.
                                Цитата HyperTerraSoft @
                                Я имею в виду, что компонент не знает имени формы, ее хендела...

                                1. Этого не может быть. Компонент всегда знает предка и владельца...
                                2. Написание компонента который ограничивает возможности оригинальных классов - не есть правильно...
                                  Цитата s-mike @
                                  Если компонент невизуальный (наследник TComponent), то по Owner'у (это всегда будет форма, на которой лежит компонент). Если визуальный, то перебирать паренты до достижения nil или TForm.

                                  Для визуальных компонентов Owner'ом точе всегда будет форма(если компоненты в дезигн тайм создаются). Другое дело, что иногда компоненты создаются в ран тайм и их владельцем назначается НЕ форма. Я бы сделал некое свойство DestForm: TCustomForm, чтобы конечный программист мог указать у какой формы конкретно он хочет перехватывать сообщения, а конструкторе компонента проверял бы
                                  ExpandedWrap disabled
                                    if Owner is TCustomForm then DestForm := TCustomForm(Owner);
                                    Цитата Rouse_ @
                                    2. Написание компонента который ограничивает возможности оригинальных классов - не есть правильно...

                                    Порой приходиться писать и такое...
                                    s-mike
                                    Большое шпасибо!
                                    0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                    0 пользователей:


                                    Рейтинг@Mail.ru
                                    [ Script execution time: 0,0554 ]   [ 16 queries used ]   [ Generated: 30.04.24, 12:10 GMT ]