Seite 1 von 1

dc_iniread auswerten

Verfasst: Mi, 09. Okt 2019 13:34
von Manfred
Hi,
wenn ich mit dc_iniread einen Wert suche und auslese, dann bekomme ich in einen leeren String zurück wenn kein Wert gefunden wurde. Aber auch, wenn kein Wert vergeben wurde. Kann man nicht irgendwie ermitteln, ob der Wert nur leer war, oder gar nicht als Parameter vorhanden in der Datei?

Re: dc_iniread auswerten

Verfasst: Mi, 09. Okt 2019 17:37
von Herbert
Hallo Manfred
Beim Lesen von .ini-Files gilt immer, dass du einen Defaultwert mitgibst, falls der Wert nicht gefunden wird.
Das sollte doch bei dc_iniread auch so sein oder? Sonst müsstest dein eigenes Ini-kreieren.
Ich hatte da mal eine eigene Klasse für Xbase.

Re: dc_iniread auswerten

Verfasst: Mi, 09. Okt 2019 17:43
von Manfred
Hi herbert,
bei der Funktion gebe ich mit welche Gruppe und welcher Parameter. Dann gibt die Funktion den Wert zurück der drin steht. Wenn nichts steht oder der Wert nicht vorhanden ist, dann gibt es immer 0 zurück oder leer.

Re: dc_iniread auswerten

Verfasst: Mi, 09. Okt 2019 18:43
von Wolfgang Ciriack
Wozu ist das wichtig, ob er nicht vorhanden ist oder leer ?
In beiden Fällen hast du keinen Wert :D

Re: dc_iniread auswerten

Verfasst: Do, 10. Okt 2019 7:12
von Manfred
richtig, nur wenn der Wert leer ist, dann muß ich nichts zurückschreiben. Wenn der Wert aber nicht eingetragen ist, dann muß er angelegt werden.

Re: dc_iniread auswerten

Verfasst: Do, 10. Okt 2019 8:17
von Wolfgang Ciriack
Aber es würde ja nicht stören, wenn du immer den Wert, egal ob vorhanden oder nicht, zurückschreibst ?

Re: dc_iniread auswerten

Verfasst: Do, 10. Okt 2019 8:28
von Manfred
Hi Wolfgang,
es geht um ein recht blödes Problem. Am Anfang wird die Konfigdatei ausgelesen und im Zweifelsfall ergänzt. Jede WS hat eine zusätzlich eigene für sich gültige INI Datei, für abweichende Werte der Grundkonfiguration. Jetzt hatte ich folgendes Problem: Der User startet sein Programm und es erscheint nicht binnen 0,00001 Sekunde am Bildschirm. Was macht der User? Er klickt und klickt und klickt ....... Und jedesmal wird im Hintergrund das Programm aufgerufen. Endergebnis irgendwie wurde die INI Datei immer größer und größer, weil jeder Programmaufruf was reingeschrieben hat. Teilweise war die INI Datei statt 1200KB 2MB groß. Ob das jetzt wirklich mit dem unnötigen Schreiben zusammenhängt, war mir nicht mögloich zu ermitteln. Auf jeden Fall stand das System still. OK, jetzt habe ich das mit Mutex wohl in den Griff bekommen, das die Programme nur noch 1x aufgerufen werden können und das bevor die INI Dateien ausgelesen werden. Ich weiß aber nicht ob das die zukunftsweise Lösung ist. Das wird die Praxis zeigen. Leider ruft Roger mehrere Funktionen nacheinander auf um die Ini Dateien zu bearbeiten, deshalb wird es wohl auch schwer möglich sein, so eine Textdatei exklusiv versuchen zu öffenen um dann eben zu warten, oder eine Meldung am Bildschirm auszuwerfen.

Re: dc_iniread auswerten

Verfasst: Do, 10. Okt 2019 8:31
von Herbert
Manfred hat geschrieben: Mi, 09. Okt 2019 17:43 Hi herbert,
bei der Funktion gebe ich mit welche Gruppe und welcher Parameter. Dann gibt die Funktion den Wert zurück der drin steht. Wenn nichts steht oder der Wert nicht vorhanden ist, dann gibt es immer 0 zurück oder leer.
Ja, das habe ich verstanden. Aber warum gibst du keinen Defaultwert mit, wie das bei normalen Iniread-Funktionen der Fall ist? Windows gibt das sogar vor mit GetPrivateProfileString.
Falls du keinen Defaultwert mitgeben kannst, ist die Funktion nicht fertig gedacht und müsstest auf andere Art das .INI-File lesen.

Re: dc_iniread auswerten

Verfasst: Do, 10. Okt 2019 8:40
von Manfred
weil der Defaultwert in der Hauptini steht, der auch einmalig gesetzt wird beim Erzeugen. Die WS INI dient nur der Überschreibung, falls der Wert anders ist. So kann man direkt sehen, welcher Wert im Zweifelsfalle wie abweicht. Außerdem ist das jetzt hier nur ein Beispiel und soll nicht dazu dienen zu philosophieren warum ich es nicht anders mache.

Re: dc_iniread auswerten

Verfasst: Do, 10. Okt 2019 19:06
von Wolfgang Ciriack
Hallo Manfred,
mache dir doch eine GetSet-Funktion, solange die Ini-Datei gelesen/geschrieben wird.

Code: Alles auswählen

static function IniReadIsRunning(lSet)
static lIsRunning:=.F.
if pcount()>0
   lIsRunning:=lSet
endif
return lIsRunning
In deiner LeseRoutine dann den als erstes den Aufruf

Code: Alles auswählen

if IniReadIsRunning()
   ** Meldung läuft schon...
   return
endif
IniReadIsRunning(.T.)
..Ini-Datei Lesen
IniReadIsRunning(.F.)
return
Damit kann dann die Ini-Datei nur einmal gelesen/geschrieben/ergänzt werden.

Re: dc_iniread auswerten

Verfasst: Do, 10. Okt 2019 21:50
von Tom
Das hilft nur innerhalb der Instanz, Wolfgang.

Re: dc_iniread auswerten

Verfasst: Fr, 11. Okt 2019 5:28
von ramses
Verwende für die Parameter eine Datenbank oder baue dir deine eigene Funktion und das Problem geht weg.

dc_readini() ist nicht für Netzwerk/Multiuser/Mehrfachzugriff geeignet. Wie du in den ersten Zeilen des Sourcecodes leicht feststellen und selbst erlebt hast. Deine Lösung mit Mutex ist keine Lösung des Problems sondern nur der verzweifelte Versuch die Situation des Mehrfachzugriff zu verhindern ..... zudem mit dem Nachteil dass auch wenn du das willst die App nicht ein 2. Mal öffnen kannst.