Ich habe folgendes Tutorial: Navigation: Delphi-Library.de » Dateizugriff » ...ListBox, Memo usw. in eine Ini speicher und wieder laden?
www.delphi-library.d...der+laden_21553.html
in leicht veränderter Form umgesetzt.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| function SaveListBoxToIni(const IniPath, Section:String;List:TListBox):Boolean; var i: Integer; myini:TIniFile; begin myini:=TIniFile.Create(IniPath); try myini.EraseSection(Section); for i := 0 to List.Items.Count - 1 do myini.WriteString(Section, IntToStr(i), Format('"%s"', [List.Items.Strings[i]])); Result := True; finally myini.Free end; end; |
und als Prozedur:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| procedure TForm1.Button9Click(Sender: TObject); var IniPath: String; dir:string; begin dir:=GetCurrentDir; IniPath:=('Egui.ini'); if SaveListBoxToIni(IniPath,'ListBox1',ListBox1) then SaveListBoxToIni(IniPath,'ListBox2',ListBox2); end; |
Nun trat folgendes Problem auf:
Mit dem Originalcode ging es auf einem PC mit 2007 ohne Probleme.
Auf einem anderen mit Delphi 7 funktionierte es nicht.
Deshalb wurden Veränderungen bei List von:
Delphi-Quelltext
1:
| WriteString(Section, IntToStr(k), Format('"%s"', [List[k]])); |
in
Delphi-Quelltext
1: 2: 3:
| myini.WriteString(Section, IntToStr(i), Format('"%s"', [List.Items.Strings[i]])); durchgeführt , aber erstmal ohne Erfolg. |
Die AccessViolation trat auf, wenn man mehrmals hintereinander abgespeichert hat. Beim ersten Mal funktionierte es, beim 2-3 Mal trat die AccessViolation auf. Durch Löschen der Ini Datei nach dem ersten Speichern ließ sich der Fehler beim nächsten mal speichern drücken "umgehen".
Zu dem Zeitpunkt befand sich die Funktion SaveListBoxToIni in einer dll.
Wenn man die Funktion zu Testzwecken wieder normal eingebaut hatte trat der Fehler immer noch auf.
Erst durch die if then Abfrage konnte er rausgehauen werden:
Delphi-Quelltext
1: 2:
| if SaveListBoxToIni(IniPath,'ListBox1',ListBox1) then SaveListBoxToIni(IniPath,'ListBox2',ListBox2); |
vgl.:
Delphi-Quelltext
1: 2:
| SaveListBoxToIni(IniPath,'ListBox1',ListBox1); SaveListBoxToIni(IniPath,'ListBox2',ListBox2); |
Hat man die Funktion nun wieder durch die dll aufgerufen, trat die AccessViolation wieder auf.
Also zusammengefasst: Funktion und Prozedur mussten zusammenstehen und Prozedur mit If Then versehen werden damit es lief.
Hat jemand vielleicht eine Ahnung woher das kommen könnte ?