Текущий архив: 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