|
Вопрос # 3 267/ вопрос открыт / |
|
Здравствуйте, уважаемые эксперты!
Помогите пожалуйста, решить проблему. В моей программе более 150 кнопок. Мне нужно определить (методом перехвата сообщений)
имя кнопки, нажатой пользователем. Имя должно определяться в виде строки. Также я хотел бы узнать как программно
нажать на кнопку в программе, имея её имя в качестве строки. Заранее благодарен.
 |
Вопрос задал: Free (статус: Посетитель)
Вопрос отправлен: 9 октября 2009, 16:35
Состояние вопроса: открыт, ответов: 1.
|
Ответ #1. Отвечает эксперт: ANBsoft
Здравствуйте, Pasha!
1)Определение имени нажатой кнопки: в событии OnClick TButton(Sender).Name
2)Нажатие нужной кнопки: TButton(FindComponent('NameButton')).Click
 |
Ответ отправил: ANBsoft (статус: Студент)
Время отправки: 9 октября 2009, 22:34
Оценка за ответ: 5
|
Мини-форум вопроса
Всего сообщений: 18; последнее сообщение — 22 октября 2009, 15:09; участников в обсуждении: 2.
|
Вадим К (статус: Академик), 9 октября 2009, 16:48 [#1]:
зачем 150 кнопок???? Только не говорите, что вы их ручками создали
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Free (статус: Посетитель), 9 октября 2009, 16:53 [#2]:
150 кнопок это я образно описал. Задача в том, чтобы ко множеству кнопок не писать своё OnClick (и на группу тоже), потому что их ОЧЕНЬ МНОГО, и у каждой уже своё "OnClick".
|
|
Вадим К (статус: Академик), 9 октября 2009, 16:57 [#3]:
Кнопки создаются статически или динамически?
И зачем сколько? обычно это признак плохого тона, если конечно это не аналог игры сапер.
и насколько "разные у них OnClick"?
решения просто есть, но надо уточнить, какое подойдет.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Free (статус: Посетитель), 10 октября 2009, 13:31 [#4]:
Зачем их сколько? Вы видели Microsoft Word 2007?. Именно такая лента используется и в моей программе, а на ней более 150 кнопок. Все кнопки создаются вручную при разработке. OnClick у них разные - у одних Action, у других простое OnClick. Нужно "улавливать" нажатия на них и записывать в файл.
|
|
Вадим К (статус: Академик), 10 октября 2009, 17:40 [#5]:
Ну учитывая, как часто я использую Windows, я не скоро увижу это чудо дизайна.
В целом, вначале рекомендую перейти полностью на Action. Смешивать Action и OnClick - плохо.
Но кажется я не сильно понял, что же надо сделать. Программа есть и хочется мониторить (логировать) нажатия?
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Free (статус: Посетитель), 12 октября 2009, 15:18 [#6]:
Несовсем, это нужно для добавления в мою программу автоматизации.
|
|
Free (статус: Посетитель), 16 октября 2009, 09:34 [#7]:
Хотелось бы добавить, что желательно эту "ловушку" организовать для всех форм приложения, и соответственно получать имя формы, на которой нажата кнопка. Кто-нибудь мне поможет?
|
|
Вадим К (статус: Академик), 16 октября 2009, 11:14 [#8]:
Я пока не понимаю, что точно хочется. как и где получать имя формы и так дальше. Думаю, остальные эксперты тоже. А если мы не можем понять, что Вы хотите - то мы и не можем помочь.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Free (статус: Посетитель), 16 октября 2009, 16:08 [#9]:
Пишу ещё раз.
Определить именя нажатой кнопки без использования в события OnClick.
|
|
Вадим К (статус: Академик), 16 октября 2009, 16:18 [#10]:
Думаю можно, но для вас будет достаточно сложным реализовать.
вариант а)
написать своего наследника от кнопки. тогда все решается тривиально.
вариант б)
вклиниться в цикл обработки сообщений. без подготовки лучше не делать.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Free (статус: Посетитель), 16 октября 2009, 16:29 [#11]:
Написать своего наследника от кнопки, значит переделать мне всю программу. А как же цикл обработки сообщений? Нельзя ли просто сделать перехватчик?
|
|
Вадим К (статус: Академик), 16 октября 2009, 16:47 [#12]:
можно попробовать так
private
procedure AppOnMessage(var Msg: TMsg; var Handled: Boolean);
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
var
FConnected: Boolean;
procedure TForm1.AppOnMessage(var Msg: TMsg; var Handled: Boolean);
begin
case Msg.Message of
WM_KEYFIRST..WM_KEYLAST, // Keyboard events
WM_MOUSEFIRST..WM_MOUSELAST: // Mouse events
Handled := True
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Application.OnMessage := AppOnMessage;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
Application.OnMessage := nil;
end;
То есть, сам факт клика будет перехвачен. Дальше можно с помощью апи функций по хендлу узнать имя. И главное - фильтровать, фильтровать.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Free (статус: Посетитель), 19 октября 2009, 15:46 [#13]:
Это несовсем то, что мне нужно. Мне то нужно узнать ИМЯ, а как перехватить сообщение я знаю.
|
|
Free (статус: Посетитель), 19 октября 2009, 15:53 [#14]:
Это не совсем то, что мне нужно. Мне нужна сама функция определения имени.
|
|
Вадим К (статус: Академик), 19 октября 2009, 16:08 [#15]:
а кто мешает составить табличку имя-хендл? Хотя надо порыться в дебрях vcl кода, думаю там уже давно есть.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Free (статус: Посетитель), 21 октября 2009, 09:30 [#16]:
А не могли бы вы написать мне адрес странички, где подробно описаны "дебри" vcl?
|
|
Вадим К (статус: Академик), 21 октября 2009, 20:48 [#17]:
Нет такой странички и вряд ли она будет.
Но если делфи полная - то там есть все исходники - можно читать.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Free (статус: Посетитель), 22 октября 2009, 15:09 [#18]:
Ладно... Сам буду разбираться... Но всё равно спасибо!
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|