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:
meine Methode zum Senden (PC2PLC) in eine shared Method umgewandelt
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.
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.
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”
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.
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?