Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.01.02;
Скачать: CL | DM;

Вниз

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

 
Zilog ©   (2004-12-16 14:58) [0]

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

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

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


 
Digitman ©   (2004-12-16 15:04) [1]

while PeekMessage(msg, somehandle, 0, 0, PM_REMOVE) do
 begin
   TranslateMessage(Msg);
   DispatchMessage(Msg);
 end;


 
Zilog ©   (2004-12-16 15:53) [2]

я так понимаю PeekMessage надо вызывать постоянно, на предмет проверки новых сообщений... мне это не совсем подходит.
Да и PM_REMOVE видимо следует, к тому же поменять на PM_NOREMOVE, чтобы не лишить окошко обрабатывать положенные ей месседжи.

А нет ли возможности переопределить обработку сообщений на себя? Чтобы процедура обработки вызывалась по мере появления новых сообщений.


 
Digitman ©   (2004-12-16 16:00) [3]

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


 
Суслик ©   (2004-12-16 16:00) [4]


> А нет ли возможности переопределить обработку сообщений
> на себя?

переопределить оконную функцию.


 
Zilog ©   (2004-12-16 16:05) [5]

>>ЧТО ТЕБЕ НАДОБНО, СТАРЧЕ ...

делаю компонент, который влияет на визуализацию окна.
Нужно обрабатывать сообщения, которые возникают к примеру при перемещении окна...


 
Zilog ©   (2004-12-16 16:08) [6]

>>ЧТО ТЕБЕ НАДОБНО, СТАРЧЕ ...

делаю компонент, который влияет на визуализацию окна.
Нужно обрабатывать сообщения, которые возникают к примеру при перемещении окна...


 
Digitman ©   (2004-12-16 16:18) [7]

SetWindowLong() - самое простое и очевидное решение.


 
Zilog ©   (2004-12-16 16:18) [8]

>>Digitman ©   (16.12.04 16:00) [3]
>>см. SetWindowLong() с параметром GWL_WNDPROC

GWL_WNDPROC - Sets a new address for the window procedure.

Получается SetWindowLong полностью переопределяет оконные функции?


 
Суслик ©   (2004-12-16 16:20) [9]


> Получается SetWindowLong полностью переопределяет оконные
> функции?

1 получи старое значене оконной функции
2 определи новую функцию. В случае если есть потребность вызова старой фнукции вызываешь.


 
Reindeer Moss Eater ©   (2004-12-16 16:20) [10]

Интересно, а как можно переопределить "неполностью"


 
Digitman ©   (2004-12-16 16:21) [11]


> Получается SetWindowLong полностью переопределяет оконные
> функции?


да.
с условиями, оговоренными в MSDN


 
Zilog ©   (2004-12-16 16:21) [12]

>>Reindeer Moss Eater ©

ну к примеру после обработки сообщений родной оконной процедурой, сообщения (необработанные) передавались мне :)
Или такое невозможно?


 
Суслик ©   (2004-12-16 16:23) [13]


>  [12] Zilog ©   (16.12.04 16:21)

наоборот делай...
ну в общем я написал уже выше


 
Zilog ©   (2004-12-16 16:23) [14]

>Суслик ©   (16.12.04 16:20) [9]
>1 получи старое значене оконной функции

не намекнёте ли название функции?


 
Суслик ©   (2004-12-16 16:25) [15]


>  [14] Zilog ©   (16.12.04 16:23)

Неужели не догадаешься сам? :)))
Set на Get замени...


 
Digitman ©   (2004-12-16 16:30) [16]

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


 
Суслик ©   (2004-12-16 16:32) [17]

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


 
Zilog ©   (2004-12-16 16:32) [18]

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


 
Digitman ©   (2004-12-16 16:33) [19]

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


 
Zilog ©   (2004-12-16 16:34) [20]

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


 
Суслик ©   (2004-12-16 16:36) [21]

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


 
Zilog ©   (2004-12-16 16:39) [22]

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


 
Zilog ©   (2004-12-16 16:40) [23]

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


 
Zilog ©   (2004-12-16 16:42) [24]

непонимаю, что указывать в качестве нового параметра?

new address for the window procedure -

и как мне узнать адрес своей процедуры?


 
Суслик ©   (2004-12-16 16:44) [25]


>  [24] Zilog ©   (16.12.04 16:42)
> и как мне узнать адрес своей процедуры?

открываешь в модуле classes.pas тело фукнции AllocateHWnd и изучаешь содержимое, как модно тут говорить, до полного пресветления.


 
Digitman ©   (2004-12-16 16:48) [26]


> указание тобою на размеры моего мозга, явно тебе чети не
> делает


мне оно по поясу - твоя якобы оценка якобы моей якобы чести.


> что указывать в качестве нового параметра


адрес оконной ф-ции.


> как мне узнать адрес своей процедуры


для начала неполохо было бы НАПИСАТЬ самому эту ф-цию.
и потом уе рассуждать, кто кому какую честь делает или не делает.

справка, сударь, дана для чтения, анализа и последующих действий по образу и подобию !  а не для "щоб було".


 
Суслик ©   (2004-12-16 16:51) [27]

