AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TMemINI ohne Leerzeichenkiller ?

Ein Thema von moelski · begonnen am 14. Jun 2007 · letzter Beitrag vom 14. Jun 2007
Antwort Antwort
moelski

Registriert seit: 31. Jul 2004
1.110 Beiträge
 
Delphi 2010 Professional
 
#1

TMemINI ohne Leerzeichenkiller ?

  Alt 14. Jun 2007, 10:20
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
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

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.
Dominik Schmidt
Greetz Dominik

I love Delphi 2007/2010
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#2

Re: TMemINI ohne Leerzeichenkiller ?

  Alt 14. Jun 2007, 11:09
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.
Andreas
  Mit Zitat antworten Zitat
moelski

Registriert seit: 31. Jul 2004
1.110 Beiträge
 
Delphi 2010 Professional
 
#3

Re: TMemINI ohne Leerzeichenkiller ?

  Alt 14. Jun 2007, 11:12
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
Dominik Schmidt
Greetz Dominik

I love Delphi 2007/2010
  Mit Zitat antworten Zitat
Benutzerbild von TeronG
TeronG

Registriert seit: 19. Jul 2004
Ort: München
960 Beiträge
 
Delphi 2007 Professional
 
#4

Re: TMemINI ohne Leerzeichenkiller ?

  Alt 14. Jun 2007, 11:47
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.
龍 Der Unterschied zwischen Theorie und Praxis ist in der Praxis größer als in der Theorie.
  Mit Zitat antworten Zitat
Cappuccino

Registriert seit: 25. Okt 2006
68 Beiträge
 
Delphi 6 Enterprise
 
#5

Re: TMemINI ohne Leerzeichenkiller ?

  Alt 14. Jun 2007, 11:51
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
  Mit Zitat antworten Zitat
Benutzerbild von TeronG
TeronG

Registriert seit: 19. Jul 2004
Ort: München
960 Beiträge
 
Delphi 2007 Professional
 
#6

Re: TMemINI ohne Leerzeichenkiller ?

  Alt 14. Jun 2007, 12:00
Zitat von Cappuccino:
...du diese Original-Funktion überschreibst ohne das Trim.
Glaube nicht, daß das so einfach geht die Parameter müssten dann ja 'Zeitbasis ' heißen und nicht 'Zeitbasis'... aber wenn man da n offset für's '=' reinschieben könnte

EDIT:
S := Ident + '=' + Value; // <-- davor gugn wie lange ident ist und die fehlenden stellen mit ' ' füllen!? quelle: Inifiles.pas
龍 Der Unterschied zwischen Theorie und Praxis ist in der Praxis größer als in der Theorie.
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#7

Re: TMemINI ohne Leerzeichenkiller ?

  Alt 14. Jun 2007, 12:49
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
  Mit Zitat antworten Zitat
moelski

Registriert seit: 31. Jul 2004
1.110 Beiträge
 
Delphi 2010 Professional
 
#8

Re: TMemINI ohne Leerzeichenkiller ?

  Alt 14. Jun 2007, 13:33
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
Dominik Schmidt
Greetz Dominik

I love Delphi 2007/2010
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#9

Re: TMemINI ohne Leerzeichenkiller ?

  Alt 14. Jun 2007, 14:31
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;
Andreas
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:44 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