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

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

Как узнать на каком Label кликнули мышью? [D5, WinXP]


Страницы:   1 2

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, чтобы понять чье событие


Страницы:   1 2

Наверх

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