ToolButton und MDIChild zur laufzeit erstellen und über OnClick eins ansprechen



  • Hallo,

    ich habe ein Problem wie kann man zur laufzeit des Programms ein MDIChildren über ein ToolButton ansprechen. Die ToolButtons werden zur laufzeit mit MDIChild erstellt.

    void __fastcall TMainForm::AddButtons(TStringList *pCaptions, AnsiString sHint)
    {
       for (int i = 0; i < pCaptions->Count; i++)
      {
        TToolButton *pButton = new TToolButton(ToolBar2);
        pButton->Parent = ToolBar2;
        pButton->Height = 22;
        pButton->Caption = pCaptions->Strings[i];
        pButton->Style = tbsButton;
        pButton->ImageIndex = 0;
        pButton->Hint = sHint;
        pButton->AutoSize = true;
        pButton->Name = "TButtons" + IntToStr(ToolBar2->ButtonCount);
        pButton->OnClick = ClickButtons;
      }
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TMainForm::ClickButtons(TObject *Sender)
    {
    
    for (int i = 0; i < ToolBar2->ButtonCount; i++) {
    
     if (ToolBar2->Buttons[i]->Caption == ((TMDIChild*)MDIChildren[i])->Caption)
      ShowMessage("Test");
    
    }
    }
    

    Wen ich eins anklicke, kommen alle MDIs ich weiss nicht wie ich das eine was ich nur anklicke ansprechen soll.
    Von ToolButton und MDIChild ist Caption immer gleich.

    Ich hoffe es kann mir einer Helfen.

    MfG Rave



  • Hallo

    Vermutlich suchst du so etwas :

    void __fastcall TMainForm::AddButtons(TStringList *pCaptions, AnsiString sHint)
    {
       for (int i = 0; i < pCaptions->Count; i++)
      {
        TToolButton *pButton = new TToolButton(ToolBar2);
        pButton->Parent = ToolBar2;
        pButton->Height = 22;
        pButton->Caption = pCaptions->Strings[i];
        pButton->Style = tbsButton;
        pButton->ImageIndex = 0;
        pButton->Hint = sHint;
        pButton->AutoSize = true;
        pButton->Name = "TButtons" + IntToStr(ToolBar2->ButtonCount);
        pButton->OnClick = ClickButtons;
    
        TMDIChild* Child = ...; // Das MDI-Fenster das zu dem Button gehört
        pButton->Tag = reinterpret_cast<int>(Child); // Adresse des Fenster an Button "heften"
      }
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TMainForm::ClickButtons(TObject *Sender)
    {
      TComponent* Button = static_cast<TComponent*>(Sender);
      TMDIChild* Child = reinterpret_cast<TMDIChild*>(Button->Tag); // Adresse des Fensters aus Button auslesen
      // Child verwenden
    }
    

    bis bald
    akari



  • Danke für Deine antwort bekomme aber ein Fehler

    [C++ Fehler] main.cpp(790): E2316 'Tag' ist kein Element von 'TObject'
    


  • Hallo

    Hab ich oben korrigiert. Sender muß erst noch in TComponent gecastet werden.

    bis bald
    akari



  • ja Danke hatte ich später erst gesehen 🙂

    ich habe SetFocus() hinzugefügt aber nix passiert !?!

    void __fastcall TMainForm::AddButtons(TStringList *pCaptions, AnsiString sHint)
    {
       for (int i = 0; i < pCaptions->Count; i++)
      {
        TToolButton *pButton = new TToolButton(ToolBar2);
        pButton->Parent = ToolBar2;
        pButton->Height = 22;
        pButton->Caption = pCaptions->Strings[i];
        pButton->Style = tbsButton;
        pButton->ImageIndex = 0;
        pButton->Hint = sHint;
        pButton->AutoSize = true;
        pButton->Name = "TButtons" + IntToStr(ToolBar2->ButtonCount);
        pButton->OnClick = ClickButtons;
    
        TMDIChild* Child = (TMDIChild*)MDIChildren[i]; // Das MDI-Fenster das zu dem Button gehört
        pButton->Tag = reinterpret_cast<int>(Child); // Adresse des Fenster an Button "heften"
    
      }
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TMainForm::ClickButtons(TObject *Sender)
    {
    TComponent* Button = static_cast<TComponent*>(Sender);
    TMDIChild* Child = reinterpret_cast<TMDIChild*>(Button->Tag);
    Child->SetFocus();    <----------- 
    
    }
    //---------------------------------------------------------------------------
    


  • Sry es geht mit

    Child->Show();
    

Anmelden zum Antworten