| 
| 
 | Вопрос # 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]:Ладно... Сам буду разбираться... Но всё равно спасибо! |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |