Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Immer Default-Wert bei Ini.ReadString (https://www.delphipraxis.net/148325-immer-default-wert-bei-ini-readstring.html)

Mariaki 27. Feb 2010 20:59


Immer Default-Wert bei Ini.ReadString
 
Hi,
ich mache grade eine Update-Funktion für mein Prog..
Hier mal der Text mit dem Fehler:
Delphi-Quellcode:
var
  stream: TFileStream;
  reg: TRegistry;
  ini: Tinifile;
begin
  stream := TFileStream.Create('Version.ini', fmcreate);
  ini := Tinifile.Create('Version.ini');
  try
    FTPUpdate.Connect;
    FTPUpdate.Get('Version.ini', stream);
  finally
    FTPUpdate.Disconnect;
    stream.Free;
  end;
  try
    AEinst.OnVer := ini.ReadString('Version', 'Version', '');
    Showmessage(AEinst.OnVer);
  finally
    ini.Free;
  end;
.
.
.
Nun ließt er aba einfach nicht den Wert aus der Ini.
Die sieht so aus:
Code:
[Version]
Version=1_0_0_0
Herunterladen tut er sie auch.
D.h. der Fehler muss in
Delphi-Quellcode:
AEinst.OnVer := ini.ReadString('Version', 'Version', '');
sein. aber da kann man eigentlich nicht so viel falsch machen. Doch nimmt er immer den Alternativ-Wert (in meinem Fall '').
Findet jemand den Fehler.

Gruß Mariaki

Luckie 27. Feb 2010 21:02

Re: Immer Defalt-Wert bei Ini.ReadString
 
Delphi-Quellcode:
ini := Tinifile.Create('Version.ini');
Und wo in den hunderten Ordner auf deiner Festplatte soll Windows die Ini-Datei finden?

himitsu 27. Feb 2010 21:08

Re: Immer Defalt-Wert bei Ini.ReadString
 
Zitat:

Und wo in den hunderten Ordner auf deiner Festplatte soll Windows die Ini-Datei finden?
MSDN-Library durchsuchenGetPrivateProfileString

Zitat:

lpFileName [in]

The name of the initialization file. If this parameter does not contain a full path to the file, the system searches for the file in the Windows directory.
Wobei neuere Windowsversionen auch gern mal sowas in die Registry verlegen, anstatt eine Datei anzulegen. (vorallem da man seit Vista normaler Weise im Windowsverzeichnis keine Schreibrechte hat)

Der FileStream nimmt aber ohne Pfadangabe das aktuelle Arbeitsverzeichnis.


Ergo: relative Pfade sind böse.

Mariaki 27. Feb 2010 21:11

Re: Immer Defalt-Wert bei Ini.ReadString
 
Ach wie doof.. ich hab da jetzt 1 Stunde dran gesessen.. ja.. ok.. danke..
nehme aber trotzdem ini.. einfacher als wenn man erst ne *.reg macht die herunterlädt.. dann in die registry lädt und dann den wert aus der registry nimmt..

trotzdem thx@all

Luckie 27. Feb 2010 21:24

Re: Immer Defalt-Wert bei Ini.ReadString
 
Zitat:

Zitat von himitsu
Zitat:

lpFileName [in]

The name of the initialization file. If this parameter does not contain a full path to the file, the system searches for the file in the Windows directory.

Das ist mir bekannt. Allerdings ganz böse wird es, wenn man im Windows Ordner keine Schreibrechte hat. Was macht Windows dann? dann kann man sie nämlich wirklich suchen.

@Mariaki: Du sollst nicht die Registry benutzen, sondern einfach nur den absoluten Pfad zu der Ini-Datei angeben.

DeddyH 28. Feb 2010 09:32

Re: Immer Defalt-Wert bei Ini.ReadString
 
Abgesehen davon:
Zitat:

Delphi-Quellcode:
stream := TFileStream.Create('Version.ini', fmcreate);
  ini := Tinifile.Create('Version.ini');

Ich weiß nicht genau, was Windows da intern macht, aber evtl. gibt es die Datei, die TIniFile hier zugewiesen wird, zu diesem Zeitpunkt noch gar nicht. Ich würde die IniFile erst nach dem Download instanzieren, um sicher zu gehen.

himitsu 28. Feb 2010 09:41

Re: Immer Defalt-Wert bei Ini.ReadString
 
Zitat:

Zitat von DeddyH
Abgesehen davon:

Das TIniFile ist 'ne recht doofe Klasse, dieses merkt sich beim .Create nur den Dateinamen und bei jedem einzelnem Lese-/Schreibzugriff wird die Datei geöffner, komplett ausgelesen, der gewünschte Teil rausgeholt oder verändert und bei 'ner Änderung dann wieder komplett gespeicher.

Also in diesem Fall ginge dieses Vorgehn (wenn der Pfad stimmen würde).

Aber bei anderen Klassen, wie z.B. TMemIniFile und eigentlich alle anderen Abkömmlingen davon, würde dein Einwand stimmen.
Und da das Vorgehn von TIniFile recht "unkonservativ" ist, sollte man besser auf dich hören.

> erst Datei erstellen
> alles speichern
> Datei schließen
> und danach dann erst auslesen

PS: Wozu diese Datei eigentlich real ablegen?

ich würde sie in einen String oder Stream runterladen und dann direkt mit TMemIniFile drauf zugreifen, welches auch komplett im RAM damit arbeiten kann.

Helmi 28. Feb 2010 09:59

Re: Immer Defalt-Wert bei Ini.ReadString
 
[OT]
Könnt jemand bitte noch der Überschrift ein "u" spendieren?
[/OT]


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