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

Вниз

Распознавание Sender   Найти похожие ветки 

 
mnj   (2009-04-14 13:35) [0]

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

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


 
Palladin ©   (2009-04-14 13:39) [1]

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


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


>  if Sender ? then


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


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


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


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


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


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

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


 
Palladin ©   (2009-04-14 15:25) [5]


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

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

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


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


 
Kolan ©   (2009-04-14 15:26) [6]

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

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


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


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


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


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


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

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


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

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


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


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


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


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

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


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

может так еще подойдет? не 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;


 
Palladin ©   (2009-04-15 09:22) [13]

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


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

12 ©   (15.04.09 09:13) [12]

Пеши исчо


 
12 ©   (2009-04-15 12:19) [15]

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



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

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

Наверх




Память: 0.5 MB
Время: 0.016 c
2-1239895427
Igor2010
2009-04-16 19:23
2009.05.31
WordApplication1-компонент


3-1215112673
Real
2008-07-03 23:17
2009.05.31
Open Office - Base


15-1238054110
oxffff
2009-03-26 10:55
2009.05.31
StreamSec Garbage Collector


2-1239808180
ksevelyar
2009-04-15 19:09
2009.05.31
Погрешность метода Рунге-Кутта


15-1237875001
Урсулапов_
2009-03-24 09:10
2009.05.31
Программа, которая распознает тип файла без расширения