![]() |
Error EAccessViolation
Hallo,
Ich habe ein Problem, umd zwar weiß ich nicht warum ich am ende meimer Procedure immer den Error "EAccessViolation" bekomme. Erstmal zu der Procedure, die stammt aus meinem Kontoverwaltungsprogramm und ist zum speichern eingegebener Daten in eine Ini Datei gedacht. Jedoch soll befor der Name eines Kontos geändert wird erst überprüft werden ob schon ein konto mit dem selben Namen vorhanden ist. Und an der Stelle haperts :(
Delphi-Quellcode:
Bisher klappt das ändern der Detials und das ändern des kontonamen, wenn der neue nicht schon vorhanden ist. Aber wenn der neue name schon vorhanden ist, kommt eben dieser fehler (s.o)
{FORM1.BUTTON1.CLICK - DATEN SPEICHERN}
procedure TForm1.Button1Click(Sender: TObject); var x: string; begin if not (combobox1.Text='Bitte wählen') then {abfragen ob in der Benutzer überhaupt ein konto gewählt hat} begin if not (combobox1.Text='Bargeld') then {abfragen ob nicht das bargeldkonto gewählt ist} begin x:='k'; ini01:=TIniFile.create(ExtractFilePath(ParamStr(0))+'kvload.ini'); try if combobox1.Text=edit1.Text then {abfragen ob überhaupt ein neuer name eingegeben wurde} begin ini01.EraseSection(combobox1.Text); ini01.WriteString(edit1.Text,'Inhaber',edit2.Text); ini01.WriteString(edit1.Text,'Bank',edit3.Text); ini01.WriteString(edit1.Text,'Bankleitzahl',edit4.Text); ini01.WriteString(edit1.Text,'Kontonummer',edit5.Text); ini01.WriteString(edit1.Text,'Kommentar',edit6.Text); ini01.WriteInteger(edit1.Text,'Kapital',strtoint(label19.Caption)); end else {es wurde ein neuer name eingegeben} begin if ini01.SectionExists(edit1.Text) then {abfragen ob der neue name schon vorhanden ist} begin edit1.Text:=combobox1.Text; showmessage('Daten speichern fehlgeschlagen! Den eingegebenen Kontonamen gibt es schon'); end else {er ist noch nicht vorhanden, also speichern} begin ini01.EraseSection(combobox1.Text); ini01.WriteString(edit1.Text,'Inhaber',edit2.Text); ini01.WriteString(edit1.Text,'Bank',edit3.Text); ini01.WriteString(edit1.Text,'Bankleitzahl',edit4.Text); ini01.WriteString(edit1.Text,'Kontonummer',edit5.Text); ini01.WriteString(edit1.Text,'Kommentar',edit6.Text); ini01.WriteInteger(edit1.Text,'Kapital',strtoint(label19.Caption)); end; end; finally ini01.Free; end; end else {besonderheit beim bargeld konto, man kann den namen nicht ändern...} begin {...deshalb unwichtig} x:='b'; ini01:=TIniFile.create(ExtractFilePath(ParamStr(0))+'kvload.ini'); try ini01.EraseSection(combobox1.Text); ini01.WriteString(combobox1.Text,'Kommentar',edit6.Text); ini01.WriteInteger(combobox1.Text,'Kapital',strtoint(label19.Caption)); finally ini01.Free; end; end; ini01:=TIniFile.create(ExtractFilePath(ParamStr(0))+'kvload.ini'); {der combobox werden alle konten zugeordnet} try ini01.ReadSections(combobox1.Items); finally ini01.Free; end; if x='k' then {combobox.text wird mit dem aktuellem kontonamen (neu, oder nicht) geladen} combobox1.Text:=edit1.Text; if x='b' then combobox1.Text:='Bargeld'; showmessage('Daten erfolgreich gespeichert'); end else begin showmessage('Daten speichern fehlgeschlagen'); end; end; Ich hoffe, dass ihr durch den Quelltext blickt und auf eure hilfe :wink: |
Re: Error EAccessViolation
1. Tipp: statt nichtssagende Namen wie Edit1 oder Combo1 verwende doch sprechende Bezeichner wie z.B. EdtKonto
2. Tipp: statt 25 Mal Edit1.Text zu schreiben, verwendet doch Zwischenvariablen, die schon im Namen erklären wozu sie gut sind. (z.B. "inisection") Die Zwischenvariablen werden einmal am Anfang der Prozedure zugewiesen und dann verwendet 3. Tipp: du brauchst das INI-Objekt nur einmal erzeugen und am Ende der Prozedure ein Mal freigeben. "ini01" sollte unbedingt eine lokale Variable sein. 4. Tipp: du kannst deinen Spaghetticode mit Tipp 1 bis 3 schön aufräumen und dann nochmals hier vorstellen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:08 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz