SetFocus - Problem
-
Moin,
hab zwei Edit-Felder, einen Button. zu beginn ist ein feld enabled und hat den focus, das andere ist nicht enabled. ich möchte bei tab-sprüngen, und nur bei tabsprüngen, prüfen ob das erste feld leer ist, wenn nicht, soll das zweite enabled werden und den focus bekommen. habs über OnEnter vom zweiten feld versucht, aber wenn ich beim ersten feld(tab 0) OnExit() das zweite(tab 1) enable, springt tab schon auf den button(tab 2), obwohl die taborder stimmt.
weiss jemand woran das liegen könnte, sonst mach ichs über OnKeyPress()?
-
Hallo
mach doch nach enabled SetFocus
MfG
Klaus
-
Hab nun ein OnKeyPress-Ereigniss gemacht:
TForm1::Edit1_KeyPress(TObject *Sender, char &Key) { if(Key == VK_TAB) { Edit2->Enabled = True; Edit2->SetFocus(); } }
Form1::KeyPreview = True
Aber die Routine wird nicht angesprungen, wenns Ereignis eintrifft.
Hab ich noch was vergessen?
-
@KlausB: das feld soll ja nicht in jedem fall den fokus kriegen. ich wollt eigentlich nur wissen ob jemand weiss, warum die taborder nicht eingehalten wird.
-
-
Wenn das Feld noch nicht enabled ist, dann kann es auch nicht in der Tab-Order auftauchen.
-
-
bin manchmal etwas langsamer,...
also, ich hab nun folgende definition:
void __fastcall TEdit::WMGetDlgCode(TMessage & Message) { Message.Result = DLGC_WANTTAB; }
müsste eigentlich hinhauen, wo muss ich die deklaration unterbringen, bzw.
wo darf ich, bietet es sich an?
-
Hi,
< *.h > private: void __fastcall CMDialogKey(TWMKey &AMsg); public: __fastcall TForm1(TComponent* Owner); protected: BEGIN_MESSAGE_MAP VCL_MESSAGE_HANDLER(CM_DIALOGKEY, TWMKey, CMDialogKey) END_MESSAGE_MAP(TForm) < *.cpp > void __fastcall TForm1::CMDialogKey(TWMKey &AMsg) { TForm::Dispatch(&AMsg); switch(AMsg.CharCode) { case VK_TAB : if (ActiveControl == Edit1) { Edit2->Enabled = true; Edit2->SetFocus(); } break; } }
-
Okelidokeli, des wars, sitzt, passt, wackelt und hat Luft.
danke
-
muss nochmal auf die taborder zurückkommen.
anscheinend wird diese inkrementiert, bevor das OnExit()-Ereignis ausgelöst wird, wie kann ich die taborder nun manuell zurücksetzen, bzw. wo innerhalb des übergeordneten Elements(in diesem fall TTabSheet) wird der wert von taborder des aktiven/fokussierten objekts festgehalten?
-
Moin,
der Msg-Handler von Jaroslav hat mir schon sehr geholfen.
Allerdings hab ich nun das Problem, dass der auch auf Shift+Tab reagiert, ich kann also nicht mehr zurücktabben.
Wie kann ich im Msg-Handler zusätzlich den Shiftstatus abfragen?
Bzw. wie muss dazu die Deklaration aussehen?void __fastcall TForm1::CMDialogKey(TWMKey &AMsg, TShiftState Sh) { TForm::Dispatch(&AMsg); if(!Sh.Contains(ssShift)) { switch(AMsg.CharCode) { case VK_TAB : if (ActiveControl == Edit1) { Edit2->Enabled = true; Edit2->SetFocus(); } break; } } }
-
Hi,
nein, nein....das geht nicht mit 2 parameters
void __fastcall TForm1::CMDialogKey(TWMKey &AMsg) { TForm::Dispatch(&AMsg); if (AMsg.CharCode == VK_TAB && KeyDataToShiftState(AMsg.KeyData).Contains(ssShift)) { if (ActiveControl == Edit1) { Edit2->Enabled = true; Edit2->SetFocus(); } } }
-
Habs mir schon fast gedacht, aber wie sind dann die anderen Msg-Handler wie z.B. MouseMove aufgebaut?
Danke für deine schnelle Hilfe, danach (KeyDataToShiftState) hät ich wohl ewig gesucht
-
Original erstellt von DBler:
aber wie sind dann die anderen Msg-Handler wie z.B. MouseMove aufgebaut?Hä???
-
sorry, ganz schnell vergessen, kurzer anflug von geistiger umnachtung