Пользовательский номер и отправка конкретных номеров в активное текстовое поле - PullRequest
2 голосов
/ 27 января 2011

Я сделал собственную цифровую клавиатуру с цифрами. Это рамка и кнопки в ней. Я положил этот компонент на форму. Теперь я не знаю, как перехватить активный элемент управления в форме, а затем отправить номер, соответствующий кнопке, этому элементу управления.

Может кто-нибудь помочь мне, пожалуйста?

Ответы [ 3 ]

2 голосов
/ 27 января 2011

Самый простой способ IMO - также сохранить номер, являющийся заголовком кнопки, в свойстве тега кнопки.Затем вы можете использовать один и тот же обработчик событий для всех кнопок:

procedure TForm1.NumButtonClick(Sender: TObject);
var
  NumTyped: Integer;
begin
  NumTyped := TButton(Sender).Tag;
end;

Другой альтернативой является чтение заголовка в событии, но затем вам нужно выполнить преобразование из строки в целое число, которое прервется, есливы случайно назначаете кнопку без числового заголовка для обработчика событий:

procedure TForm1.NumButtonClick(Sender: TObject);
var
  NumTyped: Integer;
begin
  NumTyped := StrToInt(TButton(Sender).Caption);
end;

Обратите внимание, что таким образом вам не нужно заботиться о том, является ли ваш компонент ActiveControl или нет;вы просто назначаете обработчик событий каждой кнопке вашего компонента и ничего больше, а затем, если событие инициируется, вы знаете, что активным элементом управления является ваш компонент и какая из его кнопок была нажата.

РЕДАКТИРОВАТЬ: Исходя из комментария ниже, есть немного больше вопроса, чем кажется.

Если вы пытаетесь отправить номер в TEdit (ваше "текстовое поле"), у вас естьсделать пару других вещей.Во-первых, не используйте TButtons или TBitBtns, так как они получают фокус и отвлекают его от элемента управления «Редактировать».Вместо этого используйте TSpeedButton.Установите заголовок каждого, который вы хотите, на номер, который вы хотите поместить в TEdit.

Во-вторых, поскольку вы хотите поместить содержимое в TEdit, вам не нужно беспокоиться о теге.Установите обработчик события для всех TSpeedButtons на этот (который предполагает, что ваш TEdit - Edit1):

procedure TForm1.NumButtonClick(Sender: TObject);
begin
  Edit1.SelText := TSpeedButton(Sender).Caption;
end;

Это заменяет любой выбранный текст в TEdit Edit1 заголовком SpeedButton, или добавляет его втекущая позиция каретки (редактирования курсора) в TEdit.

Если вы хотите поместить его в любой из нескольких TEdits, небольшое изменение также с этим справится:

procedure TForm1.NumButtonClick(Sender: TObject);
begin
  if ActiveControl is TEdit then
    TEdit(ActiveControl).SelText := TSpeedButton(Sender).Caption;
end;

Если это не то, чего вы хотите достичь, отредактируйте исходный вопрос и добавьте к нему дополнительную информацию, чтобы у нас была возможность помочь вам получить ваш ответ.

1 голос
/ 28 января 2011

Вы не упоминаете версию Delphi, которую используете, но если это Delphi 2010 или выше, вы можете использовать компонент TTouchKeyboard , доступный в палитре, и установить макет свойство для NumPad.

Очень удобно, потому что оно обрабатывает все детали для вас.

NumPad

0 голосов
/ 27 января 2011

Попробуйте использовать ActiveControl свойства формы. Или ActiveControl свойство и OnActiveControlChange событие TScreen класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...