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?
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
-
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