![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как узнать на каком Label кликнули мышью? [D5, WinXP]
denmin © (2004-07-21 10:52:00)Здравствуйте.
Есть форма, на ней висят Labelы русского и английского алфавита. Необходимо, при клике мышью на любом лейбле узнать какая буква и отфильтровать в таблице все записи начинающиеся на эту букву. Т.е. как на страничках в интернете, где на букву нажал, и перешел на названия с этой буквы. Просто не хочется на каждый лейбл вешат событе онклик. Заранее всем благодарен.
Sun bittern (2004-07-21 12:35:00) [1]Sandman25 © (21.07.04 12:28) [20]
Анонимщик © (21.07.04 12:28) [21]
Но почему то иногда попадаются личности с мнением на оборот :)
Анонимщик (2004-07-21 12:28:00) [2]Sun bittern
Неверно. На это есть не форум, а Дельфи.
Sandman25 (2004-07-21 12:28:00) [3][19] Sun bittern © (21.07.04 12:26)
Часто бывает, что вместо готового кода пишут RTFM и F1. И это правильно :)
Sun bittern (2004-07-21 12:26:00) [4]Sandman25 © (21.07.04 12:01) [18]
>> Согласен. Можно работать программистом, не зная о существовании сообщений, потоков и прочих семафоров :)
А зачем это знать. На это форум есть, вдруг готовое кинут ;)
Sandman25 (2004-07-21 12:01:00) [5][17] Анонимщик © (21.07.04 11:56)
Согласен. Можно работать программистом, не зная о существовании сообщений, потоков и прочих семафоров :)
Анонимщик (2004-07-21 11:56:00) [6]Тогда да. Но должен все равно сказать, что начинающих программировать в дельфи обработчики настолько сбивают с толку, что они вообще не понимают что к чему.
Sandman25 (2004-07-21 11:50:00) [7][15] Анонимщик © (21.07.04 11:49)
Это потому что мы на разных уровнях работаем, видимо. Я всего лишь разработчик клиентских приложений.
Анонимщик (2004-07-21 11:49:00) [8]Не надо. Для меня недостатков у обработчиков, вообще говоря, больше (но не в этом случае).
Sandman25 (2004-07-21 11:47:00) [9][13] Анонимщик © (21.07.04 11:45)
А я против. Надеюсь, не надо объяснять преимущества и недостатки обоих подходов.
Анонимщик (2004-07-21 11:45:00) [10]Ну, это к логике вопроса относится, а не к решению. то есть не ко мне.
А что касается того, чтобы отказаться от всех обработчиков и делать все в цикле выборки - так я даже за. А ты?
Sandman25 (2004-07-21 11:39:00) [11][11] Анонимщик © (21.07.04 11:36)
Ага, давайте откажемся от всех обработчиков и все будем делать в OnMessage...
Анонимщик (2004-07-21 11:36:00) [12]Если делать так, ка хочет автор вопроса, то нужно бросить на форму TApplicationEvents и в обработчике OnMessage написать:
procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
var Handled: Boolean);
var
i: Integer;
aP1, aP2: TPoint;
begin
if (Msg.message = WM_LBUTTONDOWN) and (Msg.hwnd = Form1.Handle) then
begin
for i := 0 to Form1.ControlCount - 1 do
begin
if Form1.Controls[i] is TLabel then
begin
aP1 := ClientToScreen(Point(Form1.Controls[i].Left, Form1.Controls[i].Top));
aP2 := ClientToScreen(Point(Form1.Controls[i].Left + Form1.Controls[i].Width, Form1.Controls[i].Top + Form1.Controls[i].Height));
if (Msg.pt.X >= aP1.X) and
(Msg.pt.X <= aP2.X) and
(Msg.pt.Y >= aP1.Y) and
(Msg.pt.Y <= aP2.Y) then
ShowMessage((Form1.Controls[i] as TLabel).Caption);
end;
end;
end;
Handled := false;
end;
Space Hunter (2004-07-21 11:26:00) [13]В OnClick:
if Sender is TLabel then begin
ch := TLabel(Sender).Caption;
// Получили кликнутую букву. Дальше фильтруй! ;)
...
end;
Sandman25 (2004-07-21 11:24:00) [14][8] Плохиш © (21.07.04 11:18)
Согласен. И tag тоже не нужен. Но я-то реагировал на [4], а не [0]
Плохиш (2004-07-21 11:18:00) [15]
> Sandman25 © (21.07.04 11:13) [7]
> [6] default © (21.07.04 11:10)
>
> Это понятно. Я писал о данном конкретном случае, когда весь
> обработчик состоит из одного большого case.
В данном конкретном случае [0] case вообще не нужен
Sandman25 (2004-07-21 11:13:00) [16][6] default © (21.07.04 11:10)
Это понятно. Я писал о данном конкретном случае, когда весь обработчик состоит из одного большого case.
default (2004-07-21 11:10:00) [17]Sandman25 © (21.07.04 11:05) [5]
серьёзно, если весомая часть кода выполняется для всех меток, остальная специфицируется
Sandman25 (2004-07-21 11:05:00) [18][4] Sun bittern © (21.07.04 11:02)
Вот в таких случаях нужно писать отдельныеобработчики для разных лабелов!!!
Несерьезно, если OnClick используется аналогично WndProc :)
Sun bittern (2004-07-21 11:02:00) [19]if Sender is TLabel then
case TLabel(Sender).Tag of
1:...;
2:...;
end;
Суслик (2004-07-21 11:01:00) [20]используй один обработчик для всех
а также используй sender, чтобы понять чье событие