Entwickler-Ecke

Dateizugriff - INI-File plötzlich gesperrt nach Save-Dialog-gebrauch!!!!


Jebaz - Mo 06.01.03 17:36
Titel: INI-File plötzlich gesperrt nach Save-Dialog-gebrauch!!!!
Biiiiitteee, helft mir....ich bin am verzweifeln...

Ich schreibe seit Monaten hier im Geschäft an meinem Chat (mein Lehrmeister findets cool :wink: )und nun, hab ich ne funktion eingebaut, mit der man den geschriebenen, gechatteten Text als .rtf abspeichern kann. Nun, ich musste eine wirklich hässliche Lösung dazu verwenden, da bei der naheliegensten Lösung (-> gebrauch des Save-Dialogs) danach einfach das INI-File irgendwie gesperrt ist.

Also, einmal irgendwo im Programm den Save-Dialog geöffnet und die Datei gespeichert, folgt danach bei jedem weiteren zugriffsversuch auf die INI diese Fehlermeldung:

"Project JebiChat_Client.exe raised exception class EIniFileException with Message "Unable to write to ...\shibby\Config.ini". Process Stopped..."

Naja, ich hab wirklich nur nach gebrauch dieser verdammten Dialoge dieses Problem...die Pfadangaben stimmen, ich spiele ja inzwischen mit diesen INI-Files herum, mach ja nichts soooooo wahnsinnig falsch :oops: :twisted:

währe echt cool, wenn ihr mir helfen könnt, denn die Suchfunktion nach dem Begriff "INI" brachte zum vorschein, dass diese Problem glaub ich noch nie da behandelt wurde, oder seh ich das falsch?? ich denke, währen sicherlich noch andere Leute froh um eine Antwort...


Klabautermann - Mo 06.01.03 18:00

Hallo,

poste am bestem mal die Funktion, in der du den Save Dialog verwendest. Denn eigentlich kann es nicht sein. Wahrscheinlich mengst du versehentlich an der INI-Dateirum.

Gruß
Klabautermann


Jebaz - Mo 06.01.03 18:07
Titel: ne menge code
nun ja, ist ein bissle schwierig, aus der eigentlichen Funktion, in der der Save-Dialog zum zuge kommt, siehst du eigentlich nichst, ich poste ihn trotzdem mal:


Quelltext
1:
2:
3:
4:
if SaveDial.Execute then
   begin
      Messages.Lines.SaveToFile(SaveDial.FileName);
end;


