Ini-File

Hi, wie kann ich als blutiger Anfnger eine Art Ini-File anlegen?
Es sollen nur einige Parameter beim Programmstart eingelesen werden, zwischendrin und beim Beenden wieder gespeichert werden.
Leider erlaubt Xojo anscheinend nur das Abspeichern mit Dialog.
Wie kann ich die paar Zahlen ohne Riesenaufwand automatisch und ohne Dialog speichern und einlesen?
Ich sitze seit zig Stunden an diesem Problem. Alle Beispiele sind (fr mich) ungeeignet, weil viel zu kompliziert, am ziel vorbei oder weit darber hinaus. Ich brauche das einfach (in VB6.0 war das kein Problem).

Danke fr die Hilfe!

dim FI as FolderItem
dim TIS as TextInputStream
dim Daten as string
//******************
FI = new FolderItem
FI = FI.Child (“Connect.txt”) // öffnen der datei im App-Folder
if FI.Exists = TRUE then
TIS = TextInputStream.Open(FI)
app.Connect = TIS.ReadLine
TIS.Close
end if

dim FI as FolderItem
dim TOS as textOutputStream
//******************
FI = new FolderItem
FI = FI.Child (“Connect.txt”)
TOS = TextOutputStream.Create(FI)
TOS.WriteLine (“HALLO”)
TOS.Close

Hmmm. Hi Stefan!

Das ist mein Problem. Irgendwie bin ich selbst für vorgefertigte Lösungen zu dusselig. Das läuft zwar fehlerfrei ! :slight_smile:
dim FI as FolderItem
dim TOS as textOutputStream
//******************
FI = new FolderItem
FI = FI.Child (“Connect.txt”)
TOS = TextOutputStream.Create(FI)
TOS.WriteLine (“HALLO”)
TOS.Close
Aber es passiert nichts! :frowning:
Es wird keine Datei angelegt oder die im selben Ordner angelegte Datei “Connect.txt” beschrieben.
Anscheinend ist DAS das Problem!?!


Das obere Beispiel mit dem Schreiben in den App-Folder funktioniert nicht, weil ich sowas nicht habe? (oder finde?)

du kannst das mal versuchen
PreferencesExample

(musst nur SavePrefs und LoadPrefs anpassen)

SavePrefs

  Preferences.Set("MainWindowLeft") = Window1.Left
  Preferences.Set("MainWindowTop") = Window1.Top
  Preferences.Set("MainWindowWidth") = Window1.Width
  Preferences.Set("MainWindowHeight") = Window1.Height
  Preferences.Set("MainWindowBG") = str(Window1.BackColor)

LoadPrefs

Window1.Top = Preferences.Get("MainWindowTop")
Window1.left = Preferences.Get("MainWindowLeft")
Window1.Width = Preferences.Get("MainWindowWidth")
Window1.Height = Preferences.Get("MainWindowHeight")
Window1.BackColor = Preferences.Get("MainWindowBG")

Ohgottogott!
Das Beispiel luft auch nicht. Die Datei Picker16 fehlt. Habe versucht eine andere Bilddatei zu verwenden. Ohne Erfolg. Ist Picker16 ein Icon? Meins wurde nicht angenommen :frowning:
Auerdem brauche ich Tage um mich in das komplexe Programm ein zu lesen. Mit Construktoren, Pref Datentypen, Operator Lookups und solchen Sachen.
Ich will doch nur n paar Zahlen speichern… ! :frowning:

Klar funktioniert das Beispiel - zumindest hier unter Mac OS. Picker16 wird nicht referenziert. Also einfach löschen. Außerdem brauchst Du nur die Notiz zu lesen, um den Code benutzen zu können:

Manages your local application preferences. Preferences are loaded and saved
automatically.

Usage:

In your App.Open event, call PreferencesModule.Initialize(“MyAppName”)
before using the PreferencesModule

Preferences.Load loads your preferences
Preferences.Save saves your preferences

To assign preferences values:

Preferences.PrefName = value Or Preferences.Set(“PrefName”) = value
value = Preferences.PrefName Or value = Preferences.Get(“PrefName”)

If you attempt to access a preference that does not exist, a
PreferenceNotFoundException is raised.

Für mich ist das ein riesiges, vollkommen unverständliches Programm. Um das zu beherrschen brauche ich Tage/Wochen.
Sowas kann ich nicht in mein “Projekt” einbetten.
Ich will nur einen String speichern. Automatisch. Ohne diesen Dialog. Mehr nicht…

dann bau dir was mit textoutputstream/textinputstream.

Danke! So schlau bin ich auch :slight_smile:
Das funktioniert aber alles nicht. Das einzige was klappt ist das hier:

Datei = FreeFile Open App.Path & "\\Ini.txt" For Input As #Datei Input #Datei, Parameter1 Input #Datei, Parameter2 Input #Datei, Parameter3 Close #Datei

[quote=103207:@Peter Marx]Danke! So schlau bin ich auch :slight_smile:
Das funktioniert aber alles nicht. Das einzige was klappt ist das hier:[/quote]

Alle die hier antworten, tun das in ihrer freien Zeit. Lerne das zu schätzen. Eine für Dich unnütze Antwort mag einmal einem anderen helfen.

Das funktioniert aber alles nicht. Pauschalisieren ist immer falsch (ausser in dieser Aussage selbst). Selbstverständlich funktioniert es. Beide Lösungen habe ich schon verwendet.

