Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Error EAccessViolation (https://www.delphipraxis.net/85902-error-eaccessviolation.html)

Z32 6. Feb 2007 17:16


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:
{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;
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)

Ich hoffe, dass ihr durch den Quelltext blickt und auf eure hilfe :wink:

shmia 6. Feb 2007 17:37

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:20 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz