Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 3 267

Раздел: Delphi » Прочее
/ вопрос открыт /

Здравствуйте, уважаемые эксперты!
Помогите пожалуйста, решить проблему. В моей программе более 150 кнопок. Мне нужно определить (методом перехвата сообщений)
имя кнопки, нажатой пользователем. Имя должно определяться в виде строки. Также я хотел бы узнать как программно
нажать на кнопку в программе, имея её имя в качестве строки. Заранее благодарен.

Free Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: 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

Free (статус: Посетитель), 9 октября 2009, 16:53 [#2]:

150 кнопок это я образно описал. Задача в том, чтобы ко множеству кнопок не писать своё OnClick (и на группу тоже), потому что их ОЧЕНЬ МНОГО, и у каждой уже своё "OnClick".
Вадим К

Вадим К (статус: Академик), 9 октября 2009, 16:57 [#3]:

Кнопки создаются статически или динамически?
И зачем сколько? обычно это признак плохого тона, если конечно это не аналог игры сапер.
и насколько "разные у них OnClick"?
решения просто есть, но надо уточнить, какое подойдет.
Галочка "подтверждения прочтения" - вселенское зло.
Free

Free (статус: Посетитель), 10 октября 2009, 13:31 [#4]:

Зачем их сколько? Вы видели Microsoft Word 2007?. Именно такая лента используется и в моей программе, а на ней более 150 кнопок. Все кнопки создаются вручную при разработке. OnClick у них разные - у одних Action, у других простое OnClick. Нужно "улавливать" нажатия на них и записывать в файл.
Вадим К

Вадим К (статус: Академик), 10 октября 2009, 17:40 [#5]:

Ну учитывая, как часто я использую Windows, я не скоро увижу это чудо дизайна.
В целом, вначале рекомендую перейти полностью на Action. Смешивать Action и OnClick - плохо.

Но кажется я не сильно понял, что же надо сделать. Программа есть и хочется мониторить (логировать) нажатия?
Галочка "подтверждения прочтения" - вселенское зло.
Free

Free (статус: Посетитель), 12 октября 2009, 15:18 [#6]:

Несовсем, это нужно для добавления в мою программу автоматизации.
Free

Free (статус: Посетитель), 16 октября 2009, 09:34 [#7]:

Хотелось бы добавить, что желательно эту "ловушку" организовать для всех форм приложения, и соответственно получать имя формы, на которой нажата кнопка. Кто-нибудь мне поможет?
Вадим К

Вадим К (статус: Академик), 16 октября 2009, 11:14 [#8]:

Я пока не понимаю, что точно хочется. как и где получать имя формы и так дальше. Думаю, остальные эксперты тоже. А если мы не можем понять, что Вы хотите - то мы и не можем помочь.
Галочка "подтверждения прочтения" - вселенское зло.
Free

Free (статус: Посетитель), 16 октября 2009, 16:08 [#9]:

Пишу ещё раз.
Определить именя нажатой кнопки без использования в события OnClick.
Вадим К

Вадим К (статус: Академик), 16 октября 2009, 16:18 [#10]:

Думаю можно, но для вас будет достаточно сложным реализовать.
вариант а)
написать своего наследника от кнопки. тогда все решается тривиально.
вариант б)
вклиниться в цикл обработки сообщений. без подготовки лучше не делать.
Галочка "подтверждения прочтения" - вселенское зло.
Free

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

Free (статус: Посетитель), 19 октября 2009, 15:46 [#13]:

Это несовсем то, что мне нужно. Мне то нужно узнать ИМЯ, а как перехватить сообщение я знаю.
Free

Free (статус: Посетитель), 19 октября 2009, 15:53 [#14]:

Это не совсем то, что мне нужно. Мне нужна сама функция определения имени.
Вадим К

Вадим К (статус: Академик), 19 октября 2009, 16:08 [#15]:

а кто мешает составить табличку имя-хендл? Хотя надо порыться в дебрях vcl кода, думаю там уже давно есть.
Галочка "подтверждения прочтения" - вселенское зло.
Free

Free (статус: Посетитель), 21 октября 2009, 09:30 [#16]:

А не могли бы вы написать мне адрес странички, где подробно описаны "дебри" vcl?
Вадим К

Вадим К (статус: Академик), 21 октября 2009, 20:48 [#17]:

Нет такой странички и вряд ли она будет.
Но если делфи полная - то там есть все исходники - можно читать.
Галочка "подтверждения прочтения" - вселенское зло.
Free

Free (статус: Посетитель), 22 октября 2009, 15:09 [#18]:

Ладно... Сам буду разбираться... Но всё равно спасибо!

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:43
Выполнено за 0.03 сек.