C# Ein "Form" von anderer Klasse aufrufen

m3x

Ensign
Dabei seit
Aug. 2005
Beiträge
218
Ich habe bisslang meistens mit Java programmiert nun muss was in C# erledigt werden, vom Handling sind beide immerhin etwas ähnlich nur bei den Forms bzw. Frame scheiter ich irgendwie.

Folgendes: Ich habe eine Klasse die paar sachen kopiert. Jetzt würde ich gerne es so haben das diese Klasse einen ProgressBar anzeigt.

So habe ich es mir gedacht:
Ich hätte gerne eine Klasse vom Typ "Form" mit dem Namen "ProgressBar" erstellt in der die ganze GUI geschichte abgewickelt wird. Auserdem werden Methoden bereitgestellt für das setzen des aktuellen Wertes zum schließen, usw...

Aus der Kopier-Klasse würde ich einen neuen "ProgressBar" instanzieren:
-> ProgressBar myBar = new Pro..." und entsprechend mit den Methoden gerne anzeigen, values setzen und am ende schließen...

Kann mir jemand einen qick&dirty code hinschreiben wie sich sowas realisieren lässt - ich wäre sehr dankbar! Also falls es überhaput geht...
 
2

2fastHunter

Gast
Es gibt eine fertige ProgressBar bereits im .Net-Framework. Einfach mal in der MSDN dazu suchen. Da gibt es auch ein schickes Tutorial dazu. Man benutzt den Backgroudnworker hierfür. Ist etwas tricky. Aber wenn man es richtig macht, dann rennt das richtig gut :)
 

Vibrationz79

Cadet 3rd Year
Dabei seit
Aug. 2008
Beiträge
43
Ich denke die ProgressBar meint er ja, aber er kann aus einer anderen Klasse heraus die ProgressBar nicht auf die Form bringen...

Mal ein anderer Ansatz, der m.M.n. ein wenig sauberer wäre:
Deine Klasse zum Kopieren sollte nur das tun wofür sie gedacht ist: Kopieren. Die Anzeige, also die ProgressBar, gehört in einen anderen Programmteil finde ich und das wäre die Form (Prinzip EVA: Eingabe, Verarbeitung, Ausgabe). Woher soll nun aber die Form wissen was passiert, wenn sie das Kopieren veranlasst? Ganz einfach: Events. Das Kopieren sollte in einem eigenen Thread im Hintergrund parallel laufen und lediglich Events bereitstellen, z.B. sowas wie CopyStarted, CopyFinished, CopyFailed, CopyProgressChanged. Die Form kann dann auf die Events reagieren, indem eine ProgressBar eingeblendet, ausgeblendet oder der Fortschritt aktualisiert wird.
Das Ganze ist ein wenig aufwändiger, hat aber den Vorteil, dass deine Klasse zum Kopieren plötzlich wiederverwendbar wird und ohne großen Mehraufwand z.B. auch in einer Konsolenanwendung verwendet werden kann - zumindest muss man sich nicht mehr mit dem Code der Klasse auseinandersetzen, wenn man sie anderweitig einsetzen will oder muss.
 

m3x

Ensign
Ersteller dieses Themas
Dabei seit
Aug. 2005
Beiträge
218
Ich denke die ProgressBar meint er ja, aber er kann aus einer anderen Klasse heraus die ProgressBar nicht auf die Form bringen...

Genau das ist der Punkt...
Dein Lösungsweg klingt interessant. Passende Codesnipes hast du zufällig nicht zur hand(ansonsten wird eben gegoogelt...) Danke!
 

Vibrationz79

Cadet 3rd Year
Dabei seit
Aug. 2008
Beiträge
43
Ganz kurz und knapp aus dem Kopf raus:

In der Kopier-Klasse brauchst du z.B. sowas:
Code:
public delegate void ProgressChangeEvent(int newvalue);
public event ProgressChangeEvent MyCopyProgressChanged;

In deiner Funktion zum Kopieren hast du ja irgendwo eine Stelle, wo sich der Fortschritt ändert. Dort käme dann sowas rein:
Code:
if (this.MyCopyProgressChanged != null)
    this.MyCopyProgressChanged(MyProgress);


In dem Form, das die ProgressBar enthält brauchst du für das Event noch eine Funktion wie z.B. sowas:
Code:
private void OnCopyProgressChanged(int newvalue)
{
    this.pbar.Value = newvalue;
}

Und irgendwo wo du deine Kopier-Klasse instanzierst musst du halt noch die Events zuordnen:
Code:
MyCopyClass m = new MyCopyClass();
m.MyCopyProgressChanged+=this.OnCopyProgressChanged;
...
m.StartCopy(quelle, ziel);

Wie gesagt, ist jetzt rein aus dem Kopf raus... StartCopy sollte halt nen eigenen Thread starten, der das Kopieren übernimmt... damit blockiert sich das Programm nicht selbst und die Anzeige kann sich schön brav immer aktualisieren...
 
Zuletzt bearbeitet: (Korrektur)
2

2fastHunter

Gast
Den Spaß mit den Events kannst du dir sparen, wenn du den Backgroudnworker benutzt, so wie es MS auch vorgesehen hat ;) Der realisiert genau da. Ihm wird der Kopierauftrag übergeben und das erledigt er. Bei jedem Durchlauf oder wann immer du magt meldet er dann, dass er einen Schritt weiter ist an den Progressbar.
Genau wie vibrationz79 erklärt hat würde das ganze funktionieren. Also wieso selber bauen wenn es schon ferige Klassen für gibt ;)
 

Ähnliche Themen

Antworten
1.612
Aufrufe
207.134
Top