Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   2 ini-Dateien zusammenfassen (im Speicher) (https://www.delphipraxis.net/170114-2-ini-dateien-zusammenfassen-im-speicher.html)

michaelarban 31. Aug 2012 12:12


2 ini-Dateien zusammenfassen (im Speicher)
 
Hallo,

kann man 2 ini-Dateien so zusammenlegen, dass ich nur noch über 1 variable darauf zugreife?

also so z.B.:

ersteINI:= TIniFile.Create('iniDatei1.ini')
zweiteINI:= TIniFile.Create('iniDatei2.ini')

ersteINI.add(zweiteINI) <-- so was

und dann nur noch die Variable ersteINI verwenden.

die beiden Ini-Dateien sollen also NICHT zu 1 Datei auf der Festlatte werden.


danke

Nachtrag: es soll ini-Datei heissen, nicht init-Datei

himitsu 31. Aug 2012 12:28

AW: 2 init-Dateien zusammenfassen (im Speicher)
 
Grundsätzlich erstmal Nein, das geht nicht. (Ein INI-Objekt zeigt immer nur auf eine INI-Datei)

Du kannst aber alle Sections durchlaufen, und darin je alle Values (also 2 Schleifen)
und die Werte dann in die andere INI einfügen. (bei doppelten Sektion-Werte-Paaren mußt du entsprechend reagieren ... prüst du das nicht ab, dann beommst du den Wert der kopierten INI und überschreibst ihn in der, wo es eingefügt wird, oder wenn man vorher prüft, ob's exisitert, dann kann man entweder überschreiben oder nicht).

Aber wenn du das mit TIniFile machst, dann veränderst du die erste INI, da es ja direkt reingeschrieben wird.
TMemIniFile (oder Dergleichen) könnte man verwenden, also alles wo es (erstmal) nur im RAM zusammengeführt wird, man aber ganz am Ende diese Änderungen nicht in der Datei speichert, also die Änderungen verwirft.

Zu deinem Nachtrag:
Ersten Beitrag editieren und darain auf den "erweiterten" Editor umschalten.

s.h.a.r.k 31. Aug 2012 12:44

AW: 2 ini-Dateien zusammenfassen (im Speicher)
 
Willst du die Konfiguration nur lesen und in deiner Anwendung nutzen? Wenn ja, dann würde ich gleich eine Konfigurations-Klasse schreiben, die nach und nach die INI-Dateien einliest.

Jonas Shinaniganz 31. Aug 2012 12:48

AW: 2 ini-Dateien zusammenfassen (im Speicher)
 
Wenn du nach s.h.a.r.k's Tip nicht genau weißt wie du loslegen sollst könntest:

Baue eine Eigene Klasse:

Delphi-Quellcode:
 
type
TIniFiles = class(TComponent)
  private
    Inis : TObjectList;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy;

    procedure Add(Inifile : TIniFile);
    function ReadString(const Section, Ident, Default: string): string;
  end;

implementation


{ TIniFiles }


procedure TIniFiles.Add(Inifile: TIniFile);
begin
  Inis.Add(Inifile);
end;


constructor TIniFiles.Create(AOwner: TComponent);
begin
  inherited;
  Inis := TObjectList.Create;
  Inis.OwnsObjects := True;
end;


destructor TIniFiles.Destroy;
begin
  Inis.Free;
end;


function TIniFiles.ReadString(const Section, Ident, Default: string): string;
var
  I: Integer;
begin
  Result := '';
  for I := 0 to Inis.Count do
  begin
    Result := (Inis.Items[I] as TIniFile).ReadString(Section,Ident,Default);
    if Result <> '' then
      Exit;
  end;
end;
Dann instanzierst du die Klasse und fügst alle Inifiles die du hast hinzu. Dann kannst du
auf die Instanz zugreifen und "ReadString" aufrufen um einen String auszulesen, alle anderen Methoden müsstest du dir dann nach dem obigen Schema selbst coden...

Popov 31. Aug 2012 13:03

AW: 2 ini-Dateien zusammenfassen (im Speicher)
 
Zitat:

Zitat von michaelarban (Beitrag 1180844)
kann man 2 ini-Dateien so zusammenlegen, dass ich nur noch über 1 variable darauf zugreife?

Direkt nein, wie die anderen Kollegen schon richtig gesagt haben.

Aber es hängt davon ab was du machen willst. Wenn Sektoren keine Rolle spielen und du nur an die Schlüssel und Werte willst, dann kann man beide Ini's in eine TStringList laden und Werte z. B. über Values auslesen. In diesem Fall könnte man beides mischen. Es wären dann aber keine richtigen Ini's mehr, denn bei der Aktion ginge die Sektoren Einteilung flöten. Der Rest würde aber wie bei Ini funktionieren.

CCRDude 31. Aug 2012 13:12

AW: 2 ini-Dateien zusammenfassen (im Speicher)
 
TMemIniFile hat GetStrings und SetStrings. Ein Merge im Speicher sollte sich also über den Umweg zweier zu mergender TStringLists machen lassen.

Bjoerk 31. Aug 2012 15:34

AW: 2 ini-Dateien zusammenfassen (im Speicher)
 
Du könntest eine dritte MemIniFile erzeugen
Delphi-Quellcode:
MemIniFile = TMemIniFile.Create('');
und die beiden anderen mit ReadSections und ReadSection auslesen und in diese schreiben. Dabei müßte die Datei mit der höheren Priorität als letztes beahndelt werden, da bereits vorhandene Einträge überschrieben würden. Und du könntest mit Rename einen Dateinamen vergeben und mit UpdateFile speichern, falls erforderlich. Alles in allem irgendwie kein schöner Weg. Was möchtest du denn machen?

Sir Rufo 31. Aug 2012 16:33

AW: 2 ini-Dateien zusammenfassen (im Speicher)
 
Ich würde einfach eine neue Ini-Klasse von TCustomIniFile ableiten, dann verhält sich die Klasse eben wie eine Ini-Datei. :)

Popov 31. Aug 2012 16:51

AW: 2 ini-Dateien zusammenfassen (im Speicher)
 
Es stellt sich die Frage ob der TE Klassen entwickeln kann.

Aber auch ein anderer Punkt sollte nicht vergessen werden: wenn zwei INI's zusammengeführt werden, kann es durchaus vorkommen, dass beide gleiche Abschnitte, bzw. Abschnitt-Bezeichnungen haben. Enthält eine Ini zwei gleiche Abschnitte, wird der zweite Abschnitt ignoriert. In diesem Fall müssen Abschnitte zusammengeführt werden, hier kommt aber das gleiche Problem in grün vor: kommen zwei gleichnamige Schlüssel vor, wird der zweite ignoriert.

Sir Rufo 31. Aug 2012 17:07

AW: 2 ini-Dateien zusammenfassen (im Speicher)
 
Bei gleichlautenden Schlüsseln muss natürlich der Zugriff entsprechend geregelt sein (Konzept), aber das ist ja nicht ungwöhnlich.
Globale Einstellungen per Default die per User aber überschrieben werden können.


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