Zugriff auf TCPSocket-Klasse von anderen Objekten aus?

Hallo Xojo-Experten,

ich fange gleich mal mit der Entschuldigung an, denn ich kann mir vorstellen, dass diese Frage schon andernorts geklrt wurde und ohnehin auf meiner noch recht groen Unwissenheit ber Xojo und Objektorientiertheit beruht. Allein meine Suchen hier haben mich nicht weitergebracht; entsprechend reicht mir gerne auch ein Hinweis auf einen erklrenden Thread.

Ich bin recht krzlich in Xojo eingestiegen, nachdem ich zwar frher schon Kontakt mit RealBasic hatte, damit aber nie richtig warm wurde. Vor Urzeiten mal ein bisschen Informatik studiert habend (damals fing man noch mit PASCAL an!), fhle ich mich semantisch sehr viel wohler als bei den Obj-C-Versuchen, die, da ich nicht ununterbrochen programmieren kann, nie richtig fruchten wollten. Das ist wie mit GREP in InDesign: Einmal eine Woche nicht draufgeschaut, hat man schon keine Idee mehr, was das Zeichengemurkse da eigentlich machen soll

Aber ich schweife ab. Mein Problem ist folgendes: Ich habe mir vorgenommen, eine vernnftige Steuer-App fr mein Telefon zu erstellen, da die eigentliche Software des Herstellers nur bis OS X 10.7 kompatibel ist. Die ersten Versuche laufen auch ganz gut um ehrlich zu sein ist bei aller mglichen Unvollkommenheit Xojo fr mich die ideale Plattform , aber um gleich “ordentlich” in die Objektorientiertheit einzusteigen, habe ich noch einmal neu begonnen.

Kern des ganzen ist nun eine erweiterte TCP-Socket-Klasse, die per Timer pollt und Loginprotokolle etc. aus sich heraus erledigen kann. Das funktioniert. Da sie unabhngig von einem geffneten Fenster laufen soll, ruft sie momentan ein Button auf Fensterebene auf, indem eine Methode auf App-Ebene aufgerufen wird, die sie “dimmt”, woraufhin sie sich einloggt, parst und die Verbindung kontrolliert. Sie bleibt aktiv und kommuniziert mit verschiedenen Objekten. Alles prima.

Wie aber bergebe ich den Handle der Instanz an z. B. verschiedene Fenster, um sie zu manipulieren? Wenn ich sie per Button-Action vom Fenster aus starte und von einem anderen Element (oder gar einem anderen Fenster aus) verndern will, gelangen meine Versuche immer nur zu einem “NIL”, obwohl ich sie im Debugger sehe. Referenzierung ber “app.” und der Versuch, die Klasse in einer globalen Eigenschaft “zwischenzulagern”, bringt das gleiche Ergebnis.

Vielen Dank vorab und siehe oben.

Uli

Wenn die Fenster ImplicitInstance an haben (ist auch so wenn du’s nicht nderst), dann kannst du doch ber FensterName. auf das Fenster zugreifen.

Ansonsten dynamisch zum Beispiel so:

[code] dim c as integer = WindowCount-1
for i as integer = 0 to c
dim w as window = window(i)
if w isa MeinFenster then
dim m as MeinFenster = MeinFenster(w)

  // gefunden
  m.tuwas
  Return
end if

next

// nicht gefunden
[/code]

Danke, ja, so rum funktioniert es auch. Ich erstelle die Instanz des Sockets aber nicht fensterabhngig, sondern aus der Activate-Action heraus, und mchte dann von einem beliebigen Fenster auf das Socket zugreifen. Das bekomme ich nicht hin, auch nicht mit den oben beschriebenen Versuchen.
(Und bin mir ziemlich sicher, nur einen Denkfehler dirn zu haben, da sich bislang alles ziemlich intuitiv erschlossen hat )

Wie wre es denn, wenn du beim erstellen des Sockets dann ein Property da setzt, wo halt der Verweis zurck drin ist?

Das ist das, was ich nicht hinbekomme. Ich will deine Geduld nicht überstrapazieren, aber falls du mir auf die Sprünge helfen magst – momentan wird der Socket nämlich gar nicht mehr erzeugt:

Ich habe also eine Klasse GigaTelSocket, die auf TCP-Socket als Superclass beruht, ergänzt um einen Poll-Timer im Constructor (Aufruf Super Constructor()), ein Parsermodul und Login-Funktionen. Die hatte wie gesagt schon mal prima funktioniert.

Bisher hatte ich die Instanz von einem Fenster aus ins Leben gerufen, aber ich will sie ja nicht vom Fenster abhängig machen. Jetzt könnte ich mir mit dem momentanen noch rudimentären Verständnis zwei Wege denken, um sie zu initialisieren:

a) eine Shared Property mit der Klasse GigaTelSocket und/oder
b) eine Deklaration (bin aber sehr unsicher dabei) im Fenster à la DIM socket as GigaTelSocket = app.SharedSocket.

Die Deklarationen werden angenommen, aber es wird keine Instanz erzeugt. Der Debugger zeigt 0 Sockets, entsprechend kommt es zur NIL-Exception. Was mir sagt, dass mein Ansatz nicht wirklich richtig ist …

Vielen Dank nochmals!
Uli

Nachtrag: Ich hab’s gelöst. Irgendwo hatte ich mich mit den Deklarationen verheddert. Jetzt erzeugt die App beim Start eine shared Instanz, auf die die anderen Fenster Zugriff haben.
War dann auf einmal gar nicht so schwer. Vielen Dank dir jedenfalls!

Wenn Du richtig OO lernen willst, schau Dir mal das Buch “Head First Design Patterns” an. Christians Code ist nicht so wirklich OO. Aber es kommt immer darauf an, wie gro Dein Tool werden soll. Fr manches ist OO einfach overkill. Aber eine gute Abstraktion ist immer hilfreich.

Danke dir, Beatrix. Ich finde es uerst spannend, endlich mal in halbwegs korrektes OO einzusteigen (bei OBj C bin ich immer an der Syntax gescheitert) und lerne momentan tglich dazu. Gibt ja dabei oftmals mehrere Methoden, zum Ziel zu kommen, und ich schiebe fleiig Code hin & her, um ihn in die angemesseneren Klassen zu packen. Werd mir das Buch gerne mal anschauen.