nun, wenn ich danach das Programm schliesse, wird folgendes gemacht:


Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
   iConfig := TIniFile.Create('..\'+ChatFolderName+'\Config.ini');
   SaveConfig(TRUE);
   iConfig.Free;
   StopMIDI;
end;


StopMIDI könnt ihr mal vergessen, das hat sicher nix damit zu tun...tja, und die SaveConfig-function hab ich selbst geschrieben, die sieht volgendermassen aus:


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
rocedure TForm1.SaveConfig(MitStartWave: Boolean);
var
   sCache   : String;
   tmpColor : TColor;
   sColor   : String;
   iCache   : Integer;
begin
   sCache := cbFontName.Text;
   iConfig.WriteString('Font','Font Name',sCache);

   sCache := cbFontSize.Text;
   iConfig.WriteString('Font','Font Size',sCache);

   tmpColor := cbFontColor.Selected;
   sColor := ColorToString(tmpColor);

   iConfig.WriteString('Font','Font Color',sColor);

   if ToolButton1.Down then
      iConfig.WriteBool('Font','Font Bold',TRUE)
   else
      iConfig.WriteBool('Font','Font Bold',FALSE);

   if ToolButton3.Down then
      iConfig.WriteBool('Font','Font Italic',TRUE)
   else
      iConfig.WriteBool('Font','Font Italic',FALSE);

   if ToolButton4.Down then
      iConfig.WriteBool('Font','Font Underline',TRUE)
   else
      iConfig.WriteBool('Font','Font Underline',FALSE);

   if Messages.Color = $00FFE2C6 then
   begin
      iConfig.WriteString('Font','Hintergrundfarbe','$00FFE2C6');
   end else
   begin
      tmpColor := cbHintergrund.Selected;
      sColor := ColorToString(tmpColor);
      iConfig.WriteString('Font','Hintergrundfarbe',sColor);
   end;

   iCache := Form1.ClientWidth;
   iConfig.WriteInteger('Window','Width',iCache);

   iCache := Form1.ClientHeight;
   iConfig.WriteInteger('Window','Height',iCache);

   iCache := Form1.Left;
   iConfig.WriteInteger('Window','Left',iCache);

   iCache := Form1.Top;
   iConfig.WriteInteger('Window','Top',iCache);

   if Form1.WindowState = wsNormal then
   begin
      iConfig.WriteString('Window','State','wsNormal');
   end else
   begin
      if Form1.WindowState = wsMaximized then
      begin
         iConfig.WriteString('Window','State','wsMaximized');
      end else
      begin
         iConfig.WriteString('Window','State','wsMinimized');
      end;
   end;

   sCache := 'C:\WINNT\Media\tada.wav';
   iConfig.WriteString('Sound','Start Wave',sCache);

   if MitStartWave then
   begin
      if SoundForm.cbSound2.Checked then
      begin
         iConfig.WriteBool('Sound','Play Start Wave',TRUE);
      end else
      begin
         iConfig.WriteBool('Sound','Play Start Wave',FALSE);
      end;
      iConfig.WriteString('Sound','Start Wave',SoundForm.Edit2.Text);
   end;
end;


naja, sorry, ist ein bisschen viel, mein Chat wächst und wächst...naja, hoffentlich hab ich da mächtig was falsch gemacht, ich kann mir jedenfalls nicht mehr helfen...danke für eure Mühe


Raphael O. - Mo 06.01.03 18:43

machs halt ohne den save dialog...
wenn es wirklich an dem liegt...
das ist schneller geschafft als so eine fehlersuche...

vielleicht ist die ini-datei ja schreibgeschützt?? (Wodurch das bei einem save dialoggebrauch passieren sollte ist mir allerdings nicht klar :? )

Fiji-Fighter


Klabautermann - Mo 06.01.03 18:54
Titel: Re: ne menge code
Hallo,

ich würde sagen dein Problem liegt hier:

Jebaz hat folgendes geschrieben:

Quelltext
1:
   iConfig := TIniFile.Create('..\'+ChatFolderName+'\Config.ini');                    


Du solltest nicht mit relativen Pfadangaben wie '..' Arbeiten, da du immer die Frage hast, von wo aus gesehen dies geschieht. Ich vermute, das dir der Save Dialog as Ausgangsverzeichnis verstellt. Angenommen du speicherst deinen RTF-Text als 'C:\Test.rtf' und der Save Dialog verschiebt dein Anfangsverzeichnis auf 'C:\'. Wo liegt dann 'C:\..\' + ChatFolderName + 'Config.ini'?
Verwende besser ExtractFileName(ParamStr(0)) [http://www.auq.de/viewtopic.php?t=225] oder ähnliches.

Probiere es mal aus. Wenn der Fehler weiterhin besteht, melde dich noch mal. Dann suche ich weiter ;).

Gruß
Klabautermann


Klabautermann - Mo 06.01.03 18:57

Hallo,
Fiji-Fighter hat folgendes geschrieben:
das ist schneller geschafft als so eine fehlersuche...

mit der Einstellung wirst du dir nach und nach sämliche Programmiermöglichkeiten streichen und kannst irgendwann garnichts mehr machen. Man sollte immer versuchen rauszufinden warum ein Fehler auftrit. Danach kann man immernoch entscheiden wie aufwändig es ist ihn zu beheben.

Gruß
Klabautermann


Delete - Mo 06.01.03 19:49

Fiji-Fighter hat folgendes geschrieben:
machs halt ohne den save dialog...
wenn es wirklich an dem liegt...
das ist schneller geschafft als so eine fehlersuche...

vielleicht ist die ini-datei ja schreibgeschützt?? (Wodurch das bei einem save dialoggebrauch passieren sollte ist mir allerdings nicht klar :? )

Spitze und dann beschweren sich alle, das Microsoft so viele Bugs in Windows hat.


Jebaz - Do 09.01.03 09:19
Titel: Gelöst!
Danke vielmals an euch, besonders an Klabautermann :lol: es lag an meinen Relativen-Pfad-Angaben. Ich verwende nun den Absoluten Pfad wenn ich das INI-File kreire und siehe da, nun funktioniert alles :wink:


Klabautermann - Do 09.01.03 11:51

Hallo,

schön das es jetzt klapt.

Ich hoffe du erstellst den Absoluten Pfad Dynamisch (also wie ich erwähnt habe üder paramStr(0) bzw. Application.Exename) denn sonst wirst du Probleme bekommen wenn du das Programm weitergiebst.

Gruß
Klabautermann


Jebaz - Mo 13.01.03 09:02
Titel: Perfekt ;-)
Zitat:
Ich hoffe du erstellst den Absoluten Pfad Dynamisch ...
jep, genau das mach ich...hab ich vorhin schon getan und wollte noch sicherer werden mit dem relativen-pfad, was aber nichts brachte...nochmals danke :dance:

MfG