Du solltest mal einen Benimmkurs besuchen. Höflichkeit zahlt sich aus. Ausrufen macht Dich - zu Recht - unbeliebt.

Und nicht zuletzt: Xojo is Visual Basic - und war es auch nie. Es war von Anfang an eine OOP-BASIC-Version und es gibt daher viele Unterschiede zu VB. Es ist auf eine Art näher bei VB .NET (minus das .NET Framework).

Hallo, das mit dem Benimmkurs ist vielleicht ein guter Ratschlag, den ich beherzigen kann, sobald ich meine Xojo-Probleme gelöst habe. Weiterhin glaube ich aber, daß es kein guter Tip ist, hier ein “bau Dir was mit …” einzuflechten. Das ist nicht hilfreich. Das versuche ich in etlichen Versionen. Seit heute Morgen. Das gleiche Problem besteht in einem englischsprachigem Forum. Hier habe ich fertige Codebeispiele bekommen, die anscheinend überall laufen. Nur auf meinem Xojo (Linux Mint 16, Mate) NICHT laufen. Möglicherweise einer der vielen Bugs? (so wie Single = Integer?)

Jetzt fängst Du noch an über Bugs zu schwadronieren… Ich beende in beiden Threads meine Mitarbeit.

also es geht auch mit TextInputstream:

dim f as folderitem = getfolderitem("datei.ini") dim t as textinputstream = textinputstream.open(f) t.encoding = encodings.utf8 dim Parameter1 as string = t.readline dim Parameter2 as string = t.readline dim Parameter3 as string = t.readline

zuzüglich Fehlerhandling.

Hallo, vielen Dank, aber das funktioniert auch nicht :slight_smile:
Ich habe das Ganze noch mit einem “t.Close” beendet.
Stimmt das?
In der zweiten Zeile findet zur Laufzeit eine IOEception statt.

dim f as folderitem = getfolderitem("Test.txt") dim t as textinputstream = textinputstream.open(f) FEHLER: IOException t.encoding = encodings.utf8 dim Parameter1 as string = t.readline dim Parameter2 as string = t.readline dim Parameter3 as string = t.readline t.Close End Sub

close is optional. Die Exception kommt vermutlich weil die Datei nicht da ist.

Die Datei steht im Projektordner. Ist das nicht richtig?

Na er wird sie suchen, wo auch das Programm ist.
Und wenn das woanders ist, geht es nicht.

Jaja, das wei ich ja alles. Genau das ist ja das Problem. Ist das “Programm” da wo das “Test.xojo_binary_project” ist? Genau da ist die Datei und da brauche ich die auch. Geht aber nicht! :frowning:
Dieser Code aus dem englischen Forum funktioniert zwar Top, legt aber die Datei unter Linux im Home-Ordner und unter Win7 im Dokumente-Ordner ab.

dim FI as FolderItem dim TOS as textOutputStream //****************** FI = SpecialFolder.ApplicationData() FI = FI.Child ("Connect.txt") TOS = TextOutputStream.Create(FI) TOS.WriteLine ("HALLO") TOS.Close
Der Specialfolder CurrentWorkingDirectory ist mir auch noch zu ungenau. Ich mchte die Datei IMMER im Projektordner stehen.

also in dem Ordner in dem sich das Programm befindet?

(Die Zeile “fileparent = app.ExecutableFile.Parent.Parent.Parent.Parent” mußt du für Windows oder LINUX anpassen, sicher ein paar parents weniger …)

dim file, fileparent as FolderItem
dim tos as textOutputStream
  
  fileparent = app.ExecutableFile.Parent.Parent.Parent.Parent
  'MsgBox fileparent.NativePath
  file = fileparent.Child("Connect.txt")
  
  if file <> nil then
    tos = TextOutputStream.Create(file)
    tos.WriteLine ConvertEncoding("HALLO",Encodings.UTF8)
    tos.Close
  else
    MsgBox "Error"
  end if

Auch beim Debuggen/Programmieren? Dann schau Dir mal die Möglichkeit an, BUILD SETTINGS zu erstellen. Da kannst Du nämlich VOR dem Aufruf des Programms bestimmte Dateien in den DEBUG-Ornder kopieren.

Wenn Du den Ordner des fix und fertig erstellten Programms brauchst, hilft das weiter:

dim FI as FolderItem
  dim TOS as textOutputStream
  //******************
  FI = getfolderitem("")
  FI = FI.Child ("Connect.txt")
  ...

Zu beachten ist aber, dass standardmäßig alle Programme in einem Ordner untergebracht werden, wo ‘normale’ Benutzer (nicht Administrator/root) keinen Schreibzugriff haben, also ein Lesen der Einstellungen funktioniert, ein neuerliches Schreiben der Datei als Standard-Benutzer aber fehlschlägt. Da würde ich lieber die o.a. Version mit dem Specialfolder.ApplicationData() und evtl. der Ordnung halber einem Unterordner für Dein Programm verwenden.

dim FI as FolderItem
  dim TOS as textOutputStream
  //******************
  FI = SpecialFolder.ApplicationData()
  FI = FI.Child ("Connect.txt")
  ...

Das mit den 3, 4, 5 Parent Angaben find ich nicht empfehlenswert. Kann klappen, muss aber nicht.