Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi IniFile.ReadString liest nicht alles aus! (https://www.delphipraxis.net/74950-inifile-readstring-liest-nicht-alles-aus.html)

Balu der Bär 11. Aug 2006 16:07


IniFile.ReadString liest nicht alles aus!
 
Moin,

ich habe gerade 30 Minuten den Fehler in meinem Programm gesucht, habe ihn auch gefunden und konnte dir Schuld sogar wenn mir wegschieben. :P

Problem:

Delphi-Quellcode:
var
 ini : TIniFile;
/// etc...
test := ini.ReadString('wasweiß', 'ich', '');
Damit liest man normalerweise eine Ini-Datei aus. Klappt aber leider überhaupt nicht wenn zwei Anführungszeichen als Werte drinstehen also zum Beispiel:
Zitat:

[wasweiß]
ich=""
In diesem Falle kommt nichts in meiner Variablen an, sie bleibt leer. Das ist fatal für mein Programm, da auch da mal zwei "" in den Inis stehen. Weiß jemand wie es hinbekomme dies trotzdem auszulesen?

Vielen Dank schonmal,

DGL-luke 11. Aug 2006 16:10

Re: IniFile.ReadString liest nicht alles aus!
 
ja wie?

Delphi-Quellcode:
test = ''
oder
Delphi-Quellcode:
test = nil
?

und ist das nicht beides das selbe?

EDIT: oder willst du literal '""' rauskriegen? dann kann ich dir auch nciht helfen :stupid:

Balu der Bär 11. Aug 2006 16:13

Re: IniFile.ReadString liest nicht alles aus!
 
Ja, ich möchte das die Ini korrekt ausgelesen wird und in der Variablen dann "" steht.

Delphi-Quellcode:
variable := '""';
(also)

mkinzler 11. Aug 2006 16:14

Re: IniFile.ReadString liest nicht alles aus!
 
Das setze das Default auf was anderes wie den Leerstring und überprüfe dann auf ihn.

DGL-luke 11. Aug 2006 16:16

Re: IniFile.ReadString liest nicht alles aus!
 
@mkinzler: und was macht er dann, wenn die variable nicht vorhanden ist?

Delphi-Quellcode:
'' <> '""'

Balu der Bär 11. Aug 2006 16:16

Re: IniFile.ReadString liest nicht alles aus!
 
Zitat:

Zitat von mkinzler
Das setze das Default auf was anderes wie den Leerstring und überprüfe dann auf ihn.

Ist ein Problem weil ich dann sehr viel in meinem Code ändern müsste (es wird desöfteren mal auf Leerstrings geprüft). Gibt es keine andere Möglichkeit das auszulesen?

mkinzler 11. Aug 2006 16:17

Re: IniFile.ReadString liest nicht alles aus!
 
Zitat:

Zitat von DGL-luke
@mkinzler: und was macht er dann, wenn die variable nicht vorhanden ist?

Delphi-Quellcode:
'' <> '""'

Dann steht dort ja der default drin.

DGL-luke 11. Aug 2006 16:19

Re: IniFile.ReadString liest nicht alles aus!
 
TIniFile:

Delphi-Quellcode:
function TIniFile.ReadString(const Section, Ident, Default: string): string;
var
  Buffer: array[0..2047] of Char;
begin
  SetString(Result, Buffer, GetPrivateProfileString(PChar(Section),
    PChar(Ident), PChar(Default), Buffer, SizeOf(Buffer), PChar(FFileName)));
end;
:shock: was ist das denn?


TMemIniFile:
Delphi-Quellcode:
begin
  I := FSections.IndexOf(Section);
  if I >= 0 then
  begin
    Strings := TStrings(FSections.Objects[I]);
    I := Strings.IndexOfName(Ident);
    if I >= 0 then
    begin
      Result := Copy(Strings[I], Length(Ident) + 2, Maxint);
      Exit;
    end;
  end;
  Result := Default;
end;
Vielleicht hast du damit mehr Glück.

EDIT:
@mkinzler: aber das will er ja nicht :stupid:
@balu: TMemIniFile ist sowieso im allgemeinen vorzuziehen.

Balu der Bär 11. Aug 2006 16:22

Re: IniFile.ReadString liest nicht alles aus!
 
Also ich habe hier doch ein etwas größeres Projekt und lese insgesamt mehr als 8 Ini-Dateien aus. Um ehrlich zu sein habe ich keine Lust alles auf ein TMemIniFile umzustellen. Trotzdem danke, aber ich hoffe ich (ihr :P )finde noch eine Möglichkeit es mit IniFile auszulesen.

DGL-luke 11. Aug 2006 16:26

Re: IniFile.ReadString liest nicht alles aus!
 
StringReplace(quellcode, 'TIniFile','TMemIniFile');

ist dir zu kompliziert? Wenn du meinst.... (mit GExperts und grep sollte das schnell gehen... hab da aber noch kein projektweites ersetzen gefunden)

Jürgen Thomas 11. Aug 2006 16:41

Re: IniFile.ReadString liest nicht alles aus!
 
@Pierre,

ich habe den Eindruck, dass das Problem in Windows enthalten ist oder durch PChar/SetString verursacht wird:
Zitat:

Zitat von DGL-luke
TIniFile:
Delphi-Quellcode:
function TIniFile.ReadString(const Section, Ident, Default: string): string;
var
  Buffer: array[0..2047] of Char;
begin
  SetString(Result, Buffer, GetPrivateProfileString(PChar(Section),
    PChar(Ident), PChar(Default), Buffer, SizeOf(Buffer), PChar(FFileName)));
end;

Durch Delphi-Referenz durchsuchenGetPrivateProfileString erhält man die MS-Hilfe; daraus und durch die o.g. Implementierung in Delphi ergibt sich, dass (a) entweder MS den Fehler verursacht (in der Hilfe steht z.B. auch, dass führende Leerzeichen entfernt werden, vielleicht gilt das auch für Hochkommata) oder (b) die Umwandlung zwischen Delphi-Strings und nullterminierten Strings nicht vollständig funktioniert.

Ich habe einmal Folgendes versucht:
Delphi-Quellcode:
  with Tinifile.Create('VS.Ini')
  do begin
    try
      s1 := ReadString( 'ZZZ', 'x1', '''' );
      s2 := ReadString( 'ZZZ', 'x2', '""' );
      Edit1.Text := s1;
      Edit2.Text := s2;
      RxSpinEdit1.Value := Length(s1);
      RxSpinEdit2.Value := Length(s2);
    finally
      Free;
    end;
  end;
Auch dabei habe ich einen leeren String (auch Length(s1) = 0) erhalten.

Die anderen Vorschläge - z.B. TMemIniFile - dürften aus den gleichen Gründen nicht helfen. Ich schlage statt dessen folgende Änderungen vor:

1. Definiere eine globale Konstante:
Delphi-Quellcode:
const scIniHochkommata = 'aB1rA2kA3dA4bR5a'; //  oder ähnlichen Schrott
2. Ersetze in den Ini-Dateien alle Einträge durch diesen Wert; das geht mit Suchen + Ersetzen.
3. Ersetze überall dort, wo Du die Prüfung auf Hochkommata benötigst, dies durch diese Konstante. Auch dabei hilft Delphi mit "Suchen in Dateien".

Das ist zwar immer noch umständlich (abhängig von der Anzahl der Units/Prüfungen), dürfte aber Deinen Vorstellungen am ehesten entsprechen.

Jürgen

Balu der Bär 11. Aug 2006 16:44

Re: IniFile.ReadString liest nicht alles aus!
 
Hab das Problem jetzt anders gelöst, zwar unschön aber egal. Ich habe einfach allen Einträgen automatisch eine 0 (Null) hintenrangesetzt welche ich beim Laden wieder lösche. Egal, hauptsache es geht auch mit den "".

@Jürgen: Hab dein Posting grad gelesen. Danke dir aber ich mache es jetzt so wie gerade geschrieben, der Aufwand dürfte in etwas der gleiche sein. Trotzdem vielen Dank. ;)

bigg 11. Aug 2006 16:57

Re: IniFile.ReadString liest nicht alles aus!
 
Hi Pierre,

laut INI-ISO-Schlagmichtot musst du die doppelten Anführungszeichen durch diese beiden Zeichen \" ersetzen.

Daniel G 11. Aug 2006 17:12

Re: IniFile.ReadString liest nicht alles aus!
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von Balu der Bär
Um ehrlich zu sein habe ich keine Lust alles auf ein TMemIniFile umzustellen.

Siehe Anhang. Alles markieren und dann diesen hübschen Button drücken. Was meinste, wie flott ich da von TBitmap auf TBitmap32 umsteigen konnte. :mrgreen:

DGL-luke 12. Aug 2006 13:03

Re: IniFile.ReadString liest nicht alles aus!
 
@Daniel G: Das ist schön, bescheuert ist nur immer, dass der Button immer am Ende der Selektion steht, bei einem Strg+A also immer ganz unten, wo man ihn nicht sieht, und das allerschlimmste ist ja, dass da nichtmal der Shortcut Strg+Shift+Y hilft :wall:
Ich arbeite deshalb vorzugsweise mit dem Refactoring.

Hawkeye219 13. Aug 2006 13:21

Re: IniFile.ReadString liest nicht alles aus!
 
Falls die Einträge

Code:
Key1=""
Key2=
als gleichwertig betrachtet werden können, hilft vielleicht der folgende Code:

Delphi-Quellcode:
type
  TIniFileEx = class (TIniFile)
  public
    function ReadString2 (const aSection, aKey, aDefault: string): string;
  end;

function TIniFileEx.ReadString2 (const aSection, aKey, aDefault: string): string;
begin
  if ValueExists(aSection, aKey) then
    begin
      Result := ReadString(aSection, aKey, aDefault);
      if (Result = '') then
        Result := '""';
    end
  else
    Result := aDefault;
end;
Gruß Hawkeye


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