Вечная тема - спецы и новички-торопыги :)))


> [26] Digitman ©   (16.12.04 16:48)


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

Имхо.


 
Digitman ©   (2004-12-16 16:55) [28]


> Собственно вопрос о том, как из метода сделать оконную функцию
>


не согласен.
в вопросе об это нет ни слова.
более того - нет и не может быть никаких сообщений, адресованных форме, ибо Win32, сам понимаешь, знать не знает ни о каких бы то там ни было формах : там есть "окна" и не более того. А применительно к "окнам" есть и соотв. Win32API-ф-ции , о которых было и конкретные упомимнание и намеки.


 
Digitman ©   (2004-12-16 16:58) [29]


> сообщения некого окна


> сообщения адресованные форме


пока не будет четкого понимания соответствия и взаимосвязи этих терминов, механизмов, реализаций - реакция моя будет всегда одна и та же.


 
Суслик ©   (2004-12-16 17:01) [30]

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


 
Zilog ©   (2004-12-16 21:04) [31]

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


 
Anatoly Podgoretsky ©   (2004-12-16 21:34) [32]

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


 
Zilog ©   (2004-12-16 21:39) [33]

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


 
Gero ©   (2004-12-16 22:27) [34]

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


 
Verg ©   (2004-12-16 22:30) [35]

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


 
Gero ©   (2004-12-16 22:34) [36]

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


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

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


 
Zilog ©   (2004-12-17 15:17) [38]

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

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


 
Digitman ©   (2004-12-17 15:25) [39]


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


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


цитирую :


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


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

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

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

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


 
Zilog ©   (2004-12-17 15:41) [40]

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

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

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


 
Alexander Panov ©   (2004-12-17 15:50) [41]

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

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


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

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

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


 
Zilog ©   (2004-12-17 15:53) [42]

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

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


 
Digitman ©   (2004-12-17 15:55) [43]


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


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


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

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

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

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

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

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

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

продолжить ?


 
Alexander Panov ©   (2004-12-17 16:06) [44]

Zilog ©   (17.12.04 15:53) [42]

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

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


 
Zilog ©   (2004-12-17 16:15) [45]

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

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

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

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

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

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


 
Digitman ©   (2004-12-17 16:31) [46]


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


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

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

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


 
Alexander Panov ©   (2004-12-17 16:38) [47]

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.


 
Zilog ©   (2004-12-17 17:11) [48]

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


 
Alexander Panov ©   (2004-12-17 17:13) [49]

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


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


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

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


 
Zilog ©   (2004-12-17 17:34) [51]

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

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


 
Digitman ©   (2004-12-17 17:36) [52]


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


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

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


 
Zilog ©   (2004-12-17 17:40) [53]

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

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


 
Verg ©   (2004-12-17 17:47) [54]


> Zilog ©   (17.12.04 17:11) [48]
> ну, тут создается экземпляр класса TWinControl,


Где? Место, строчку покажи где.


 
Суслик ©   (2004-12-17 17:48) [55]

Господа, не игнорируйте, пжлст, мой вопрос [50] про очередь сообщений окна.


 
Zilog ©   (2004-12-17 17:59) [56]

>>Verg ©   (17.12.04 17:47) [54]

я имел ввиду предок у него TWinControl,

>>Суслик ©   (17.12.04 17:20) [50]
эээ... подозреваю что оконная процедура совсем не очередь, она всего лишь обрабатывает :)


 
Суслик ©   (2004-12-17 18:04) [57]


> эээ... подозреваю что оконная процедура совсем не очередь,
> она всего лишь обрабатывает :)

я тоже всегда так думал, но кто-то тут сказал обратное.
Может я что-то пропустил? Потому и спрашиваю.


 
Digitman ©   (2004-12-17 18:10) [58]


> Суслик ©   (17.12.04 17:48) [55]


в [50] ты прав на все 100


 
Суслик ©   (2004-12-17 18:12) [59]


>  [58] Digitman ©   (17.12.04 18:10)

Вот спасибо, а то я подумал, что МСДН паленая у меня :)))


 
Verg ©   (2004-12-17 18:18) [60]


> Zilog ©   (17.12.04 17:59) [56]
> >>Verg ©   (17.12.04 17:47) [54]
>
> я имел ввиду предок у него TWinControl,


У кого?


 
Digitman ©   (2004-12-17 18:20) [61]


> Zilog ©   (17.12.04 17:59) [56]


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

ЧТО здесь непонятно ?


 
Игорь Шевченко ©   (2004-12-17 18:27) [62]

Тейксера с Пачеко такой компонент уже разработали. Если не хочется наступать на грабли и винить в граблях отвечающих, то рекомендую найти их книжку - Delphi 5, руководство разработчика. Хотя бы на сайте www.podgoretsky.com


 
Zilog ©   (2004-12-17 18:51) [63]

>>Digitman ©   (17.12.04 18:20) [61]

волен иметь - это значит не факт что имеет?
к тому же, повоторяю, мне не нужны собственные сообщения.

