Immer noch Probleme mit dem 2. Fenster

  1. 6 weeks ago

    Hallo,
    ich möchte über meine App einen uC steuern, der über die Serielle Schnittstelle angeschlossen ist.
    In meinem Window1 habe ich eine Methode namens PC2PLC zum Senden über die serielle Schnittstelle. Die serielle Schnittstelle gehört zu Window1.
    Nun möchte ich über diese Methode etwas an den uC schicken, wenn der User mein 2. Window (g_win) schließt.

    Ich habe folgendes versucht:

    1. meine Methode zum Senden (PC2PLC) in eine shared Method umgewandelt
    2. in Window2 wird geprüft:

    if g_win <> nil then
    ...
    else
    Window1.PC2PLC("ESC")

    Das scheint soweit korrekt zu sein.

    In meiner Methode PC2PLC versuche ich nun mit :
    Window1.Serial1.Write(übergebenerString)
    zu Senden. Hier scheint "Window1" falsch zu sein und ich komme nicht dahinter, warum.

    Kann mich jemand erleuchten?

  2. Markus R

    Jan 7 Pre-Release Testers, Xojo Pro Europe / Germany
    Edited 6 weeks ago

    Wenn Du eine Klasse erstellst und dort eine shared Method einfügst kannst du die Methode / Funktion aufrufen ohne
    ein Objekt vorher zu erstellen. KlassenName.MethodName
    Serial1 hast du bestimmt in das Fenster gezogen beim Entwurf und das wird bestimmt nur erstellt wenn Du das Fenster öffnest,
    deine Shared Methode ist getrennt.

    Du könntest ein Ereignis definieren in Windows 2 das mit RaiseEvent vor dem schließen aufgerufen wird
    und im ersten Fenster wenn Du das zweite öffnest fügst Du ein AddHandler auf dieses Event ein und gibst dort
    die Methode für dein Event an

    var w as new Window2
    AddHandler w.DoSomething,WeakAddressOf(DoSomethingHere)
    w.Show

    Beim Event hast Du den Vorteil das das Sender Object also Window2 mit dabei ist.

    andere Möglichkeit ist das fenster1 in fenster2 zu merken (property) das du im fenster2 fenster1.methode aufrufen kannst.
    dafür muss die Methode public sein.
    var w as new Window2
    w.MainWindow = Self
    w.Show

    im Fenster2
    MainWindow .PC2PLC("ESC")

    blöd hierbei ist aber das wenn Fenster1 geschlosen wird das Object in Fenster2.MainWindow ungültig wird.

  3. Ich steige noch nicht durch: Mein 2. Fenster ist global (Property of Modul1). Bei Aufruf der shared function von Window1 bekomme ich den Fehler: "Self does not mean anything in a module method Window1.serial1.write"

  4. Markus R

    Jan 7 Pre-Release Testers, Xojo Pro Europe / Germany

    Mach da bitte wieder eine normale Methode draus keine shared Methode.
    Oder der shared Methode serial als Parameter geben müßte auch gehen.

  5. Tomas J

    Jan 7 Pre-Release Testers, Xojo Pro Europe (Germany)

    Mal was ganz anderes, was Dir bestimmt im Handling mit mehreren Fenstern hilft.
    Erstelle Deine Methoden unterhalb "App" und spreche diese aus Deinen Fenstern mit

    app.methodenname()

    an. Instantiieren tust Du Deine serielle Schnittstelle direkt mit dem Objekt SerialConnection

    var p as new SerialConnection

    Dürfte am Anfang einfacher und zielfüjrender sein. Idealerweise arbeitest Du künftig aber mit eigenen Klassen, die für Dich eine serielle verbindung herstellen und dir Du von überall instantiieren kannst.

  6. Hallo Thomas,
    da hast du Recht und in Zukunft werde ich mir vorher überlegen, ob ich mehrere Fenster brauche. Inzwischen ist das Programm aber so umfangreich geworden, dass ich es gar nicht mehr so leicht umbauen kann.

    Für den Moment habe ich einen Weg gefunden, mein Problem zu lösen, indem ich einen Boolschen Wert an Window1 zurückgebe, wenn ein "ESC" gesendet werden muss. Dann kann Window1 direkt senden und die Funktion PC2PLC ist nicht mehr shared.

    Nun habe ich aber schon das nächste Problem:
    Bei mehreren aufeinanderfolgenden Messungen wird mehrmals
    g_win = new DisplayWindow
    ...
    g_win.show
    aufgerufen.
    Das ist auch nicht schlecht, so kann man die Werte vergleichen. Nun wird beim Schließen von g_win aber die Messung abgebrochen. Das passiert aber auch, wenn ich nicht das Fenster schließe, in das ich aktuell schreibe, sondern eines, das von einer älteren Messung stammt und noch offen ist. Gibt es einen Trick, um das zu vermeiden?

or Sign Up to reply!