Grundüberlegung bei meiner TabControl Anwendung



  • Hi,

    meine anwendung verwendet ein tabcontroll um in einzelnen tabsheets die inhalte von xml dateien anzuzeien.

    ich habe 5 xml dateien (alle gleichen aufbau, nur andere werte) und habe die tabsheets statisch angelegt. normalerweise müsste ich nun auf jedem tabsheet die komponenten drauf machen und jede komponenten für tabsheets mit code versehen. da jedoch alles identisch ist, außer die inhalte (werte) der xml dateien, frage ich mich ob es da nen besseren weg gibt, bevor ich den code jeweils 5x in meiner anwendung habe.

    kann ich irgendwie den code einmalig schreiben, so das jeder tabsheet den gleichen code verwendet.

    als bsp. (etwas kurz gefasst)

    jedes tabsheet hat ein button und ein memo. nun möchte ich nachdem ich auf den button klicke, die xml datei ins memo laden. nur möchte ich nicht insgesammt 5 buttons mit den code haben.

    ich hoffe ich konnte mich ausdrücken und würd mich freuen, wenn jemand nen besseren weg vorschlagen konnte.

    tiffy



  • 1. Jedes tabsheet ht einen Button
    2. Jedem Button die gleiche Funktion zuweisen
    3. in Funktion Sender Abfragen und auswerten



  • Hallo

    auch TTabSheets lassen sich wie normale Klassen ableitne und dynamisch erstellen.
    Deweiteren gibt es auch noch TFrames.

    bis bald
    akari



  • @altenburger

    habe das mal ausprobiert. das mit dem sender ist eine feine sache. nur eine sache verstehe ich da nicht, bzw. bekomme es nicht. sagen wir jedes tabsheet hat einen button und ein edit. und immer wenn ich auf den buttonj klicke, will ich den caption des buttons in das edit schreiben:

    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
      Edit1->Text = static_cast<TButton*>(Sender)->Caption;        
    }
    

    wie mache ich das mit dem edit feld, damit der caption in dem edit auf gewünschten tab geschrieben wird?

    @akari

    ich hatte nicht vor, alle komponenten dynamisch zu erzeugen, wäre etwas viel arbeit.

    Tiffie



  • Hallo

    diese Überlegungen müßtest du nicht machen, wenn du wie ich es vorgeschlagen habe, eine Klasse mit allen Funktionen und Controls zusammenstellst und davon soviele Instanzen erstellst, wie du brauchst.

    In deiner Version kannst du zur Entwurfs-Zeit jedem Control auf dem Tab in die Tag-Eigenschaft die Nummer des TabSheets schreiben, auf dem es sich befindet.
    Dann kannst du zur Laufzeit in den Mehtoden diese Tag-Eigenschaft des Senders auswerten und das TabSheet bestimmen, das betroffen ist.

    bis bald
    akari



  • @akari

    das hört sich sehr interessant an, leider kann ich den gedanken noch nicht ganz folgen. kannst du mir vielleicht ein kleines beispiel geben mit einem tabsheet wo ein button und ein edit drauf ist?

    Tiffie



  • Hallo

    dazu brauchst du Grundlagen in C++ OOP, und über die Hintergründe der VCL. Hier mal das Beispiel von dir umgesetzt

    Header :

    // Erweiterung der Klassendefinition von TTabSheet um Controls und Events
    class TMyTabSheet : public TTabSheet
    {
      private :
        TButton *iMyButton; // Interner Verweis auf den Button
        TEdit *iMyEdit; // Interner Verweis auf das Edit
        void __fastcall OnMyButtonClick(TObject *Sender); // Eventmehtode für den Button
      public :
    
        // Konstruktor, erweitert um Caption des neues Tabs
        __fastcall TMyTabSheet(Classes::TComponent* AOwner, const AnsiString &NewCaption);
      };
    

    Implemenation :

    // Implementation des Konstruktors
    __fastcall TMyTabSheet::TMyTabSheet(Classes::TComponent* AOwner, const AnsiString &NewCaption) : TTabSheet(Owner)
    {
      Caption = NewCaption; // Caption des Tabs zuwesien
    
      // Button erstellen und konfigurieren
      iMyButton = new TButton(this);
      iMyButton->Name = "MyButton";
      iMyButton->BoundsRect = TRect(10, 10, 100, 35);
      iMyButton->Caption = "Anzeigen";
      iMyButton->Parent = this;
      iMyButton->OnClick = OnMyButtonClick;
    
      // Edit erstellen und konfigurieren
      iMyEdit = new TEdit(this);
      iMyEdit->Name = "MyEdit";
      iMyEdit->BoundsRect = TRect(10, 40, 100, 35);
      iMyEdit->Text = "";
      iMyEdit->Parent = this;
      }
    
    // Implementation der Eventmehtode für den Button
    void __fastcall TMyTabSheet::OnMyButtonClick(TObject *Sender)
    {
      ShowMessage(AnsiString("Button ") + iMyButton->Name + " in Tab " + Caption + " gedrückt, in Edit steht " + iMyEdit->Text);
      }
    

    Anwendung :

    // vier Instanzen von TMyTabSheet erstellen
    for (int Lv = 0; Lv < 4; Lv++)
    {
      TTabSheet *NewSheet = new TMyTabSheet(this, "Tab " + IntToStr(Lv +1));
      NewSheet->PageControl = PageControl1;
      }
    

    Für dieses einfache Beispiel ist das natürlich oversized. Wenn du nur einen einfachen Button hast, lohnt sich eher die Tag-Mehtode.
    Willst du aber mehrere Methoden und Controls verbinden und erweiterbar und wartbar halten, ist eine saubere OOP-Zusammenfassung hilfreich.

    Wenn das manuelle Festlegen der Controls in der TabSheet-Klasse dich stört, kannst du auch TFrame verwenden, um das im Objektinspektor wie geohnt zusammensetzen. Dann erstellst du dynamisch normale TTabSheets und legst auf jedes eine neue Instanz des erstellten Frames.

    bis bald
    akari



  • besten dank für die hilfe. damit komme ich weiter und den rest kriege ich selbst hin.

    tiffie


Anmelden zum Antworten