![]() |
EAccessViolation beim beenden
Hi,
hab da mal ein Problem bei meinem Adress-tool. undzwar läuft bis jetzt alles wunderbar, doch wenn ich das Programm schließe dann kommt immer ne Fehlermeldnung in der was von EAccessViolation steht. Hier mal der Code, vieleicht findet ihr da ja was raus!
Code:
ich hab auch schon versucht beim onClose der Form von der Datenbank zu disconnecten, aber das brachte absolut keine Veränderung.
unit main;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Menus, ComCtrls, StdCtrls, DB, ZQuery, ZMySqlQuery, ZConnect, ZMySqlCon, ZTransact, ZMySqlTr; type TForm1 = class(TForm) MainMenu1: TMainMenu; Hilfe1: TMenuItem; Einstellungen1: TMenuItem; Zugangsdaten1: TMenuItem; ListView1: TListView; StatusBar1: TStatusBar; Hilfe2: TMenuItem; N1: TMenuItem; Info1: TMenuItem; edName: TEdit; Label1: TLabel; edEmail: TEdit; Label2: TLabel; edTelefon: TEdit; Label3: TLabel; edFax: TEdit; Label4: TLabel; Button1: TButton; Button2: TButton; Button3: TButton; Button4: TButton; trMain: TZMySqlTransact; qrMain: TZMySqlQuery; dsMain: TDataSource; dbMain: TZMySqlDatabase; edID: TEdit; Label5: TLabel; procedure Button1Click(Sender: TObject); procedure Connect; procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure Button3Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Connect; begin dbMain.Host:='********'; dbMain.login:='********'; dbMain.Password:='********'; dbMain.Database:='delphi'; dbMain.Connected:=true; end; procedure TForm1.Button1Click(Sender: TObject); begin connect; try qrMain.Sql.Text:='INSERT INTO `telebase` (`id`,`name`,`email`,`telefon`,`fax`) '+ 'VALUES '+ '('''','''+edName.Text+''','''+edEmail.Text+ ''', '''+edTelefon.Text+''','''+edFax.Text+ ''');'; qrMain.ExecSql; finally dbMain.Connected:=false; end; end; procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin dbMain.Connected:=false; end; procedure TForm1.Button3Click(Sender: TObject); begin connect; try qrMain.Sql.Text:='DELETE FROM `telebase` WHERE `id`='+edID.Text+';'; qrMain.ExecSql; finally dbMain.Connected:=false; end; end; end. |
Hallo wo0zy,
Zunächst einmal solltest Du die Connect Methode in Deinem Try finally Block unterbringen. Dann Solltest Du vor einem Disconnect Abfragen, ob die Verbindung noch besteht. Überarbeitet sieht das so aus:
Delphi-Quellcode:
Gruß, Tom
unit main;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Menus, ComCtrls, StdCtrls, DB, ZQuery, ZMySqlQuery, ZConnect, ZMySqlCon, ZTransact, ZMySqlTr; type TForm1 = class(TForm) MainMenu1: TMainMenu; Hilfe1: TMenuItem; Einstellungen1: TMenuItem; Zugangsdaten1: TMenuItem; ListView1: TListView; StatusBar1: TStatusBar; Hilfe2: TMenuItem; N1: TMenuItem; Info1: TMenuItem; edName: TEdit; Label1: TLabel; edEmail: TEdit; Label2: TLabel; edTelefon: TEdit; Label3: TLabel; edFax: TEdit; Label4: TLabel; Button1: TButton; Button2: TButton; Button3: TButton; Button4: TButton; trMain: TZMySqlTransact; qrMain: TZMySqlQuery; dsMain: TDataSource; dbMain: TZMySqlDatabase; edID: TEdit; Label5: TLabel; procedure Button1Click(Sender: TObject); procedure Connect; procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure Button3Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Connect; begin dbMain.Host:='********'; dbMain.login:='********'; dbMain.Password:='********'; dbMain.Database:='delphi'; dbMain.Connected:=true; end; procedure TForm1.Button1Click(Sender: TObject); begin try Connect; qrMain.Sql.Clear; qrMain.Sql.Add('INSERT INTO `telebase` (`id`,`name`,`email`,`telefon`,`fax`) '); qrMain.Sql.Add('VALUES '); qrMain.Sql.Add('('''','''+edName.Text+''','''+edEmail.Text); qrMain.Sql.Add(''', '''+edTelefon.Text+''','''+edFax.Text+''');'); qrMain.ExecSql; finally if qrMain.Connected=True then dbMain.Connected:=false; end; end; procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin if qrMain.Connected=True then dbMain.Connected:=false; end; procedure TForm1.Button3Click(Sender: TObject); begin try Connect; qrMain.Sql.Clear; qrMain.Sql.Add('DELETE FROM `telebase` WHERE `id`='+edID.Text+';'); qrMain.ExecSql; finally if qrMain.Connected=True then dbMain.Connected:=false; end; end; end. |
Hi,
ich hab das mal ausprobiert, doch leider hat da zu keinem Ergebnis geführt. Gibts da vieleicht noch irgendetwas anderes woran es liegen könnte? |
Hast Su schonmal versucht, da reinzudebuggen?
Haltepunkt aufs FormClose und dann mal gucken, bei welcher Zeile er die AccVio bringt. |
also ich hab das jetzt mal versucht, aber iregendwie war das ganz schön merkwürdig, er hat alle units von zeos durchlaufen die benötigt wurden, und dann is raus gekommen das bei query.free diese meldung kommt. aber es muss an meinem code liegen denn ich hab schon 2 andere programme mit den gleichen komponenten geschrieben und da kam sowas nicht.
|
Hallo wo0zy,
Überprüfe mal durch Debuggen, ob sich an der Stelle, wo query.free aufgerufen wird, Query = nil ist. Gruß, Tom |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:49 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 by Thomas Breitkreuz