2016-05-25 9 views
1

Я хочу, чтобы, когда я нажимаю M или m характер, 000000 получает входной сигнал на определенную TEdit коробки:Delphi ключа переназначить групповые символы

procedure Tfrm.FormKeyPress(Sender: TObject; var Key: Char) ; 
var 
    i : integer; 
begin 
    if Key in ['m'] + ['M'] then Key := '0'; 
end; 

С помощью этого кода, я могу просто переназначить клавишу «M» для одиночный знак. Как я могу переназначить «M» на несколько символов для поля TEdit?

+1

Почему вы не используете для этого события «TEdit»? –

+0

Вы хотите ввести '000000' в' TEdit', когда * any * control получает 'M' /' m'? Или только когда получен тот же «TEdit»? Вы хотите, чтобы 'M' /' m' все еще обрабатывался элементом управления, который его получил, или вы хотите отменить его? –

+0

Я хочу, когда получен m/M, вход 000000 в Tedit, например, при вводе 1m в Tedit, Tedit выглядит 1000000 (m означает миллион). Я не использовал m char в компоненте TEdit –

ответ

4

Используйте OnKeyPress события TEdit самих, а не OnKeyPress события родителя TForm. Установите параметр # 0 Key проглотить его, а затем вставить 6 отдельных '0' символов в TEdit:

procedure Tfrm.Edit1KeyPress(Sender: TObject; var Key: Char); 
var 
    i : integer; 
begin 
    if Key in ['m', 'M'] then 
    begin 
    Key := #0; 
    for I := 1 to 6 do 
     Edit1.Perform(WM_CHAR, Ord('0'), $80000001); 
    end; 
end; 

В качестве альтернативы:

procedure Tfrm.Edit1KeyPress(Sender: TObject; var Key: Char); 
begin 
    if Key in ['m', 'M'] then 
    begin 
    Key := #0; 
    Edit1.SelText := '000000'; 
    end; 
end; 
+1

Почему бы не использовать 'Edit1.SelText: = '000000'' (или, что еще лучше,' TEdit (Sender) .SelText: =' 000000'')? –

2

вы не можете "переназначить" действительно

но вы можете убить, что конкретный символ (настройка его # 0) и ввести необходимые нули с использованием стандартного API Windows Messaging (SendMessage, а не PostMessage)

Что-то вдоль этих линий:

procedure Tfrm.FormKeyPress(Sender: TObject; var Key: Char); 
var i : integer; 
begin 
    if ActiveControl = Edit1 then 
     if Key in ['m'] + ['M'] then begin 
     Key := #0; // zero-out the real key so it would not be handled by the editbox 
     for i := 1 to 6 do 
      ActiveControl.Perform(WM_CHAR, Ord('0'), $80000001); 
      // or you may reference the specific editbox directly 
      // like Edit1.Perform(....); 
     end; 
end; 

Это также потребует установки формы перехватить ключи его управления.

http://docwiki.embarcadero.com/Libraries/XE2/en/Vcl.Forms.TCustomForm.KeyPreview

Это имеет смысл, если вы хотите, чтобы захватить несколько editboxes сразу. Если нет, то лучше вы сами события самого редактора, а не формы.

procedure Tfrm.Edit1KeyPress(Sender: TObject; var Key: Char); 
var i : integer; 
begin 
    if Key in ['m'] + ['M'] then begin 
     Key := ^@; // zero-out the real key so it would not be handled by the editbox 
     for i := 1 to 6 do 
      Edit1.Perform(WM_CHAR, Ord('0'), $80000001); 
      // or you may reference the specific editbox directly 
      // like Edit1.Perform(....); 
    end; 
end; 
+0

Если у вас есть какой-либо компонент (TEdit, TButton, TMemo и т. д.) в форме 'Tfrm', он не будет проходить через событие FormKeyPress! –

+0

@ moskito-x есть свойство KeysPreview.Тем не менее, я стараюсь оставаться рядом с кодом главной страницы (так что было бы наиболее ясно, что я добавил к «шаблону» его создания), доверяя его «я могу просто переназначить ключ« М »на один символ с помощью этого кода». В общем, я согласен с тем, что для стабилизации кода необходимо добавить либо чек, «какой editbox он точно», либо использовать собственные события editbox. –

+0

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

1

Если вы хотите, чтобы оборудовать все TEdits с этим поведением, то установить все другие TEdits KeyPress события Edit1KeyPress

procedure Tfrm.Edit1KeyPress(Sender: TObject; var Key: Char); 
var 
xEdit: TEdit; 
begin 
if Key in ['m','M'] then begin 
     Key := #0; 
     xEdit := Sender as TEdit; 
     xEdit.Text := xEdit.Text +'000000'; 
    end; 
end; 

или короткая версия

procedure Tfrm.Edit1KeyPress(Sender: TObject; var Key: Char); 
begin 
if Key in ['m','M'] then begin 
    Key := #0; 
    TEdit(Sender).Text := TEdit(Sender).Text+'000000'; 
end; 
end; 
+0

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

+0

@ Arioch'The: Из вашего кода: 'if ActiveControl = Edit1 then' вы должны постоянно меняться' = Edit1' в имя TEdits. –

+0

В случае нескольких ящиков это будет 'if (ActiveControl = Edit1) или (ActiveControl = Edit2) или .... then ...' и все еще 'ActiveControl' будет использоваться для ввода сообщений –

 Смежные вопросы

  • Нет связанных вопросов^_^