Entwickler-Ecke

Dateizugriff - INIs bearbeiten ohne Sektionen?


Majinor - Di 09.09.03 22:49
Titel: INIs bearbeiten ohne Sektionen?
Ahoi leuts,
ich progge staendig mal ein paar kleine Tools fuer einige exoten Games. Derzeit bin ich bei einem Game was sehr viel mit inis arbeitet damit andere Leute es leichter veraendern koennen.
Tjo leider gibts n kleines prob und zwar arbeitet das Game ohne Sektionen.
Also statt:

Quelltext
1:
2:
3:
[Sektion1]
Typ=123
Typ2=321

Sind ledeglich werte da

Quelltext
1:
2:
Typ=123
Typ2=321


Wie kann ich jetzt die Werte in Delphi veraendern?


Delete - Di 09.09.03 23:12

Zeilenweise einlesen und die Werte selbst parsen (bspw. in eine Stringliste schieben, o.ä.). Die TIniFiles-Unit unterstützt IMHO eben nur das typische INI-Format mit Sektionen.


recall - Mi 10.09.03 01:43

hehe ist doch ultraleicht ;)

Mach eine neue Datei (Textfile).
Schreib [irgendwas] rein, dann kopierst du die Spieledatei in die neue Datei, jetzt hast du dein Sektion !

Jetzt an der Datei rumpfuschen (mit ini...)

Schließen, Zeile 2 bis Ende zurückkopieren, fertig !

Wahrscheinlich ist das aber genauso umständlich, wie das selber einlesen !
Nur du hast halt die Möglichkeiten von ini-files (sind ja nicht viele).

Viele Grüsse.


Delete - Mi 10.09.03 08:18

He, gute Idee, zu der mir doch gleich TMemIniFile (s. Delphi-Hilfe) einfällt.


cbs - Mi 10.09.03 09:30

huhu wiedermal

du kannst auch bei TStrings bleiben .. du ließt die ini in ein TStringList object ein und kannst dann mit der eigenschaft names und values auf die einträge zugreifen OHNE sektionen

property Names[Index: Integer]: string;
index ist die Zeile - 1 und gibt den bezeichner des eintrags zurück

property Values[const Name: string]: string;
name ist der (nur einmalvorkommende) bezeichner des eintrags und gibt desen wert zurück

z.B.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
// Inhalt der Ini
// Zeile 1: Top=1
// Zeile 2: Left=5
// Zeile 3: progName=test

var str: TStrings;
begin
  str:= TStringList.Create;
  str.LoadFromFile('game.ini');
  // wert von eintrag 2 anzeigen
  showmessage(str.Values[str.names[1]]);
  str.Free;
end;

// ausgabe: 5


matze - Mi 10.09.03 13:34

das probelm dabei ist, dass values nur arbeitet wenn die zeile test=bla heisst. wenn die zeile test = bla ist geht das ganze schon nichtmehr. und wenn ein unser selber in der datei rumpfuscht, dann kann das schonmal passieren dass zwischen den worten und dem istgleich ein leerzeichen ist !!!

am besten routinen zum selber parsen schreiben !


cbs - Mi 10.09.03 18:51

matze hat folgendes geschrieben:
das probelm dabei ist, dass values nur arbeitet wenn die zeile test=bla heisst. wenn die zeile test = bla ist geht das ganze schon nichtmehr


also ich hab grad mal nen kleines test programm geschrieben und die sache mal ausprobiert.. der bezeichner als auch der wert wird korrekt wiedergegeben MIT leerzeichen

der bezeichner heißt dann eben 'test ' und der wert ' bla'

mag man die leerzeichen nicht haben trimt man das ganze eben mit

function Trim(const S: string): string;

die function entfernt alle leer- und steuerzeichen am anfang und ende des strings



matze hat folgendes geschrieben:
am besten routinen zum selber parsen schreiben !


genau! und das is der erste schritt dazu -> sprich: der rest isn kinderspiel


matze - Mi 10.09.03 20:06

also bei mir (D5) geht das nicht, wenn vor und nach dem = keerzeichen sind !!! und die bekommst du mit trim nicht weg !!!


cbs - Mi 10.09.03 20:54

matze hat folgendes geschrieben:
also bei mir (D5) geht das nicht


hab das mit delphi 6 und 7 getestet.. damit gehts problemlos..

tjo wenn nich dann eben selbst die strings auseinanderpflücken.. aber das is ja auch net sooo schwierig da ja bezeichner und wert durch nur ein eindeutiges zeichen getrennt werden

@Majinor mit

function Pos(Substr: string; S: string): Integer;

kannst du nach dem istgleich pro string suchen und entsprechend den string vor und hinter dieser position in 2 strings aufteilen..


matze - Do 11.09.03 15:52

dann hab die das seit D5 geändert !!! fies :|