Autor Beitrag
goCM
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18



BeitragVerfasst: Do 17.07.08 10:37 
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.

ausblenden 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:

ausblenden 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');     //Name nicht Pfad
  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:
ausblenden Delphi-Quelltext
1:
 WriteString(Section, IntToStr(k), Format('"%s"', [List[k]]));					

in
ausblenden 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:
ausblenden Delphi-Quelltext
1:
2:
 if SaveListBoxToIni(IniPath,'ListBox1',ListBox1)
  then    SaveListBoxToIni(IniPath,'ListBox2',ListBox2);

vgl.:
ausblenden 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 ?
KillerLink
Hält's aus hier
Beiträge: 1



BeitragVerfasst: Fr 29.08.08 14:46 
Hallo. Ich glaube für dein Problem eine Lösung zu kennen.

Ich bin ziemlich neu als Programmieren, hab aber doch bereits einige kenntnisse.

Du musst meiner Ansicht nach, eine bestimmten wert, (variable, die für den File Path zuständig ist, glaub ich) wieder freigeben, den der befehle braucht. Sonst greifft der erste befehl immer noch darauf zu, und der zweite kann es dann nicht.

Die freigabe geschieht durch den befehl:
VARIABLENNAME.free

Ich hoffe, ich konnte helfen, wenn nicht, dann kann es auch daran liegen, das ich es mies erklärt habe ;)


P.S.: Ich schlage mich auch mit dem Speichern und Laden herum, aber ich bin noch weit enfernt, es zu verstehn.
Schreiben kann ich die datei, aber ich bekomme die werte nicht mehr heraus ;(
wazup
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 101

Windows XP
Delphi 2009
BeitragVerfasst: Fr 29.08.08 15:25 
Ich kann dir eine Lösung von mir anbieten:
ausblenden volle Höhe Delphi-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:
uses
  INIFiles;

procedure ListBoxToINI(const AINIFile, ASection: string; ListBox: TListBox);
var
  INI: TINIFile;
  I: Integer;
begin
  INI := TINIFile.Create(AINIFile);
  try
    INI.EraseSection(ASection);

    INI.WriteInteger(ASection, 'Count', ListBox.Items.Count);

    for I := 0 to ListBox.Items.Count - 1 do
    begin
      INI.WriteString(ASection, 'Item' + IntToStr(I), ListBox.Items[I]);
    end;
  finally
    INI.Free;
  end;
end;

procedure INIToListBox(const AINIFile, ASection: string; ListBox: TListBox);
var
  INI: TINIFile;
  I, Count: Integer;
begin
  INI := TINIFile.Create(AINIFile);
  try
    Count := INI.ReadInteger(ASection, 'Count'0);

    for I := 0 to Count - 1 do
    begin
      ListBox.Items.Add(INI.ReadString(ASection, 'Item' + IntToStr(I), '0'));
    end;
  finally
    INI.Free;
  end;
end;
wazup
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 101

Windows XP
Delphi 2009
BeitragVerfasst: Fr 29.08.08 15:33 
user profile iconKillerLink hat folgendes geschrieben:
...VARIABLENNAME.free...


Also willst du darauf hinaus?
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
var
  MyString: string;
begin
  try
    MyString := 'LOL';
    Caption := MyString;
  finally
    MyString.Free; // Kann man vllt mit "FreeAndNIL" freigeben aber was bringts ?
  end;
end;

Du kannst wenn schon Klassen Freigeben aber keine Variablen