Показать сообщение отдельно
  #2  
Старый 28.05.2009, 10:15
Grunch Grunch вне форума
Новичок
 
Регистрация: 08.04.2008
Адрес: Краснодар
Сообщения: 52
Репутация: 10
По умолчанию

Если в чем-то не прав, надеюсь меня поправят, но по-моему все выглядит так:
В винде инициатором почти любых действий являются сообщения "Message"ы. Вот тут:
Код:
const
  WM_CLICKBN=WM_USER+1;
мы определяем собственный идентификатор для сообщения.
Здесь:
Код:
public
    procedure ButtonClick(Sender: TObject);
    procedure WMCLICKBN(var M: TMessage); message WM_CLICKBN;
Определяем обработчик клика на кнопку и обработчик сообщения. Именно procedure WMCLICKBN будет вызываться когда приложению придет сообщение с идентификатором WM_CLICKBN.
Собственно, единственное что делает
Код:
procedure TForm1.ButtonClick(Sender: TObject);
begin
  PostMessage(Form1.Handle,WM_CLICKBN,Integer(Sender),0);
end;
это посылает окну Form1 сообщение WM_CLICKBN с параметрами integer(Sender) (он будет доступен как wParam) и 0 (он как lParam).
Когда окно получает сообщение WM_CLICKBN, вызывается процедура WMCLICKBN которая, вроде, делает следующее:
Код:
bn := TButton(M.WParam);
if not (bn is TButton) then Exit;
здесь тот самый wParam рассматривается как TButton и если он не TButton, то обработка заканчивается.
Дальше, судя по всему, имеется некий массив BA с кнопками, который мы просматриваем в поисках той самой кнопки нажатие на которую инициировало посылку сообщения WM_CLICKBN. После чего весь хвост массива после найденной кнопки сдвигается влево на одну позицию (соответственно затирая кнопку которую нажали)
Если я правильно понял, все это для удобного удаления в рантайме объектов созданных также в рантайме.
Ответить с цитированием