Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Ini Section im Speicher umbenennen (https://www.delphipraxis.net/203430-ini-section-im-speicher-umbenennen.html)

DieDolly 15. Feb 2020 21:44


Ini Section im Speicher umbenennen
 
Gibt es die Möglichkeit die Section einer Inidatei direkt im Arbeitsspeicher umzubenennen ohne die Datei vorher zu laden und erneut zu speichern?
DIesen Code hier habe ich in meine eigene Ini-Klasse eingebaut. Aber ich würde die Section gerne im Speicher umbenennen und mir den Weg über die Festplatte ersparen.

https://www.delphipraxis.net/17752-d...mbenennen.html

Luckie 15. Feb 2020 22:04

AW: Ini Section im Speicher umbenennen
 
Achtung: In dem Code aus der CodeLib fehlt der Ressourcenschutzblock try-finaly und die StringListe wird nicht wieder freigegeben ini.free!

jaenicke 15. Feb 2020 22:06

AW: Ini Section im Speicher umbenennen
 
Verwendest du denn TMemIniFile? Das wurde ja in den letzten Delphiversionen massiv umgebaut (ist deutlich schneller usw.).

Das im verlinkten Beitrag genannte TIniFile basiert auf ur-ur-uralten API-Funktionen aus Zeiten von Windows 3.x, das sollte man nicht mehr verwenden...
https://docs.microsoft.com/en-us/win...eprofilestring
Zitat:

This function is provided only for compatibility with 16-bit Windows-based applications. Applications should store initialization information in the registry.
Wie du das mit
Zitat:

ohne die Datei vorher zu laden und erneut zu speichern
meinst, ist mir aber auch nicht klar. Woher sollen die Daten denn kommen, wenn die Datei nicht geladen wird? Speichern ist mit TMemIniFile nicht nötig, wenn die Daten nicht auf der Festplatte landen sollen.

DieDolly 15. Feb 2020 22:13

AW: Ini Section im Speicher umbenennen
 
Ich benutze TMemIniFile in einer eigenen, abgeleiteten Klasse die ich mit weiteren für mich nutzbare Funktionen erweitert habe.
Zitat:

Woher sollen die Daten denn kommen, wenn die Datei nicht geladen wird?
Die Daten sind in dem Fall schon geladen.

Delphi-Quellcode:
 Ini := TMemIniFile.Create('daten.ini');
 try
  // Section hier umbenennen möglich? Ini.RenameSection('alt', 'neu'); ?
 finally
  Ini.Free;
 end;

Luckie 15. Feb 2020 23:01

AW: Ini Section im Speicher umbenennen
 
Sektion aus Inidatei in eine Stringliste kopieren. Sektion in Inidatei löschen. Sektionsbezeichnung in der Stringliste umbenennen. Sektion in Inidatei zurück kopieren. Also so irgendwie oder ähnlich.

Uwe Raabe 15. Feb 2020 23:55

AW: Ini Section im Speicher umbenennen
 
Mit
Delphi-Quellcode:
TMemIniFile.GetStrings
kommst du an den Inhalt als
Delphi-Quellcode:
TStrings
und mit
Delphi-Quellcode:
TMemIniFile.SetStrings
kannst du ihn wieder schreiben. Der verlinkte Code könnte also folgendermaßen angepasst werden:
Delphi-Quellcode:
function RenameSection(MemIniFile: TMemIniFile; const OldSection, NewSection: String): boolean;
var
  lst: TStringList;
  ind: Integer;
begin
  result := false;
  lst := TStringList.Create;
  try
    MemIniFile.GetStrings(lst);
    if lst.Count = 0 then Exit;
    if lst.indexOf('['+NewSection+']') >= 0 then Exit;

    ind := lst.IndexOf('['+OldSection+']');
    if ind < 0 then Exit;

    lst.Strings[ind] := '['+NewSection+']';
    MemIniFile.SetStrings(lst);
    result := true;
  finally
    lst.Free;
  end;
end;
Alternativ auch als
Delphi-Quellcode:
class helper
mit ein paar kleinen Verbesserungen:
Delphi-Quellcode:
type
  TMemIniFileHelper = class helper for TMemIniFile
  public
    function RenameSection(const OldSection, NewSection: String): boolean;
  end;

function TMemIniFileHelper.RenameSection(const OldSection, NewSection: String): boolean;
var
  lst: TStringList;
begin
  result := false;
  if SectionExists(NewSection) then Exit;
  if not SectionExists(OldSection) then Exit;

  lst := TStringList.Create;
  try
    GetStrings(lst);
    lst[lst.IndexOf('['+OldSection+']')] := '['+NewSection+']';
    SetStrings(lst);
    result := true;
  finally
    lst.Free;
  end;
end;


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