>>Игорь Шевченко ©   (17.12.04 18:27) [62]
он у меня распечатан, и я периодически в него заглядываю. И хочу сделать сам, а не просто передрать. Иначе хрен чему научишься..


 
Суслик ©   (2004-12-17 18:58) [64]


>  И хочу сделать сам, а не просто передрать. Иначе хрен чему
> научишься..


Ах я бедный, у Фихтенгольца передирал. Нет бы сам теоремы доказывать научился. Блин, несчастный я...

:)))

Ты сообще, автор, чего хочешь. Все ты читал, все знаешь, все приемы тебе известны а что хочешь не ясно.

:(


 
Alexander Panov ©   (2004-12-17 19:01) [65]

>Суслик ©

Спасибо за поправку насчет "очереди сообщений у окна".
Конечно же, у процесса либо потока.


 
Zilog ©   (2004-12-17 19:16) [66]

Суслик ©   (17.12.04 18:58) [64]
да ничего уже не хочу, я уже давно [38] нашел то что искал.

>>Все ты читал, все знаешь, все приемы тебе известны а что хочешь не ясно.

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


 
Leonid Troyanovsky ©   (2004-12-17 22:46) [67]

> Суслик ©   (17.12.04 17:48) [55]
> Господа, не игнорируйте, пжлст, мой вопрос [50] про очередь
> сообщений окна.


Очередей сообщений у потока не одна, а целых несколько:
синхронных (sended-message queue),
асинхронных(posted-message queue),
ответных (reply-message queue),
виртуальной очереди ввода (virtualized input queue).

Подробности у Рихтера. Ну, и в msdn можно найти.

--
С уважением, LVT.


 
GuAV ©   (2004-12-17 23:34) [68]

Alexander Panov ©   (17.12.04 19:01) [65]
Конечно же, у процесса либо потока.


А есть ли она у процесса ? В прочем, не важно ;-)


 
Piter ©   (2004-12-18 00:25) [69]

Суслик ©   (17.12.04 17:20) [50]
А у окна разве бывает очередь сообщений?


нет, DispatchMessage вызывает оконную функцию сразу

Digitman ©   (17.12.04 18:10) [58]
в [50] ты прав на все 100


а Суслик молодец, он уже в [50] прав на все 100 :)
А в [100] он будет прав на все 200 :)

Суслик ©   (17.12.04 18:12) [59]
Вот спасибо, а то я подумал, что МСДН паленая у меня :)))


ага, у тебя перевод от Гоблина?

Leonid Troyanovsky ©   (17.12.04 22:46) [67]

говорили про очередь окна, а не потока :)

GuAV ©   (17.12.04 23:34) [68]
А есть ли она у процесса ?


нету. Имхо.


 
Игорь Шевченко ©   (2004-12-18 01:17) [70]

Zilog ©   (17.12.04 18:51) [63]


> он у меня распечатан, и я периодически в него заглядываю.
> И хочу сделать сам, а не просто передрать. Иначе хрен чему
> научишься


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


 
Alexander Panov ©   (2004-12-18 01:37) [71]

>GuAV ©   (17.12.04 23:34) [68]

Уг, согласен на все 100-) вот так иногда поторопишься и сядешь в лужу;)


 
KSergey ©   (2004-12-18 11:01) [72]

И все же мне было бы очень прелюбопытно устышать ответ автора на давно заданный вопрос:

> [60] Verg ©   (17.12.04 18:18)
> > Zilog ©   (17.12.04 17:59) [56]
> > я имел ввиду предок у него TWinControl,
>
> У кого?

А так - по-моему [47] Alexander Panov ©   (17.12.04 16:38) идейно как раз то, что надо подсказал.. Правда, проигнорированно, почему-то, было автором (как мне померещилось)...


 
Leonid Troyanovsky ©   (2004-12-18 12:58) [73]


> Leonid Troyanovsky ©   (17.12.04 22:46) [67]
> говорили про очередь окна, а не потока :)


Говорили:

> Господа, не игнорируйте, пжлст, мой вопрос [50] про очередь
> сообщений окна.
..
> А у окна разве бывает очередь сообщений?
> Я думал, что у потока она есть.


Я решил не игнорировать не только вопрос, но и утверждение.
Бо, с вопросом к тому времени уже разобрались.

--
С уважением, LVT.



Страницы: 1 2 вся ветка

Текущий архив: 2005.01.02;
Скачать: CL | DM;

Наверх




Память: 0.66 MB
Время: 0.063 c
1-1103060932
TTWW_Ant
2004-12-15 00:48
2005.01.02
Автоматическое заполнение HTML форм


3-1102361084
Fatal
2004-12-06 22:24
2005.01.02
Организация выбора из справочника!


1-1103181468
Black_Fury
2004-12-16 10:17
2005.01.02
Почему может не работать функция FileCreate( );


3-1101976169
Sholoma
2004-12-02 11:29
2005.01.02
MySQL


9-1093526452
Creep
2004-08-26 17:20
2005.01.02
OpenGL в 2D