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

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

Как из своего класса обрабатывать сообщения некого окна? [D5, Win2k, WinXP]


Страницы:   1 2 3 4

Zilog ©   (2004-12-16 14:58:00) 

Как из своего класса обрабатывать сообщения некого окна?

есть у меня класс, возникла нужда обработать некоторые сообщения адресованные форме. В классе известен только handle этого окна.

Каким образом это можно сделать?


Zilog   (2004-12-17 17:40:00) [21]

>>Digitman ©   (17.12.04 17:36) [52]

да, но у меня нужды создавать свои окна нет.
компонет просто превращает форму, на которую его плюхнули в подобие панели MSOffice


Digitman   (2004-12-17 17:36:00) [22]


> уменя TComponent, у которого своей процедуры окна нету,
> био нет самого окна


методам класса TComponrnt никто и ничто не запрещает создавать окна и реализовывать соответствующие оконные ф-ции

что наглядно и продемонстрировано в ближайших же наследниках этого класса.


Zilog   (2004-12-17 17:34:00) [23]

>> Alexander Panov ©   (17.12.04 17:13) [49]
>>Так очередь сообщений может быть либо у окна, либо у потока.

а нафига мне очередь? мне сами сообщения нужны были.


Суслик   (2004-12-17 17:20:00) [24]

А у окна разве бывает очередь сообщений?
Я думал, что у потока она есть.


Alexander Panov   (2004-12-17 17:13:00) [25]

Zilog ©   (17.12.04 17:11) [48]
TComponent, у которого своей процедуры окна нету, био нет самого окна


Так очередь сообщений может быть либо у окна, либо у потока.


Zilog   (2004-12-17 17:11:00) [26]

ну, тут создается экземпляр класса TWinControl,
а уменя TComponent, у которого своей процедуры окна нету, био нет самого окна


Alexander Panov   (2004-12-17 16:38:00) [27]

Zilog ©   (17.12.04 16:15) [45]

Рискну предложить разобрать для примера такой код:

unit Unit1;

interface

uses
 Windows, Messages, Controls, Forms, StdCtrls, Classes;

type
 TForm1 = class(TForm)
   Button1: TButton;
   procedure Button1Click(Sender: TObject);
   procedure FormCreate(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

 TMsWndProc=class
 private
   FControl: TWinControl;
   FOldWinProc: TWndMethod;
 public
   constructor Create(Control: TWinControl);
   destructor Destroy; override;
   procedure WinProc(var Message: TMessage);
 end;

var
 Form1: TForm1;
 ms: TMsWndProc;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
 SendMessage(Form1.Handle,WM_USER,0,0);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 Ms := TMsWndProc.Create(Form1);
end;

constructor TMsWndProc.Create(Control: TWinControl);
begin
 inherited Create;
 FControl := Control;
 FOldWinProc := FControl.WindowProc;
 FCOntrol.WindowProc := WinProc;
end;

destructor TMsWndProc.Destroy;
begin
 FControl.WindowProc := FOldWinProc;
 inherited;
end;

procedure TMsWndProc.WinProc(var Message: TMessage);
begin
 if Message.Msg = WM_USER
   then MessageBox(0, '!','Warning',MB_OK)
   else FOldWinProc(Message);
end;

end.


Digitman   (2004-12-17 16:31:00) [28]


> как раз то что мне нужно... (в компоненте же я могу его
> использовать?)


не вижу явнообозначенной необходимости...

осн.трэд процесса, использующего VCL (и, как правило, объект TApplication), по дифолту стартует цикл ожидания/выборки/обработки/дисп-ции вин-сообщениий еще в самом dpr - в строчке Application.Run .. если ты не удалил и никак не "изуродовал" эту строчку, никаких забот по этому поводу у тебя быть не должно - любая  ок. ф-ция окна, созданного при вызове (в осн.трэде) любого из методов любых твоих классов, буддет автоматически вызвана.

если же окно было создано тобой в лоп.трэде, то ты сам ответственен за организацию такого цикла.


Zilog   (2004-12-17 16:15:00) [29]

>>Digitman ©   (17.12.04 15:55) [43]

ну если и далее это будет выражено в миролюбивом и не напрягающем тоне, то с большим удовольствием...

>>если тебе эти детали незнакомы,
знакомы, какие-то хорошо, какие-то в общих чертах.

>>Application.OnMessage имеет отношение только к сообщениям, адресованным окнам. созданным осн.трэдом процесса

как раз то что мне нужно... (в компоненте же я могу его использовать?)

>>Alexander Panov ©   (17.12.04 16:06) [44]
хочу написать невизуальный компонент, который бы превращал форму? окно? в подобие панели MOffice. В ходе разработки мне понадобилось обработать некоторые сообещния, которые адресуются окну.


Alexander Panov   (2004-12-17 16:06:00) [30]

Zilog ©   (17.12.04 15:53) [42]

А ты сейчас попробуй переформулировать вопрос.
Т.е. чтобы было понятно, чтоты хочешь сделать.

Просто есть подозрение, что тебе нужно немного не то, что ты сформулировал в топике...


Digitman   (2004-12-17 15:55:00) [31]


> Zilog ©   (17.12.04 15:41) [40]


> понимаю, что ты себя очень любишь


не более чем ты себя.

а если ты до сих пор не понял, то изволь понять : я преследую цель показать тебе направление к поиску инф-ции... той которая тебе нужна в решении задачи .. а намек - не самое худшее средство в этом ..

и если тебе дан намек, что

- каждый процесс может иметь более чем один трэд
- каждый трэд волен иметь свою индивидуальную очередь сообщений, в т.ч. сообщений окнам. им созданным
- обарботчик события Application.OnMessage имеет отношение только к сообщениям, адресованным окнам. созданным осн.трэдом процесса

значит, вопрос твой (в твоих же интересах) д.б. быть скорректирован для уточнения деталей, напрямую связанных с этими фактами

если тебе эти детали незнакомы, значит вопрос д.б. "откачен" до

- что такое процесс и трэд ?
- какова взаимосвязь процессов, трэдов, окон, очередей сообщений ?

продолжить ?


Zilog   (2004-12-17 15:53:00) [32]

>>Alexander Panov ©   (17.12.04 15:50) [41]

не возражаю, не всегда получается внятно сказать что хочется... будем стараться.


Alexander Panov   (2004-12-17 15:50:00) [33]

Zilog ©   (17.12.04 15:41) [40]
Почитай вопрос в топике:

Как из своего класса обрабатывать сообщения некого  окна?
есть у меня класс, возникла нужда обработать некоторые сообщения адресованные форме


Если бы ты сформулировал вопрос как следует, то тебе ответили в первом же постинге.

Ты определись, у тебя формы или окна, тогда и задавай вопрос, а не вводи всех остальных в заблуждение.

Окна - это окно Windows, а форма - это объект класса TForm.


Zilog   (2004-12-17 15:41:00) [34]

>>Digitman ©   (17.12.04 15:25) [39]
>>И у кого после этого "маразм", спрашивается ?

У тебя например.
Отсутствие достаточных знаний - не признак маразма.
А вот необьяснимое желание научить всех жить, указать каждому пальцем направление - как минимум повод задуматься.

Я конечно понимаю, что ты себя очень любишь, но не надо при каждом случае это показывать.


Digitman   (2004-12-17 15:25:00) [35]


> Zilog ©   (17.12.04 15:17) [38]


> сабж моржно сделать через
> Application.OnMessage


цитирую :


> из своего класса


TApplication - ТВОЙ класс ?!

И ты в вопросе, конечно же, ЯВНО упомянул, что твой класс создает окно в основном трэде процесса ?!

И у кого после этого "маразм", спрашивается ?

Уймись.
И садись за книжки.


Zilog   (2004-12-17 15:17:00) [36]

а сабж моржно сделать через
Application.OnMessage
без вышеописанного геморроя.

>>Fay ©   (17.12.04 05:32) [37]
Да, старческий маразм даёт о себе знать.


Fay   (2004-12-17 05:32:00) [37]

Весёлая ветка 8)


Gero   (2004-12-16 22:34:00) [38]

Удалено модератором


Verg   (2004-12-16 22:30:00) [39]

Удалено модератором


Gero   (2004-12-16 22:27:00) [40]

Удалено модератором


Страницы:   1 2 3 4

Наверх

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