AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi IniFile.ReadString liest nicht alles aus!
Thema durchsuchen
Ansicht
Themen-Optionen

IniFile.ReadString liest nicht alles aus!

Ein Thema von Balu der Bär · begonnen am 11. Aug 2006 · letzter Beitrag vom 13. Aug 2006
Antwort Antwort
Seite 2 von 2     12   
Jürgen Thomas

Registriert seit: 13. Jul 2006
Ort: Berlin
750 Beiträge
 
#11

Re: IniFile.ReadString liest nicht alles aus!

  Alt 11. Aug 2006, 16:41
@Pierre,

ich habe den Eindruck, dass das Problem in Windows enthalten ist oder durch PChar/SetString verursacht wird:
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:
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
#D mit C# für NET, dazu Firebird
früher: Delphi 5 Pro, Delphi 2005 Pro mit C# (also NET 1.1)
Bitte nicht sauer sein, wenn ich mich bei Delphi-Schreibweisen verhaue; ich bin inzwischen an C# gewöhnt.
  Mit Zitat antworten Zitat
Balu der Bär
(Gast)

n/a Beiträge
 
#12

Re: IniFile.ReadString liest nicht alles aus!

  Alt 11. Aug 2006, 16:44
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.
  Mit Zitat antworten Zitat
bigg
(Gast)

n/a Beiträge
 
#13

Re: IniFile.ReadString liest nicht alles aus!

  Alt 11. Aug 2006, 16:57
Hi Pierre,

laut INI-ISO-Schlagmichtot musst du die doppelten Anführungszeichen durch diese beiden Zeichen \" ersetzen.
  Mit Zitat antworten Zitat
Daniel G
(Gast)

n/a Beiträge
 
#14

Re: IniFile.ReadString liest nicht alles aus!

  Alt 11. Aug 2006, 17:12
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.
Miniaturansicht angehängter Grafiken
soeinfach_242.jpg  
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#15

Re: IniFile.ReadString liest nicht alles aus!

  Alt 12. Aug 2006, 13:03
@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
Ich arbeite deshalb vorzugsweise mit dem Refactoring.
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#16

Re: IniFile.ReadString liest nicht alles aus!

  Alt 13. Aug 2006, 13:21
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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:56 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