2014-12-12 3 views
0

У меня есть TFrame, на котором размещены некоторые TEdits. Эти изменения: коробки для ввода последовательного ключа, поскольку я пытаюсь настроить пользовательский интерфейс , где входной фокус переходит из одного окна редактирования в другое, когда в каждом из них вводилось определенное количество символов . То есть пользователю не нужно нажимать вкладку или нажимать на следующее изменение для продвижения.Продвинутый фокус управления в VCL TFrame

Я нашел пример в HowTo книге C++ Builder (большая книга) о том, как «имитировать» ввести прессу вести себя как вкладки в прессе правок и был пытается использовать ту же технику. Однако что-то в моем приложении не работает , как в этом примере.

В рамках KeyPress событие, у меня есть код

void __fastcall TAboutFrame::Edit1KeyPress(TObject *Sender, 
System::WideChar &Key) 
{ 
TEdit* theEdit = dynamic_cast<TEdit*>(Sender); 
if(!theEdit) 
{ 
    return; 
} 

if(theEdit->Text.Length() >= 6) 
{ 
    //jump to next edit 
    Perform(WM_NEXTDLGCTL, 0, 0); 
... 

Но «скачок» к следующему элементу управления не происходит.

Основная форма, родительские кадры, имеет предварительный просмотр ключа == true, и я могу установить точку останова, чтобы увидеть, что вызов исполнения действительно выполнен.

Табло заказов на изменения составляет 1,2,3,4,5.

Интересно, есть ли у этого todo сообщение с TFrames или?

+4

Две вещи: 1) Вы можете использовать событие OnChange (а не 'OnKeyPress'), что делает это несколько проще, и 2) вам не нужно использовать' Perform' и отправлять сообщение; просто используйте 'TWinControl.SelectNext', что-то вроде' theEdit-> SelectNext (theEdit, True, True) '(я говорю что-то вроде, потому что я больше на Delphi, чем на C++ Builder), и пусть VCL делает все работа для вас. Он правильно обрабатывает порядок вкладок. –

+0

Это сработало отлично! В построителе функция члена редактирования SelectNext является частной, поэтому ее нельзя вызвать, но есть глобальная функция SelectNext, которая выполняет эту работу. Спасибо! –

ответ

0

Если элементы управления, которые вы используете, спускаются с TWinControl (что им нужно, если вы используете контрольные элементы VCL), вы также можете использовать TWinControl-> SetFocus(), чтобы явно настроить фокус на желаемый элемент управления.