| Autor |
Beitrag |
DeadlyAppearance
      
Beiträge: 113
Win 7
Delphi 2010 Arch., C# VS 2008
|
Verfasst: Do 28.02.08 07:36
Morgen zusammen.
Und zwar folgendes...
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| var ini: TIniFile;
begin if FileExists(inipath) = False then FileCreate(inipath);
ini := TIniFile.Create(inipath);
try ini.WriteString(section, ident, value); finally FreeAndNil(ini); end; end; |
...sollte die Ini-Datei nicht vorhanden sein, so möchte ich diese über FileCreate erstellen.
Dies macht er auch, doch möchte darin schreiben, so erhalte ich die Meldung, dass in xxx nicht
geschrieben werden kann.
Ersetze ich FileCreate mit
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| var ini: TIniFile; f:Tfilestream; begin if FileExists(inipath) = False then begin f := Tfilestream.create(inipath,fmcreate); f.free; end; |
so funktioniert es Problemlos.
Warum ist das so? Denn die Lösung über FileStream gefällt mir nicht so für meinen Fall.
Ich tippe mal dadrauf, dass im Moment FileCreate die Datei anlegt und anschließend in
Benutzung hält und dementsprechend nicht freigibt.
_________________ Als du auf die Welt kamst, weintest du, und um dich herum freuten sich alle. Lebe so, daß, wenn du die Welt verläßt, alle weinen und du allein lächelst.
|
|
Erichgue
      
Beiträge: 86
Win XP/2000/7
TurboPacal 7.0; Delphi 2/5/7; BDS 2006/2010/XE6; C#; MSSQl 2000
|
Verfasst: Do 28.02.08 08:20
Hallo,
mag sein, das ich deine Problematik nicht ganz verstehen, oder es nur zu simple ist.
1. TIniFile verlang zwar beim Erstellen einen Dateinamen, die Datei muss aber nicht zwingend vorhanden sein.
Ist diese Datei nicht vorhanden, wird sie automatisch erstellt (UpdateFile nicht vergessen!)
Auf jeden Fall am Ende TInifile.Updatefile aufrufen.
Das du in die Datei die mit FileCreate erzeugt wurde, nicht schreiben kannst, kann daran liegen, das sie noch nicht wirklich da ist, wenn du die Ini aufmachst.
Sollte dir der Mechanismus von TInifile reichen solltest du auf FileCreate verzichten.
Ansonsten versuch es mit einem Application.ProzessMessage (ungeachtet dessen was andere darüber sagen!) nach dem FileCreate.
Erich
|
|
DeadlyAppearance 
      
Beiträge: 113
Win 7
Delphi 2010 Arch., C# VS 2008
|
Verfasst: Do 28.02.08 09:47
Ich kann mich noch entsinnen, dass allein über Ini.Create auch Probleme aufgetreten sind.
Werde es aber heute Abend nocheinmal testen.
_________________ Als du auf die Welt kamst, weintest du, und um dich herum freuten sich alle. Lebe so, daß, wenn du die Welt verläßt, alle weinen und du allein lächelst.
|
|
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Do 28.02.08 10:33
DeadlyAppearance hat folgendes geschrieben: | Ich tippe mal dadrauf, dass im Moment FileCreate die Datei anlegt und anschließend in
Benutzung hält und dementsprechend nicht freigibt. |
Ja, wie wäre es, wenn du mit dem Handle, das dir FileCreate zurückgibt, die Datei auch mit FileClose wieder schließt? Da du ja nix weiter mit dem Handle machen willst: Delphi-Quelltext 1:
| FileClose(FileCreate(...)); |
Erichgue hat folgendes geschrieben: | | Ansonsten versuch es mit einem Application.ProzessMessage (ungeachtet dessen was andere darüber sagen!) nach dem FileCreate. |
Da bin ich auf die Erklärung gespannt was das Abarbeiten der Botschaftswarteschlange hier bringen soll...
Application.ProcessMessages macht nur dann Sinn, wenn Botschaften verarbeitet werden sollen (z.B. um die Anzeige zu aktualisieren o.ä.), es ist aber kein Wundermittel, das man einfach so irgendwo in den Code streut und dann geht alles. Wie gesagt: die Erklärung, was die Botschaftsabarbeitung hiermit zu tun hat, wäre sehr interessant.
Dann ist mir noch ein Fehler aufgefallen: DeadlyAppearance hat folgendes geschrieben: | Delphi-Quelltext 1:
| if FileExists(inipath) = False then | |
Das ist falsch, richtig wäre: Delphi-Quelltext 1:
| if FileExists(inipath) then | Warum das falsch und nicht nur überflüssig ist, wird hier sehr gut erklärt:
www.delphi-treff.de/...olean-werten/page/4/
|
|
DeadlyAppearance 
      
Beiträge: 113
Win 7
Delphi 2010 Arch., C# VS 2008
|
Verfasst: Do 28.02.08 12:06
Bezüglich der IF-Abfrage.
Schonmal vielen Dank für den Hinweis.
In meinem Fall sollte er ja nur Filecreate aufrufen, wenn FileExists false zurückgibt, also wenn keine Datei vorhanden ist.
Ansonsten soll er einfach alles abarbeiten.
In deinem Fall würde er ja nur Filecreate aufrufen, wenn es true zurückliefert. So habe ich es mal gelernt, dass wenn man nur if...then, dann geht er nur rein, wenn dies true ist.
Für meinen Fall müsste ich dann doch if not ... then richtig sein, oder verstehe ich hier etwas nicht?
Im Pseudocode:
Quelltext 1: 2: 3:
| Wenn Datei nicht existiert dann erstelle eine; arbeite alles ab; |
/edit
Eben nocheinmal gelesen:
Delphi-Quelltext 1: 2: 3: 4:
| if FileExists(FileName) = False then if not FileExists(FileName) then |
So habe ich das auch mal wärend meiner Ausbildungszeit gelernt.
Aber man wird ja nicht jüger *g*
Nochmal Danke für den Hinweis.
_________________ Als du auf die Welt kamst, weintest du, und um dich herum freuten sich alle. Lebe so, daß, wenn du die Welt verläßt, alle weinen und du allein lächelst.
|
|
DeadlyAppearance 
      
Beiträge: 113
Win 7
Delphi 2010 Arch., C# VS 2008
|
Verfasst: Do 28.02.08 20:30
Warum es anfangs nicht ging, weis ich leider nicht, aber
Delphi-Quelltext 1:
| ini := TIniFile.Create(inipath); |
Erstellt bei nichtvorhandener Ini-Datei diese. Auch der Schreibzugriff erfolgt ohne Fehler.
_________________ Als du auf die Welt kamst, weintest du, und um dich herum freuten sich alle. Lebe so, daß, wenn du die Welt verläßt, alle weinen und du allein lächelst.
|
|
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Do 28.02.08 21:49
Ja, natürlich "if not", ich hab da nicht drauf geachtet, weil es ja nur darum ging nicht mit true oder false zu vergleichen  .
|
|
|