| Autor |
Beitrag |
Felix2000
      
Beiträge: 124
|
Verfasst: Fr 12.08.11 09:05
Hi Folks !
ich habe mal eine für mich sehr wichtige Frage an euch. Es geht mir hierbei um den Aufbau einer vernünftigen Programmstrukturierung in Verbindung mit einer oder evtl. auch mehreren Benutzeroberfläche und verschiedenen Klassen, in denen die gesamte Erzeugung, Verwaltung und Strukturierung von den Komponenten stattfinden soll, die auf der / den Benutzeroberfläche/n dargestellt und von Benutzern verwendet werden sollen.
Hierbei geht es auch um das spezielle Event-Handling dieser Komponenten, also die Aktionen, die von mir selbst programmiert wurden, wenn der Benutzer bestimmte Aktionen mit den Komponenten durchführen.
Hier ist nochmal der Standardcode, den Visual Studio mir vorgibt, wenn ich eine Benutzeroberfläche erstelle.
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| public partial class Form1 : Form
public Form1() { InitializeComponent(); }
private void Form1_Load(object sender, EventArgs e) {
}
} |
Nun kann man zwar die einzelnen Komponenten hier in der Methode Form1_Load() erzeugen und verwalten, aber sinnig ist das wohl kaum, spätestens dann, wenn das Programm mal gewartet oder erweitert werden muss.
Ich habe hier mal versucht, etwas in Klassen auszulagern, aber leider klappt das nicht, weil so die Erstellung der Oberfläche nicht mehr klappt, angeblich gibt es auch Probleme mit der Sichtbarkeit und Verwendung dynamischer Inhalte!?
Wie kann ich so etwas sinnvoll strukturieren, so dass mein Programm flexibel erweiterbar ist?
Greetz
Felix
|
|
Xcalibur
      
Beiträge: 37
|
Verfasst: Fr 12.08.11 10:07
Welche Komponenten meinst du den?
Formobjekte deiner Oberfläche?
Da du eh mit Visul Studio arbeitest warum nimmst du nicht den Designer?
Oder möchtest du deine Objekte zur Laufzeit erst dynamisch erstellen?
Das geht(ja sogar mit ausgelagerten Klassen)
Gruß Xcalibur
|
|
Felix2000 
      
Beiträge: 124
|
Verfasst: Fr 12.08.11 10:23
Hi Folks !
Ich meine z.B. so etwas wie Textfelder, Buttons, Labels, Radiobuttons, Checklisten, hauptmenüs, Kontextmenüs usw.
Also eben die Dinge, die für die Benutzerinteraktion von elementarer Bedeutung sind.
Klar kann man das teilweise zur Entwurfszeit machen (also per Drag and Drop mit der Toolbox im Visual Studio), aber elegant ist das nicht, ich würde es lieber alles selbst per Code gestalten wollen (bei den Kontextmenüs scheint es wohl auch nur so zu funktionieren).
Und hier stellt sich eben die Frage, wie ich dass in Klassen gestalten kann, die von der Benutzeroberfläche angesprochen werden können, aber gleichzeitig auch von ihr unabhängig sind, also quasi entkoppelt und die Anwendung somit besser wartbar und pflegbarer wird.
Greetz
Felix
|
|
Xcalibur
      
Beiträge: 37
|
Verfasst: Fr 12.08.11 10:53
Also hier mal ein Beispiel wie du einen Button anlegst (für alle Objekte ist es im prinziep ähnlich)
(Für alnegen innerhalb der Form...
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| private void CreateButton() { Button mybutton = new System.Windows.Forms.Button(); mybutton.Location = new System.Drawing.Point(10, 10); mybutton.Name = "mybutton"; mybutton.Size = new System.Drawing.Size(162, 41); mybutton.TabIndex = 1; mybutton.Text = "mybutton"; mybutton.UseVisualStyleBackColor = true; mybutton.Click += new System.EventHandler(this.mybutton_Click); this.Controls.Add(mybutton); } private void mybutton_Click(object sender, EventArgs e) { } |
das ganze in Klasse zu packen ist auch nicht wesentlich aufwendiger, jedoch musst du es dann bei
C#-Quelltext 1:
| this.Controls.Add(mybutton); |
an die richtige Zielform hängen und aufpassen das du deine Eventhandler nicht durcheinander bringst.
Gruß Xcalibur
|
|
Felix2000 
      
Beiträge: 124
|
Verfasst: Fr 12.08.11 11:16
Hi Folks !
Xcalibur hat folgendes geschrieben : |
das ganze in Klasse zu packen ist auch nicht wesentlich aufwendiger, jedoch musst du es dann bei
C#-Quelltext 1:
| this.Controls.Add(mybutton); |
an die richtige Zielform hängen und aufpassen das du deine Eventhandler nicht durcheinander bringst. |
Ich nehme mal an mit "this" meinst Du dann hier im Code das Formular, richtig? Könntest Du mir vielleicht noch erläutern, was genau mit Controls gemeint ist. Ist das zwingend erforderlich (egal, ob der Button nun auf einem Formular plaziert wird, oder innerhlab eines anderen Objektes)?
Hab aber erstmal vielen vielen Dank !!
Greetz
Felix
|
|
Xcalibur
      
Beiträge: 37
|
Verfasst: Fr 12.08.11 11:25
Genau "this" verweist immer auf die aktuelle Instanz der Klasse. Da ich mich hier in der Form befunden habe passt das.
Falls du dich in einer anderen Klasse befindest musst du dieser Klasse den FormNamen mitgeben.
In Controls gefinden sich alle Steuerelemente des Objektes. (Z.B. einer Form oder eine GroupBox)
Wenn du das nicht angibst erzeugst du zwar den Button aber er weis dann nat nicht wo er hingehört.
Also musst du den Button irgendwo dazuhängen und das geschieht bei dem
C#-Quelltext
Gruß Xcalibur
|
|
Felix2000 
      
Beiträge: 124
|
Verfasst: Mo 22.08.11 10:13
Hi Folks !
Ich habe nochmal eine Frage zu diesem mittlerweile auch schon etwas älteren Thema.
Ich habe eben mal versucht, Code für die Erstellungen eines Formulars in eine separate Klasse zu schieben. Nun wollte ich von dort aus das Formular ansprechen (ich habe es zuvor umbenannt und es nennt sich nun FormularMainApllikation).
Leider kann ich aus der separaten Klasse keinen Zugriff auf dieses Formular gewährleisten.
Wie kann ich das korrekt umsetzen?
Greetz
Felix
|
|
stes
      
Beiträge: 36
Erhaltene Danke: 6
Win 95, Win XP, Win 7 64-bit
C# (VS 2010, #Develop), Java (eclipse)
|
Verfasst: Di 23.08.11 12:39
Hi Felix,
zu deiner letzten Frage:
| Zitat: | | Ich habe eben mal versucht, Code für die Erstellungen eines Formulars in eine separate Klasse zu schieben. Nun wollte ich von dort aus das Formular ansprechen |
Ich nehme mal an du übergibst deiner zweiten Klasse in irgendeiner Form dein Formular, oder?
Dann könnte man das ganze so lösen:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31:
| public class Form1 : Form { public Form1() { GuiGenerator g = new GuiGenerator(); g.GenerateGUI(this); }
}
public class GuiGenerator { public void GenerateGUI(Form form) { form.Text = "Sample Form";
Button b = new Button(); b.SetBounds(10, 10, 100, 20); b.Text = "Test Button"; form.Controls.Add(b);
Label l = new Label(); l.SetBounds(10, 50, 100, 20); l.Text = "Test Label"; form.Controls.Add(l); } } |
(siehe dazu auch: www.c-sharp-forum.de...nalitaet_106651.html, vierter Beitrag, da ist auch der Code her ^^)
Im o.g. Post habe ich auch noch weitere Möglichkeiten zur GUI-Erzeugung ohne Designer aufgeführt.
Und zu deiner Äußerung
| Zitat: | | ...aber elegant ist das nicht, ich würde es lieber alles selbst per Code gestalten wollen |
Auch der VS-Designer erstellt im Hintergrund Code, den solltest du allerdings nicht eigenhändig verändern (dabei verweise ich wieder auf den obigen Link).
Gruß
stes
_________________ "Das Internet ist ein großer Misthaufen, in dem man allerdings auch kleine Schätze und Perlen finden kann." Joseph Weizenbaum
|
|
DennisXX
      
Beiträge: 133
|
Verfasst: Mi 24.08.11 14:18
Hallo Leute !
Ich habe auch mal eine Frage zu diesem interessanten Thema hier. Ich habe mir mit dem Visual Studio eine kleine Oberfläche mit einigen Objekten aus der Toolbos zusammengeklickt.
Sämtliche Code, der Designer für mich generiert hat, habe ich jetzt in eine eigene Klasse geschoben. Hier ein kleiner Codeausschnitt dazu:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40:
| class GenerationGUI { private Form CurrentForm; public Button Streaming { get; set; } public Button Reading { get; set; }
public GenerationGUI(Form CurrentForm) { this.CurrentForm = CurrentForm; }
public void generateGUI(Form CurrentForm) { Streaming = new Button();
Streaming.Location = new System.Drawing.Point(6, 45); Streaming.Name = "cmdStreaming"; Streaming.Size = new System.Drawing.Size(104, 23); Streaming.TabIndex = 3; Streaming.Text = "Speichern (Datei)"; Streaming.UseVisualStyleBackColor = true; CurrentForm.Controls.Add(Streaming);
Reading = new Button();
Reading.Location = new System.Drawing.Point(116, 45); Reading.Name = "cmdReading"; Reading.Size = new System.Drawing.Size(89, 23); Reading.TabIndex = 4; Reading.Text = "Öffnen (Datei)"; Reading.UseVisualStyleBackColor = true; CurrentForm.Controls.Add(Reading);
} |
Wie genau musss ich das jetzt in den Designer des Formulares einbinden? Und das sind ja zwei Klassen, eine davon ist eine Partical Klasse. Ich weiß, dass ich diese Klasse so erzeugen und die Methode generateGUI() so aufrufen muss.
C#-Quelltext 1: 2:
| GenerationGUI ref = new GenerationGUI(this) ref.generateGUI(this); |
Viele Grüße
Dennis
|
|
Kha
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: Mi 24.08.11 16:07
DennisXX hat folgendes geschrieben : | | Sämtliche Code, der Designer für mich generiert hat, habe ich jetzt in eine eigene Klasse geschoben. |
Der ist doch sowieso schon in einer separaten (partial) Klasse  . Ich sehe nicht, was dir das bringen soll, außer die Designerunterstützung zu zerstören.
_________________ >λ=
|
|
Th69
      

Beiträge: 4807
Erhaltene Danke: 1061
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Mi 24.08.11 16:15
Hallo Dennis,
und wenn du wirklich selbständige Controls (d.h. ohne Form) erstellen willst, dann schau dir mal UserControls (auf deutsch haben diese den phänomenalen Namen "Benutzersteuerelemente") an...
|
|
|