SetFocus - Problem



  • Wenn das Feld noch nicht enabled ist, dann kann es auch nicht in der Tab-Order auftauchen.



  • @JeGr: feld2 wird ja im OnExit() von feld1 enabled

    @Jansen: das hilft weiter 😃



  • 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


Anmelden zum Antworten