Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Eine Ini-Section in ein andere Ini kopieren (https://www.delphipraxis.net/192656-eine-ini-section-ein-andere-ini-kopieren.html)

SneakyBagels 9. Mai 2017 09:18


Eine Ini-Section in ein andere Ini kopieren
 
Ich probiere hier schon seit Stunden mit StringListen rum wie ein Verrückter und komme nur zum Ergebnis Kopfschmerzen!
Jetzt muss ich mich an euch wenden.

Wie ist es möglich, wenn ich zwei TMemIniFile-Instanzen habe, eine komplette Section von der ersten in die zweite Instanz zu kopieren?

hoika 9. Mai 2017 09:22

AW: Eine Ini-Section in ein andere Ini kopieren
 
Hallo,

mit ReadSection holst du dir Namen der Bezeichner der Sektion,
und dann nimmst du eine kleinen Schleife mit ReadString aus der alten Ini und WriteString in die neue Ini.

SneakyBagels 9. Mai 2017 09:25

AW: Eine Ini-Section in ein andere Ini kopieren
 
Ich bin mir schon gar nicht mehr sicher was ich alles probiert habe aber das hilft glaube ich auch nicht.
Gibt es hier nix einfaches ohne Kopfschmerzen?

Weil ReadSection holt mir nur die Titel jeder Section nicht aber den Inhalt. GetStrings holt mir wirklich alles aber damit kann man auch nix anfangen da ich absolut keine Ahnung habe wie man da durchparst.

Da muss es doch was einfaches, sehr kurzes knackiges geben um eine Section von Ini-1 in Ini-2 zu bringen!

Michael II 9. Mai 2017 09:43

AW: Eine Ini-Section in ein andere Ini kopieren
 
Zum Beispiel so: siehe unten, procedure kopiere( mi1, mi2 : TMemIniFile; sec : string );

[ Ich nehme an, du arbeitest ohne SubSections. Falls doch: Wenn du die Subsections von sec auch kopiert haben willst, dann müsstest du via ReadSubSections (oder ReadSections) an die in diesen SubSections gespeicherten Werte gelangen. ]


In diesem Beispiel werden die drei Wertepaare (b=1, c=2, d=3) aus Section a von m1 nach m2 kopiert.

Delphi-Quellcode:
uses IniFiles;

procedure kopiere( mi1, mi2 : TMemIniFile; sec : string );
var hs : TStringList;
    wert : string;
  i: Integer;
begin
  hs := TStringList.Create;
 try
  mi1.ReadSection( sec, hs );

  for i := 0 to hs.Count-1 do
  begin
    wert := mi1.readstring( sec, hs.Strings[i], '' );
    mi2.WriteString( sec, hs.Strings[i], wert );
  end;

 finally
  hs.free;
 end;
end;

procedure TForm87.FormCreate(Sender: TObject);
var m1, m2 : TMemIniFile;
begin
  m1 := TMemIniFile.Create( extractfilepath( application.exename) + 'tm1.txt' );
  m2 := TMemIniFile.Create( extractfilepath( application.exename) + 'tm2.txt' );
 try
  m1.AutoSave := true;
  m2.AutoSave := true;

  m1.WriteString( 'a', 'b', '1' );
  m1.WriteString( 'a', 'c', '2' );
  m1.WriteString( 'a', 'd', '3' );
  m1.WriteString( 'a\w', 'b', '1' );
  m1.WriteString( 'a\w', 'c', '2' );
  m1.WriteString( 'a\v', 'd', '3' );

  kopiere(m1,m2,'a');

 finally
  m1.Free;
  m2.Free;
 end;
end;

SneakyBagels 9. Mai 2017 09:59

AW: Eine Ini-Section in ein andere Ini kopieren
 
Du hast meinen Tag gerettet! Danke.

hoika 9. Mai 2017 10:06

AW: Eine Ini-Section in ein andere Ini kopieren
 
Hallo,
Zitat:

Weil ReadSection holt mir nur die Titel jeder Section nicht aber den Inhalt. GetStrings holt mir wirklich alles aber damit kann man auch nix anfangen da ich absolut keine Ahnung habe wie man da durchparst.
Falsch, ReadSections holt die Titel aller Sections, ReadSection (ohne s) holt die Einträge genau einer Section.

public procedure TIniFile.ReadSection(
const Section: string;
Strings: TStrings
);

Oder habe ich da was übersehen?

Uwe Raabe 9. Mai 2017 10:11

AW: Eine Ini-Section in ein andere Ini kopieren
 
Zitat:

Zitat von SneakyBagels (Beitrag 1370701)
Weil ReadSection holt mir nur die Titel jeder Section nicht aber den Inhalt.

Genauer: ReadSection holt die Name-Werte der angegebenen Section.

Aber für deinen Zweck gibt es ja auch ReadSectionValues.

Die Kopiere Methode könnte dann so aussehen:
Delphi-Quellcode:
procedure kopiere( mi1, mi2 : TMemIniFile; sec : string );
var
  hs : TStringList;
  i: Integer;
begin
  hs := TStringList.Create;
  try
    mi1.ReadSectionValues( sec, hs );
    mi2.EraseSection(sec); // falls der aktuelle Inhalt nicht erhalten bleiben soll

    for i := 0 to hs.Count-1 do
    begin
      mi2.WriteString( sec, hs.Names[i], hs.ValueFormIndex[I] );
    end;

  finally
    hs.free;
  end;
end;

Aviator 9. Mai 2017 10:16

AW: Eine Ini-Section in ein andere Ini kopieren
 
Zitat:

Zitat von hoika (Beitrag 1370710)
Oder habe ich da was übersehen?

Nö hast du nicht.

@TE: Ein Blick in die Dokumentation wirkt manchmal doch Wunder. TIniFile.ReadSection und TIniFile.ReadSections :wink:

Es ist genau so wie hoika es gesagt hat. Die eine Funktion liest dir alle Sections aus (ReadSections). Die andere Funktion liest dir die Keys innerhalb einer bestimmten Section aus (ReadSection). Die Funktion die du verwenden solltest wäre demzufolge ReadSection. Danach kannst du dir die einzelnen Werte auslesen und entsprechend behandeln.

Eine noch einfachere Variante wäre, dass du einfach die Funktion TIniFile.ReadSectionValues zu Hilfe nimmst. Die macht schon genau das für dich und liest dir alle Keys und Values aus einer Section in eine TStringList ein.

EDIT: Och menno. Zu langsam. Where's the red box :shock:

Michael II 9. Mai 2017 10:23

AW: Eine Ini-Section in ein andere Ini kopieren
 
Zitat:

Eine noch einfachere Variante wäre, dass du einfach die Funktion TIniFile.ReadSectionValues zu Hilfe nimmst. Die macht schon genau das für dich und liest dir alle Keys und Values aus einer Section in eine TStringList ein.
ReadSection liest die "Namen"/"Identifiers",
ReadSectionValues liest nur die "Werte"



siehe Post UR

Aviator 9. Mai 2017 10:31

AW: Eine Ini-Section in ein andere Ini kopieren
 
Zitat:

Zitat von Michael II (Beitrag 1370719)
Zitat:

Eine noch einfachere Variante wäre, dass du einfach die Funktion TIniFile.ReadSectionValues zu Hilfe nimmst. Die macht schon genau das für dich und liest dir alle Keys und Values aus einer Section in eine TStringList ein.
ReadSection liest die "Namen"/"Identifiers",
ReadSectionValues liest nur die "Werte"



siehe Post UR

Also in der Dokumentation steht was anderes. Es sei denn, die wäre falsch. :roll:

Zitat:

Zitat von Embarcadero DokWiki
Description

Reads the values from all keys within a section of an INI file into a string list.

Call ReadSectionValues to read the keys, and the values from all keys, within a specified section of an INI file into a string list object (TStrings descendant). The key names and values are added to the string list as strings of the form:
Code:
<keyname> = <value>



Alle Zeitangaben in WEZ +1. Es ist jetzt 12:36 Uhr.
Seite 1 von 2  1 2      

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