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

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

Распознавание Sender


mnj ©   (2009-04-14 13:35:00) 

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

procedure TfmMain.FormMouseUp(Sender: TObject; Button: TMouseButton;
 Shift: TShiftState; X, Y: Integer);
begin
       if Sender ? then
       begin
               .....
       end;
end;


12   (2009-04-15 12:19:00) [1]

не, ну чего вы сразу
написал на скорую руку, дабы воспроизвести действия..


Игорь Шевченко   (2009-04-15 11:19:00) [2]

12 ©   (15.04.09 09:13) [12]

Пеши исчо


Palladin   (2009-04-15 09:22:00) [3]

прям, найди 10 различий


12   (2009-04-15 09:13:00) [4]

может так еще подойдет? не rtti, конечно
просто вел лог, а то звонят, говорят что программа не того, а я такого повторить не могу, а спрашиваешь что делали - толком ничего не говорят

procedure TfrmMain.ApplicationEvents1Message(var Msg: tagMSG;  var Handled: Boolean);
var
PA:array[1..255] of char;
hwnd:tHandle;
s:string;
// i:integer;
// fMessage: TActionList2;
// Q:TdxFloatForm;
begin
{$IFDEF INLOG}
 case MSG.message of
   WM_LBUTTONDOWN,WM_RBUTTONDOWN:
   begin
     GetWindowText(GetForegroundWindow,@PA,255);
     WriteToLog(\\\'Верхнее окно текст \\\'+strpas(pansichar(@PA)));
     GetClassName(msg.hwnd,@PA,255);
     s:=\\\'Клик по окну класса: \\\'+strpas(pansichar(@PA));
     GetWindowText(MSG.hwnd,@PA,255);
     s:=s+\\\'(текст: \\\'+strpas(pansichar(@PA))+\\\')<BR>\\\';
     hwnd:=MSG.hwnd;
     while (GetParent(hwnd)<>0) do begin
        hwnd:=GetParent(hwnd);
        if GetWindowTextLength(hwnd)>1
         then begin
            GetClassName(hwnd,@PA,255);
            s:=s+\\\' подокно класса: \\\'+strpas(pansichar(@PA));
            GetWindowText(hwnd,@PA,255);
            s:=s+\\\'(текст: \\\'+strpas(pansichar(@PA))+\\\')<BR>\\\';
         end;
     end;
//       GetWindowModuleFileName(msg.hwnd,@PA,255);
//       s:=s+\\\' \\\'+ExtractFileName(strpas(pansichar(@PA)));
     WriteToLog(s);
   end;
   WM_CHAR:
   begin
     GetWindowText(GetForegroundWindow,@PA,255);
     WriteToLog(\\\'Верхнее окно текст \\\'+strpas(pansichar(@PA)));
     GetClassName(msg.hwnd,@PA,255);
     s:=\\\'Нажали кнопку \\\"\\\'+chr(msg.wParam)+\\\'\\\" в окне класса: \\\'+strpas(pansichar(@PA));
     GetWindowText(MSG.hwnd,@PA,255);
     s:=s+\\\'(текст: \\\'+strpas(pansichar(@PA))+\\\')<BR>\\\';
     hwnd:=MSG.hwnd;
     while (GetParent(hwnd)<>0) do
     begin
        hwnd:=GetParent(hwnd);
        if GetWindowTextLength(hwnd)>1 then
        begin
          GetClassName(hwnd,@PA,255);
          s:=s+\\\' подокно класса: \\\'+strpas(pansichar(@PA));
          GetWindowText(hwnd,@PA,255);
          s:=s+\\\'(текст: \\\'+strpas(pansichar(@PA))+\\\')<BR>\\\';
        end;
     end;
//       GetWindowModuleFileName(msg.hwnd,@PA,255);
//       s:=s+\\\' \\\'+ExtractFileName(strpas(pansichar(@PA)));
     WriteToLog(s);
   end;
 end; // case MSG.message of
{$ENDIF}
end;


mnj   (2009-04-14 23:30:00) [5]

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


Игорь Шевченко   (2009-04-14 16:59:00) [6]


> Спасибо, но у меня все-таки случай сложнее: отлавливать
> Sender кнопок, созданных runtime (массив кнопок, расположенных
> внутри groupbox на панели). OnMouseUp или OnClick работает
> только на незанятом кнопками или другим дочерним компонентом
> пространстве формы и senderом объявляет себя.


А можно немного пояснить ? А то не совсем понятно, что же все таки надо


mnj   (2009-04-14 16:57:00) [7]

Спасибо, но у меня все-таки случай сложнее: отлавливать Sender кнопок, созданных runtime (массив кнопок, расположенных внутри groupbox на панели). OnMouseUp или OnClick работает только на незанятом кнопками или другим дочерним компонентом пространстве формы и senderом объявляет себя. То же самое происходит и с панелью. Но мне нужно знать, какая в ней кнопка нажата.
результат пока никакой...


Анна   (2009-04-14 16:26:00) [8]


> Palladin ©   (14.04.09 15:25) [5]

Да ладно Вам.... Ошиблась. Наверное просто захотелось с кем-то словом перекинуться. Снег за окном валит не перставая сплошной стеной.


Игорь Шевченко   (2009-04-14 15:37:00) [9]


> не скорее всего, а именно только fmMain и будет sender-ом


нет, не только, но чаще всего именно fmMain


Kolan   (2009-04-14 15:26:00) [10]

Анна, таки скорее всего...

begin
 FormMouseUp(NotAfmMainObject, Button1, Shift, 100, 200);
end


Palladin   (2009-04-14 15:25:00) [11]


> Анна   (14.04.09 15:22) [4]

ух ты какие мы умные нарисовались :)

procedure TForm1.FormCreate(Sender: TObject);
begin
 Button1.OnMouseUp:=FormMouseUp;
end;


или ты никогда стрелочку вниз не нажимало при назначении события компонентам? :)


Анна   (2009-04-14 15:22:00) [12]


> Игорь Шевченко ©   (14.04.09 14:45) [3]

не скорее всего, а именно только fmMain и будет sender-ом


Игорь Шевченко   (2009-04-14 14:45:00) [13]


> procedure TfmMain.FormMouseUp(Sender: TObject; Button: TMouseButton;
>
>  Shift: TShiftState; X, Y: Integer);


у этой процедуры sender-ом будет скорее всего fmMain


Ega23   (2009-04-14 13:47:00) [14]


>  if Sender ? then


if Sender is TButton then
begin
 if TButton(Sender)=Button1 then
 begin
 
 end
 else
   .......
end
else
....


Palladin   (2009-04-14 13:39:00) [15]

With (Sender as TComponent) Do
 ShowMessage(Name+':'+ClassName);


Наверх

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