C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Как заставить Enter работать как Tab,для всех форм, Делаем KeyPreview форм true,присваиваем.
iAlexander
  Отправлено: 31.07.2003, 14:26


Дежурный стрелочник

Группа: Участник
Сообщений: 70



Вообще решение известно, если такое нужно сделать лишь для одной формы:
Делаем KeyPreview форм true, пишем обработчик OnKeyPres:

void __fastcall TForm1::FormKeyPress(TObject *Sender, char &Key)
{
if (Key == VK_RETURN)
{
SelectNext(AddDataClient->ActiveControl, true, true);
Key = 0;
};
}

Теперь хочется сделать тоже самое для всех форм в одном месте!
Пишем что-то вроде
void __fastcall TMainForm::KeyEnterPress(TObject *Sender, char &Key)
{
TForm *MeForm;
MeForm = dynamic_cast(Sender);
if (Key == VK_RETURN)
{
((TWinControl*)Sender)->SelectNext(((TForm *)Sender)->ActiveControl, true, true); // упс, TWinControl::SelectNext недоступен
Key = 0;
};

}

И при создании главной формы
// проинициализировать все формы
TForm *CurrForm;
for (int i = 0; i < Application->ComponentCount; i++) {
// если это форма
if (CurrForm = dynamic_cast(Application->Components[i])) {
// то установим ее OnKeyPress
CurrForm->KeyPreview = true;
CurrForm->OnKeyPress = MainForm->KeyEnterPress;
};
};
(Asher, привет smile.gif )

Так вот, можно ли все-таки сделать доступным этот SelectNext()?
Asher
Отправлено: 31.07.2003, 15:58


Мастер участка

Группа: Модератор
Сообщений: 550



Привет, привет biggrin.gif
Станный какой-то у тебя dynamic_cast — он вроде в Help'у описан как dynamic_cast< T> (ptr), то-есть требует явного указания типа, к которому производится присвоение, то есть твой код должен был бы выглятеть так:
CODE
TForm *MeForm = dynamic_cast<TForm*>(Sender);//
if ((Key == VK_RETURN) && MeForm){
 MeForm->SelectNext(MeForm->ActiveControl, true, true);
 Key = 0;
}

но похоже что метод SelectNext — protected, так что в таком виде его вызвать не удасться. Придется вызывать п/п формы в которой уже будет внутренний SelectNext(this->ActiveControl, true, true); что убивает всю идею централизованной п/п

iAlexander
Отправлено: 31.07.2003, 16:18


Дежурный стрелочник

Группа: Участник
Сообщений: 70



[QUOTE]Станный какой-то у тебя dynamic_cast — он вроде в Help'у описан как dynamic_cast< T> (ptr)[QUOTE]
Извиняюсь. Теги не вписались в форум, т.е. dynamic_cast обрубился именно форумом, а не моим воспаленным воображением.

Т.е. коммунизма не получится? cool.gif
Asher
Отправлено: 31.07.2003, 16:29


Мастер участка

Группа: Модератор
Сообщений: 550



А....
я тогда тоже извияняюсь за то что плохо подумал biggrin.gif
Выходит так что SelectNext по простому не 'расшаривается' sad.gif

Вернуться в Вопросы программирования в C++Builder