Globale Variable in iOS

Hallo,
ich bin ein neuer in Xojo, komme von VB6 und wollte das Programmieren von iOS Apps als Hobby betreiben.
Wo ich einige Verstndnisprobleme habe ist :
In VB6 konnte ich eine Variable oder Array beim Programmstart zuweisen
“Global xyz (10 ) as String”
und im gesamten Programm darauf zugreifen. Wie funktioniert das in iOS von Xojo bzw. wie kann ich das an das nchste View bergeben.
Vielen Dank fr eine Hilfe, bestimmt ist das fr die meisten Profis eine Kleinigkeit.
Danke Gerd

Hallo Gerd,
das ist keine sehr iOS-spezisische Frage, das Prinzip gilt überall. Auf Englisch wurde es auch schon ein paar Mal beantwortet, aber in der deutschen Rubrik wohl nicht.

Für globale Variablen hast du mehrere Möglichkeiten. Einerseits kannst du eine Shared Property im App-Objekt definieren. Dann greifst du auf sie zwar nicht unter dem Namen alleine zurück, sondern in die Klasse eingebaut:

Dim myXYZ As Text = App.xyz

Oder du legst ein Modul an, bennest es sinnvoll (z.B. “Globals”) und erstellst darin deine Property. Dann ist sie programmweit unter nur diesem Namen verfügbar, also

Dim myXYZ As Text = xyz

Ich würde allerdings empfehlen, den Scope der Eigenschaft auch bei einem Modul auf Protected zu setzen. Dann hast du zwar etwas mehr Tipperei, indem du das Modul wieder explizit angeben musst, aber das erspart dir Scherereien, solltest du versehentlich irgendwo eine gleichnamige lokale Variable verwenden.

Einen Parameter willst du dem View wahrscheinlich direkt bei der Anlage übergeben? Oder später?
In beiden Fällen liefe es darauf hinaus, eine Subklasse von iOSView anzulegen, die eine Property dafür bekommt.
Und im “ordentlichsten” Fall könntest du den Parameter direkt im Constructor deiner CustomView-Klasse übergeben. xyz wäre hier eine Klassen-Eigenschaft der iOSView-Subklasse:

Sub Constructor(myxyz as Text) // Calling the overridden superclass constructor. Super.Constructor xyz = myxyz End Sub

Hallo Ulrich,
ja, da hast du recht. Ich möchte beim App-Start eine Konfigdatei einlesen und einer Globalen Variablen zuweisen. Auf diese Konfigurationsparameter möchte ich dann über alle View’s zugreifen können bzw. verändern. Dann natürlich beim beenden wieder in die Konfigdatei speichern.
Ich probiere das mal mit app.xyz
SInd dann alle Werte, die ich in der Variablen speichere über alle View’s vorhanden ?

Meinst du damit, ob alle Views darauf zugreifen können? Bei einer globalen oder geshareten Klasseneigenschaft ja.

Wie es der Zufall so will, habe ich jüngst was zu den Verfügbarkeiten von Poperties geschrieben. Globale Variablen werden häufiger mal gefragt, dafür sollte ich vielleicht noch einen Absatz ranhängen:
http://xojoblog.me/2015/02/25/teilen-oder-fur-mich-behalten/

Hi Ulrich, Ashot hat mir das geschrieben.
Ashot Khachatryan 1 hour ago
Create a module called “Globals”. In that module add the global property you want (yz(10) as String), with the scope “Public”.

And then access the variable from anywhere in your application!

Ich bekomme aber jetzt eine NilObjectExeption
Wo liegt mein Fehler ? Also nicht beim compilieren sondern erst im Run

Ich hab das mal genauso nachgebaut (in einem Desktop-Projekt – wenn du String verwendest, geht es dir gar nicht um iOS, oder?) und habe keine Probleme damit. Die Exception deutet eigentlich darauf hin, dass das Array nicht ordentlich initalisiert wurde. Ist das wirklich ein String-Array oder hältst du andere Objekte darin, die zur Zugriffszeit noch gar nicht initialisiert sind?

Hallo Ulrich,
ich habe folgende Lösung gefunden. Ich muss in jedem View bei Event - Activate folgende declaration
Kann ich irgend wie ein Bild hochladen ? Und ja, es geht erst mal nur um iOS, das ist erst mal meine wichtigstes Projekt

if ValueXYZ = nil then
ValueXYZ = new Value
end if

a) Konzentriere Dich erst einmal darauf, OO in Xojo richtig zu verstehen. Dann auf’s iOS.
b) Poste lieber Dein Projekt als einen Screenshot.
c) Dein Objekt mu irgendwo leben. Also, wenn Du es erzeugt hast im Modul, mu Du das irgendwie herumreichen als Parameter. Jedesmal neu erzeugen, macht nicht viel Sinn.

Hallo Zusammen,
vielen Dank erst mal für Eure Tips und Hilfe, bin schon seit 3 Wochen dran und war schon fast ein wenig verzweifelt. Jetzt funktioniert es erst mal und ich bin zufrieden, verbessern kann ich den Code immer noch.
Soll ich Dropbox verwenden oder funktioniert auch Googledrive.
den Vorschlac “c)” von Beatrix muss ich dann als nächstes verstehen und verbessern.
Danke Gerd

https://drive.google.com/file/d/0B0h99F2CUB6JOFdJUWF1dnZuYVk/view?usp=sharing

Oh, also wenn du dich so lange mit einem Problem herumschlgst, dann nur los mit den Fragen! Zweifellos hat Beatrix ebenso recht, als deine Fragen darauf hindeuten, dass du noch ein wenig mit der Konzeption von OOP zumindest ihrer Darstellung in Xojo zu kmpfen hast. Das kann allerdings auch ein Brocken sein, und manchmal hilft da nix anderes als eben doch nach Grundlagen fragen, selbst wenn diese noch so oft in irgendwelchen Referenzen stehen mgen (und manchmal auch durch die Suchfunktion des Forums auffindbar sind). Mitunter also mir ist das des fteren passiert, und ich glaube nicht, dass dieser Prozess abgeschlossen ist fallen dadurch diverse andere Puzzlestcke auch von ganz alleine auf die richtigen Position.

Zu Beatrix Post noch zwei Anmerkungen, nmlich zu b) und c) :wink:

Ich glaube, Beatrix meinte eher, poste lieber dein Projekt als solches, keinen Screenshot davon. Dann kann man das schnell mal laden und ggf. im Debugger nachspren. Bei vertraulichen Projekten ggf. per direkter Nachricht an Personen deines Vertrauens, und bei kleinen Code-Problemen (“Warum funktioniert diese Schleife nicht?”) kannst du den Code einfach aus Xojo herauskopieren und hier im Forums-Editor am besten mit dem Code-Tag formatieren.

Wenn doch mal ein Screenshot angesagt ist, kannst du den in der Tat mit Google Drive oder Dropbox/Public Folder verfgbar machen und den Link mit einem Image-Tag versehen dann erscheint das Bild direkt hier im Forumspost.

Und zu c: Deine Beschreibung klingt so, als wrdest du immer, wenn ein Geschehnis auftritt, das ganze Objekt erzeugen, um es darzustellen oder zu verarbeiten. Dadurch entsteht ggf. eine Menge Overhead in deinem Code durch hufige Allozierungen und Freigaben von Objekten im Speicher. Wenn du eine bestimmte (durchaus auch variable) Anzahl von Objekten dauerhaft wiederkehrend bentigst (die 10 im Array deutet darauf hin), ist es viel sinnvoller, sie am Leben zu halten. Du kannst die Objekte z.B. einem Array zuordnen, das im App-Objekt oder in einem Modul deklariert ist. Dann leben sie, so lange sie in diesem Array eingetragen sind und ihr Mutterobjekt das App-Objekt resp. Modul besteht, also i.d.R. fr die ganze Laufzeit des Programms.

Wenn dann etwas weitergereicht werden soll, machst du das z.B. per Public Computed Property, die bei Dateneingang im Objekt gleich die Verarbeitung auslst, per Interface oder oder da kennst du bestimmt aus VB eine Menge Mglichkeiten, die du mit sehr groer Wahrscheinlichkeit auch in Xojo finden wirst.

Ach so, und zu diesem noch:

[quote=171618:@Gerd Hofmann]if ValueXYZ = nil then
ValueXYZ = new Value
end if[/quote]

Genau das meinte ich mit

Bei Datentypen wie String, Text, Double, Single reicht es, ein Array in gewünschter Gröe zu dimensionieren, um es gleich mit den Vorgabewerten des Datentyps zu füllen. Benutzt du hingegen Strukturen oder Objekte, musst du diese – bzw . das Array – mit New initialisieren. Da reicht ein Dim nicht. Du kannst es dir so vorstellen, dass für alle Objekte nur ein Ptr reserviert wird. Der ist standardmäßig erst mal NIL. Erst mit New wird der Speicher für das Objekt reserviert und der Ptr auf dieses Objekt gesetzt.