Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi INI-Datei sortieren (https://www.delphipraxis.net/89048-ini-datei-sortieren.html)

Uncle Cracker 25. Mär 2007 10:37


INI-Datei sortieren
 
Ich weiß, dass INI-Dateien keine Datenbank ersetzen können, nichts desto trotz habe ich sie als "Datenbank" umfunktioniert, da ich eine Datenbank brauchte die auf jedem Rechner ohne Probleme läuft ohne das man vorerst irgendetwas installieren muss...

Jetzt stehe ich aber vor einem riesigen Problem, denn ich muss die INI-Datei sortieren und bekomme es einfach nicht hin. Es müssen nur die Sections mit ihren Inhalten der Reihe nach angeordnet werden, hätte da jemand einen Vorschlag wie man es machen könnte?

Ich hatte erst an Array-Record gedacht, aber das wäre denke ich mal viel zu umständlich, es muss doch auch irgendwie einfacher gehen :roll:


:love: Thx UC

marabu 25. Mär 2007 10:43

Re: INI-Datei sortieren
 
Hallo,

du willst doch die Abschnitte nicht in der INI-Datei neu anordnen - oder? Es reicht doch, wenn du auf die Abschnitte in einer bestimmten Reihenfolge zugreifen kannst. Da du kein Sortierkriterium genannt hast, möchtest du wohl die Abschnittsnamen alphabetisch sortieren. Dazu würde ich die Abschnittsnamen mit ReadSections() in eine StringList einlesen und diese mit sortieren (Sorted := True).

Grüße vom marabu

Blackheart 25. Mär 2007 10:45

Re: INI-Datei sortieren
 
Wie wäre es mit MyBase dafür brauchst Du kein Datenbanksystem.
http://www.dsdt.info/tutorials/mybase/

EWeiss 25. Mär 2007 10:55

Re: INI-Datei sortieren
 
Habe hier Ini-format
mal ein Beispiel gepostet allerdings in VB.

Kann aber nicht sagen ob es das ist was du benötigst.
Wenn du nur die sectionen ordnen willst (leere zeile einfügen) zwischen jeder
dann ist es genau das richtige.

Vorrausgesetzt du bekommst es portiert.

gruss Emil

Uncle Cracker 25. Mär 2007 11:05

Re: INI-Datei sortieren
 
Zitat:

Zitat von marabu
Hallo,

du willst doch die Abschnitte nicht in der INI-Datei neu anordnen - oder? Es reicht doch, wenn du auf die Abschnitte in einer bestimmten Reihenfolge zugreifen kannst. Da du kein Sortierkriterium genannt hast, möchtest du wohl die Abschnittsnamen alphabetisch sortieren. Dazu würde ich die Abschnittsnamen mit ReadSections() in eine StringList einlesen und diese mit sortieren (Sorted := True).

Grüße vom marabu


Wenn ich aber nur die Sections sortiere, da ändert sich doch der Inhalt der Section oder habe ich da grad nen Denkfehler!?

Inhalt der INI-Datei

Code:
[rst]
a=1
b=2
c=3
[abc]
a=2
b=4
c=1
[ghi]
a=0
b=3
c=2
...
Jetzt soll alphabetisch so sortiert werden, dass die Section "abc" an Erster Stelle steht mit dem Inhalt "a=2", "b=4" und "c=1"...Wenn ich jetzt aber per ReadSection die Sections in eine StringList laden lasse, müsste doch der Inhalt der Section vertauscht werden...

marabu 25. Mär 2007 11:17

Re: INI-Datei sortieren
 
Mein Vorschlag zielt darauf ab, dass der Inhalt der INI-Datei gar nicht neu angeordnet wird, sondern lediglich die Zugriffsfolge im Programm festgelegt wird - quasi ein index-sequentieller Zugriff.

Nach dem Einlesen mit ReadSections() hast du in deiner Liste stehen:

Code:
rst
abc
ghi
Nach dem Sortieren deiner Liste:

Code:
abc
ghi
rst
Wenn du dann über die Liste iterierst, kannst du indexsequentiell zugreifen.

Freundliche Grüße

DGL-luke 25. Mär 2007 11:18

Re: INI-Datei sortieren
 
Hallo,

warum willst du sortieren?

Eine Datenbank z.B. wird normalerweise nicht sortiert - die Datenbankengine legt sich die Daten genau so hin, wie es performancetechnisch am günstigsten ist.

Wenn du nur dem user eine sortierte Liste anbieten willst, dann leg deinen eigenen Layer drüber.

Da die Ini-Datei (sprich, der TINIFile-Zugriffslayer) ja eh keine Indizierung hat, kannst du z.B. eine Listbox einfach sortieren. Den Namen der Section hast du ja, und mehr brauchst du nicht.

Uncle Cracker 25. Mär 2007 11:26

Re: INI-Datei sortieren
 
Ich habe das Problem, dass ich sie in ein ListView lade und eine bestimmte Zeile in einer anderen Farbe darstelle:

Delphi-Quellcode:
var
aktiv: array of Boolean;

...
aktiv[i] := ini.ReadBool(sl.Strings[i], 'Aktiv', true);
...

procedure TForm1.ListView1CustomDrawItem(Sender: TCustomListView;
  Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
begin
  if aktiv[item.Index] then
    DefaultDraw := True // item normal zeichnen
  else
    Sender.Canvas.Font.Color := clMedGray; // Schrift-Farbe Grau
end;

In dem Array steht also dann welche Zeile Aktiv, also in einer anderen Farbe dargestellt werden soll und welche nicht...nur leider ist es es nicht schön, wenn in einer ListView die Werte durcheinander sind, also habe ich die Möglichkeit gegeben sie zu sortieren, nur leider ändert sich dann auch die komplette Reihenfolge, deswegen wollte ich einfach die INI sortieren...

Ich hoffe es hat jemand verstanden was ich meine :P

yankee 25. Mär 2007 11:31

Re: INI-Datei sortieren
 
Wenn du die Liste sortieren, bleibt dir aber nichts anderes übrig, als die ganze Datei zu laden und sie dann zu sortieren.
Wenn du damit nicht von 0 anfangen willst, kannst du meinen Ini-Parser als Grundlage nehmen, denn dann musst du nach dem Parsen nur einmal kurz die ObjectList von Sectiosn sortieren (TYIniFile.Fsections.sort(SortFunc)). Du musst dir nur die SortFunc schreiben, aber das sollte ein 3-Zeiler sein.

Ansonsten muss ich DGL-luke aber recht geben: Warum willst du überhaupt sortieren? Oder willst du nicht die ini-Datei sorteiren, sondern nur die Ausgabe?
Dann könntest du auch alle Werte in eine StringList laden und diese dann sortieren...

Uncle Cracker 25. Mär 2007 11:49

Re: INI-Datei sortieren
 
Ok, habe grad festgestellt, dass ich ja die Sections vorher schon in eine StringList laden lasse, bevor ich sie in ein das ListView lade...Also reicht es wirklich nur die StringList zu sortieren, anstatt die gesamte INI-Datei zu verändern...Manchmal sieht man den Wald vor lauter Bäumen nicht :D

Danke nochmal!


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:15 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