![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как из своего класса обрабатывать сообщения некого окна? [D5, Win2k, WinXP]
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]Удалено модератором