Von einer Klasse auf eine bereits geöffnete Form zugreifen

  • C#

Es gibt 21 Antworten in diesem Thema. Der letzte Beitrag () ist von DosiSoft.

    Wozu? Das deutet meist auf einen Architekturfehler hin. Was genau hast Du vor?

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Ich nutze eine Klasse zum Verwalten von Screenshots.
    Innerhalb dieser Klasse werden die Screenshots auch per POST Request hochgeladen.

    Nun habe ich einen Backgroundworker verwendet, um den Upload durchzuführen.
    Nach Beendigung des Uploads möchte ich nun das Standardformular, das stets geöffnet bleibt, zum Anzeigen des Screenshots verwenden.
    Dann solltest Du eventbasiert arbeiten oder auch taskbasiert, je nachdem. Heißt Deine ursprüngliche Form lädt das Bild mit der Klasse hoch und sobald das Ganze fertig ist, wird ein Event gefeuert, das Du abonnieren kannst und dann öffnest Du im Handler diese neue Form.
    Wenn Du das taskbasiert implementierst, kannste den Aufruf einfach awaiten.

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Du sollst das Formular erst öffnen, wenn diese Aufgabe erledigt ist. Nicht vorher schon. ;)

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Dann ist das Ganze ja noch einfacher und Du kannst direkt in der Form-Routine, nach dem Funktionsaufruf für das Hochladen, entsprechend auf die Controls zugreifen.

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:

    Trade schrieb:

    Dann solltest Du eventbasiert arbeiten oder auch taskbasiert, je nachdem.

    BackgroundWorker wäre wohl eventbasiert: msdn.microsoft.com/de-de/libra…rcompleted(v=vs.110).aspx
    Ist allerdings nicht mehr das Neueste, was Microsoft heutzutage so anzubieten hat. Neu wäre wie gesagt das TAP mittels Task, Async und Await.

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Dann müsste der Worker aber auch in der Formularklasse untergebracht werden, oder?
    Wäre es nicht auch irgendwie möglich, die Formularinstanz der Klasse zu übergeben, sodass ich auf diese dort zugreifen könnte?
    Weil wenn ich den Worker nun samt Uploadprozess im Hauptformular unterbringen müsste, müsste ich zu viel ändern.
    Nur die Form selber sollte Zugriff auf sich haben und Dinge erledigen. Da müsstest Du halt ein eigenes Event basteln und dieses abonnieren. Im RunWorkerCompleted feuerst Du das dann halt einfach.

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Nein, das Event stellst Du zur Verfügung und die Form-Klasse abonniert es.

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Also folgendermaßen? So habe ich es jedenfalls durch Recherchen, wie man Events abonniert, herausgearbeitet.

    C#-Quellcode

    1. screenshot.UploadWorkerCompleted += new RunWorkerCompletedEventHandler(Test);


    Test wäre die Funktion im Formular, die das Bild dann anzeigen lassen soll und UploadWorkerCompleted die Funktion, die in der Klasse gefeuert wird.

    Allerdings zeigt das einen Fehler an:
    Fehler 3 'UploadWorkerCompleted' ist 'Methodengruppe', daher ist die Zuordnung nicht möglich.

    Jo, den RunWorkerCompletedEventHandler kannst Du auch weglassen. ;)
    Wie ist denn UploadWorkerCompleted deklariert?

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Erstmal danke, dass du mir hier die ganze Zeit hilfst.

    C#-Quellcode

    1. //Screenshotklasse
    2. public void UploadWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    3. {
    4. }
    5. bgWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(UploadWorkerCompleted);
    6. //Form
    7. private void Test(object sender, RunWorkerCompletedEventArgs e)
    8. {
    9. }



    //Edit

    Okay,. ich habe mir den Fehler nach ausreichendem Schlaf noch einmal angeschaut und ihn behoben.
    Form:

    C#-Quellcode

    1. screenshot.bgWorker.RunWorkerCompleted += Test;
    2. private void Test(object sender, RunWorkerCompletedEventArgs e)
    3. {
    4. MessageBox.Show("TESTBLA");
    5. }


    Danke für deine Hilfe.

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „DosiSoft“ ()

    Der letzte Post würde zu unübersichtlich, daher mache ich jetzt einfach mal auf gut Glück einen Doppelpost. Ich hoffe, er kann der Übersicht halber so stehen bleiben.

    -----


    So, das anfängliche Problem ist eigentlich gelöst, jedoch habe ich aktuell ein ähnliches Problem, bei dem ich nicht weiter weiß.

    Ich habe die bereits erwähnte Standardform. Innerhalb dieser wird eine weitere Form aufgerufen, die maximized ist und den kompletten Desktop als Screenshot anzeigt. Der Nutzer ist bereits in der Lage, einen Bereich mit der Maus auszuwählen und diesen hochzuladen.
    Dazu wird im Mouseup Event der Bereichsscreenshot gespeichert und hochgeladen, wozu aus der zweiten Form wieder die Screenshotklasse aufgerufen wird.

    Nun möchte ich von der Standardform über die Screenshotform auf die Screenshotklasse und anschließend auf das RunWorkerCompleted Event zugreifen.

    Dazu sieht der Code der Standardform wie folgt aus:

    C#-Quellcode

    1. Bitmap takenScreenshot = screenshotClass.Desktop();
    2. Screenshot screenshotForm = new Screenshot();
    3. screenshotForm.Show();
    4. screenshotForm.screenshot = takenScreenshot;
    5. screenshotForm.pbScreenshot.Image = takenScreenshot;
    6. screenshotForm.takeScreenshot.bgWorker.RunWorkerCompleted += UploadCompleted;


    Jetzt ist das Komische jedoch, dass die letzte Zeile des Codes (das Eventabo) das Anzeigen des Screenshots in der ScreenshotForm verhindert. Wenn ich es wegmache, funktioniert alles wieder wunderbar.

    Habt ihr eine Idee?
    Deine Architektur ist nicht OOP-gerecht.

    DosiSoft schrieb:

    screenshotForm.pbScreenshot.Image = takenScreenshot;
    Auf Controls und Member sollte nur die Form selber Zugriff haben und niemand von außen. Derartige Member sollen daher immer private sein. Dasselbe trifft auch auf den BGW zu.
    Und ohne den Code der Form Screenshot wird es schwer, den Fehler zu finden. Das hängt ja meistens zusammen, zumal nicht klar ist, was takeScreenshot ist.
    Wie gesagt, die Architektur muss verbessert/verändert werden, aber dazu muss erstmal der ganze Code ersichtlich sein.

    Außerdem solltest Du Deine Bitmaps ordentlich freigeben, sonst entstehen Speicherlecks. ;)

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Ich glaube, ich habe zu viel falsch gemacht, als dass Code noch hilfreich wäre.

    Wie würdest du denn vorgehen? Ich weiß mittlerweile echt nicht mehr, wie ich da vorgehen soll, sodass es passt.

    Es soll im Grunde von der Standardform eine Form aufgerufen werden, die den Screenshot anzeigt und in der ein Bereich ausgewählt werden kann. Dieser soll dann mittels der Klasse hochgeladen werden und in der Standardform soll der Screenshot dann angezeigt werden.