![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Распознавание 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);