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