Autor Beitrag
DeadlyAppearance
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 113

Win 7
Delphi 2010 Arch., C# VS 2008
BeitragVerfasst: Do 28.02.08 07:36 
Morgen zusammen.

Und zwar folgendes...

ausblenden 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

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 86

Win XP/2000/7
TurboPacal 7.0; Delphi 2/5/7; BDS 2006/2010/XE6; C#; MSSQl 2000
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 113

Win 7
Delphi 2010 Arch., C# VS 2008
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 28.02.08 10:33 
user profile iconDeadlyAppearance 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:
ausblenden Delphi-Quelltext
1:
FileClose(FileCreate(...));					

user profile iconErichgue 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... :roll:
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:
user profile iconDeadlyAppearance hat folgendes geschrieben:
ausblenden Delphi-Quelltext
1:
  if FileExists(inipath) = False then					
Das ist falsch, richtig wäre:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 113

Win 7
Delphi 2010 Arch., C# VS 2008
BeitragVerfasst: 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:

ausblenden Quelltext
1:
2:
3:
Wenn Datei nicht existiert dann
  erstelle eine;
arbeite alles ab;


/edit

Eben nocheinmal gelesen:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
// statt
  if FileExists(FileName) = False then
// richtig:
  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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 113

Win 7
Delphi 2010 Arch., C# VS 2008
BeitragVerfasst: Do 28.02.08 20:30 
Warum es anfangs nicht ging, weis ich leider nicht, aber
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 ;-).