![]() |
TMemINI ohne Leerzeichenkiller ?
Moin !
Also, wir ham da Geräte INIs in denen wir allen möglichen Kram abspeichern. Diese INIs sind formatiert und sehen in etwa so aus:
Code:
Soweit sogut. Nun müssen wir aber die INI über TMemINI einlesen, weil wir sie darüber in unsere Dateien integrieren. Auch das ist stressfrei. Aber wenn man die Datei aus TMemINI wieder auf Platte schreiben lässt, dann passierts :cyclops:
[Gerät]
####################################################################### ## Akkumatik Einstellungen ## ####################################################################### ## Welches Gerät ist angeschlossen? ## Name = Akkumatik Hersteller = Stefan Estner ## 01 - Ladegeräte 02 - Datenlogger 03 - Lipo Balancer ## ## 04 - Stromsenken 05 - Netzteile 06 - GPS ## ## 07 - Empfänger 08 - Multimeter ## Gruppe = 01 Device_ID = ID_AKKUMATIK ## 1 = in LV verwendet 0 = NICHT verwendet ## Used =1 Abbildung = Akkumatik.jpg ChangeSettings = 0 HerstellerLink1 = [url]http://www.akkumatik.de[/url] [Anzeige Einstellungen Kanal 01] Zeitbasis = Zeit Einheit = s Symbol = t ## inkl Zeit !!! WerteAnzahl = 13 Messgröße1 = Spannung Einheit1 = V Symbol1 = U Faktor1 = Offset1 = Skalierung1 = GaugeMaxWert1 = 12 LinieAktiv1 = 1
Code:
Und das sieht nur furchtbar aus. Ich weiss was jetzt die meisten Leute denken ... INIs sind für Programme und brauchen nicht unbedingt vom Anwender gelesen werden.
[Gerät]
Name=MiniLogger Hersteller=LogView ## 01 - Ladegeräte 02 - Datenlogger 03 - Lipo Balancer ## ## 04 - Stromsenken 05 - Netzteile 06 - GPS ## ## 07 - Empfänger 08 - Multimeter 09 - OpenFormat ## Gruppe=09 Device_ID=ID_OPENFORMAT ## 1=in LV verwendet 0 = NICHT verwendet ## Used=1 Abbildung=OpenFormat.jpg ChangeSettings=1 HerstellerLink1=http://www.logview.info [Anzeige Einstellungen Kanal 01] Zeitbasis=Zeit Einheit=s Symbol=t ## inkl Zeit !!! WerteAnzahl=9 Messgröße1=RC Kanal Einheit1= Symbol1= Faktor1= Offset1= Skalierung1= GaugeMaxWert1= LinieAktiv1=1 Es ist aber so, dass man ab und an dem User helfen muss und wenn ich ihn dann in so eine leerzeichengekillte INI lotze, dann kommt das :kotz: Lange Rede kurzer Sinn ... Besteht die Möglichkeit (und wenn ja wie), dass man diese Optimierung bei TMemINI wegnimmt? Die normalen INI Dateien werden auch nicht kastriert. :gruebel: |
Re: TMemINI ohne Leerzeichenkiller ?
Die Klasse TMemIniFile kann das nicht leisten.
Man müsste eine neue Klasse schreiben, die auch alle Kommentare mitliest. (nicht ganz einfach) Ich würde einfach mit TIniFile arbeiten, und den Performanceverlust in Kauf nehmen. Wenn du in deiner Anwendung die Werte in lokalen Variablen pufferst, ist TIniFile vollkommen ausreichend! Nur wenn du in einer Schleife hunderte Male Daten aus dem Inifile abrufst, muss man TMemIniFile verwenden. |
Re: TMemINI ohne Leerzeichenkiller ?
Moin !
Wir verwenden TMemINI nicht wegen der Performance. Wir nutzen die Funktion das man TMemINI als Stringlist auslesen kann und speichern das in unseren eigenen Dateien mit ab. So hat man beim Laden unserer Dateien gleich die richtige INI Datei. Und die Stringliste wird dann an TMemINI retour übergeben und von dort holen wir die Werte. Aber ich habe fast befürchtet das es so nicht geht :-( |
Re: TMemINI ohne Leerzeichenkiller ?
Was fertiges wüsste ich auch nicht ABER:
Die ini in eine Stringlist zu bekommen ist ja bestimmt kein Problem ^^ (.loadfromfile) Dann müsstest du nur ne einfache suchroutine schreiben (pos(varname) sollte reichen) und dann 1 nach = bis ende zeile einlesen. Und beim Speichern der werte kannste das '=' ja immer an der gleichen Position schreiben. Plus noch n "bissl" Exceptionbehandlung. ^^ Man könnte auch versuchen TiniFile bzw. TMemINI anzupassen (bzw. ne kopie davon ^^) aber das wird wohl eher (noch) aufwendiger werden. |
Re: TMemINI ohne Leerzeichenkiller ?
Was hält dich davon ab, TMemIniFile abzuleiten und zu erweitern?
In der Funktion TMemIniFile.SetStrings sind "Trim" Funktionen enthalten, möglicherweise geht es schon, wenn du diese Original-Funktion überschreibst ohne das Trim. Gruß Tom |
Re: TMemINI ohne Leerzeichenkiller ?
Zitat:
EDIT:
Delphi-Quellcode:
quelle: Inifiles.pas
S := Ident + '=' + Value; // <-- davor gugn wie lange ident ist und die fehlenden stellen mit ' ' füllen!?
|
Re: TMemINI ohne Leerzeichenkiller ?
Hallo,
TMemIniFile beinhaltet eine Normierung der Name-Value-Paare, weil sonst die Zugriffstechnik auf Names und Values versagt. Eigentlich muss man hier auf eine Trennung von Daten und Formatierung drängen. Das INI-Format kennt keine Einrückungen und selbst wenn es durch einen Kniff gelingt die ursprünglichen Zeilen mit ihrer Formatierung zu erhalten, so hat man doch kaum eine Chance neue oder geänderte Zeilen harmonisch gestaltet einzufügen. Ich würde unter diesen Umständen entweder das normierte INI-Format akzeptieren oder auf XML setzen. Grüße vom marabu |
Re: TMemINI ohne Leerzeichenkiller ?
Moin !
Ich glaube ich habs ... Eine saubere Lösung gibts für dieses "Problem" scheinbar nicht. Ich mache es nun einfach so ... Nachdem TMemINI die INI weggeschrieben hat, lasse ich einfach eine kleine Funktion über das INI laufen. Also - INI laden - überall wo ein = in der Zeile ist, nach dem Bezeichner Leerzeichen einfügen (max Länge 32). - Nach dem = ein leerzeichen - vor jedem [Abschnitt] eine Leerzeile - Kommentare unberührt lassen Damit gehen zwar ein paar wenige Leerzeilen verloren, aber damit kann ich leben. So ist das ganze jedenfalls besser lesbar, als vorher. Trotzdem Danke an alle für die Tips und Ideen !!! Greetz |
Re: TMemINI ohne Leerzeichenkiller ?
Zitat:
übergeben wird (Leerstring ist dann nicht erlaubt).
Delphi-Quellcode:
TIniFileNeu = class(TIniFile)
public procedure GetStrings(List: TStrings); procedure SetStrings(List: TStrings); end; procedure TIniFileNeu.GetStrings(List: TStrings); begin List.LoadFromFile(GetValidFilename); end; procedure SetStrings(List: TStrings); begin List.SaveToFile(Filename); end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:17 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz