Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi TMemINI ohne Leerzeichenkiller ? (https://www.delphipraxis.net/93986-tmemini-ohne-leerzeichenkiller.html)

moelski 14. Jun 2007 10:20


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:
[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
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:
Code:
[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
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.
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:

shmia 14. Jun 2007 11:09

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.

moelski 14. Jun 2007 11:12

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 :-(

TeronG 14. Jun 2007 11:47

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.

Cappuccino 14. Jun 2007 11:51

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

TeronG 14. Jun 2007 12:00

Re: TMemINI ohne Leerzeichenkiller ?
 
Zitat:

Zitat von Cappuccino
...du diese Original-Funktion überschreibst ohne das Trim.

Glaube nicht, daß das so einfach geht :gruebel: die Parameter müssten dann ja 'Zeitbasis ' heißen und nicht 'Zeitbasis'... :gruebel: aber wenn man da n offset für's '=' reinschieben könnte :gruebel:

EDIT:
Delphi-Quellcode:
S := Ident + '=' + Value; // <-- davor gugn wie lange ident ist und die fehlenden stellen mit ' ' füllen!?
quelle: Inifiles.pas

marabu 14. Jun 2007 12:49

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

moelski 14. Jun 2007 13:33

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

shmia 14. Jun 2007 14:31

Re: TMemINI ohne Leerzeichenkiller ?
 
Zitat:

Zitat von moelski
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.

Die Funktionen könnte man nachbilden. Wichtig ist dann, dass ein Filename im Konstruktor
ü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 12:22 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz