Entwickler-Ecke
Datenbanken - AccessViolation Adr. 00000000 bei Embedded Firebird mit Zeos
jjturbo - Do 20.01.11 08:50
Titel: AccessViolation Adr. 00000000 bei Embedded Firebird mit Zeos
Moin Forum,
habe hier ein kleines Programm, welches eine Firebird DB erstellt, dort eine Tabelle erstellt und anzeigt.
Das Programm startet, ich sehe die Daten. Aktiv ist jetzt eine ZTable-Komponente.
Wenn ich jetzt folgende Code ausführe (Per Klick auf einen Button)
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| procedure TForm1.ButtonSQLClick(Sender: TObject); var SQLText :String; begin ZTable1.Active := false; DataSource1.DataSet := Form1.ZQuery1; ZQuery1.Connection := ZConnection1; SQLText := ComboBoxSQL.Text; Form1.ZQuery1.SQL.Clear; Form1.ZQuery1.SQL.SetText(PChar(SQLText));
if Pos('SELECT',UpperCase(SQLText)) = 0 then Form1.ZQuery1.ExecSQL else Form1.ZQuery1.Active := True;
end; |
Dann bekomme ich eine Zugriffsverletzung an Adresse 00000000. Aber nur beim ersten Mal. Beim zweiten Klick auf den Button funktioniert es einwandfrei.
Ich verwende die Zeos-Kompos 6.6.6 stable, die Firebird-DLL´s haben das Datum 21.06.2010.
Weiß jemand Rat?
Gruß Oliver
jaenicke - Do 20.01.11 09:05
Du setzt zuerst die Table aktiv und weist danach erst Datenbankkomponenten noch zu. Das kann nicht gut gehen, wenn die von der Table verwendet werden...
jjturbo - Do 20.01.11 09:09
Das Programm startet, der ZTable wird die Datenbankkomponente zugewiesen, Activ auf True gesetzt. Das funktioniert ja auch. Erst jetzt kommt die Query ins Spiel.
Und sorry, ich vergaß zu sagen: Es hat ja auch schon funktioniert :(
Ich habe keine Ahnung warum auf einmal dieser Fehler auftritt...
jaenicke - Do 20.01.11 10:39
Du hast da noch einen Fehler drin (analog weiter unten):
jjturbo hat folgendes geschrieben : |
Delphi-Quelltext 1: 2: 3: 4: 5:
| procedure TForm1.ButtonSQLClick(Sender: TObject); var SQLText :String; begin ZTable1.Active := false; DataSource1.DataSet := Form1.ZQuery1; | |
Du sprichst eine bestimmte Instanz deines Formulars an, das muss aber nicht die richtige sein...
jjturbo - Do 20.01.11 12:00
Verstehe ich jetzt irgendwie nicht...
Ich könnte theoretisch mehrere Instanzen von TForm1 haben, aber Form1 ist doch DIE Form1 die ich verwende, oder sehe ich da etwas falsch?
Nicht desto trotz... habe "Form1." da entfernt, ändert nichts.
jaenicke - Do 20.01.11 13:35
jjturbo hat folgendes geschrieben : |
| Ich könnte theoretisch mehrere Instanzen von TForm1 haben, aber Form1 ist doch DIE Form1 die ich verwende, oder sehe ich da etwas falsch? |
Nein, Self ist deine aktuelle, in der du bist. In der globalen Variable Form1 liegt die, die da zufällig als letztes reingepackt wurde.
jjturbo - Do 20.01.11 13:41
Also so?
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| procedure TForm1.ButtonSQLClick(Sender: TObject); var SQLText :String; begin Self.ZTable1.Active := false; Self.DataSource1.DataSet := Self.ZQuery1; Self.ZQuery1.Connection := Self.ZConnection1; SQLText := Self.ComboBoxSQL.Text; Self.ZQuery1.SQL.Clear; Self.ZQuery1.SQL.SetText(PChar(SQLText));
TRY Self.ZQuery1.Active := True; EXCEPT END;
end; |
ändert aber nix :bawling:
guinnes - Do 20.01.11 13:49
1. Was sagt der Debugger ? ( Wo kommt die Zugriffsverletzung )
2. Was soll das self ? Ohne Self gehts ganz genauso
jjturbo - Do 20.01.11 14:20
Das Self kann natürlich weg.
Ein Haltepunkt auf das "End" der Routine, dann bei dem Versuch mit F8 eine Zeile weiter zu springen tritt der Fehler auf:
| Zitat: |
| Im Projekt BlaBlaBla sind zu viele auseinanderfolgende Exceptions aufgetreten: "access violation at 0x00000000: read of adress 0x00000000". Prozess wurde angehalten. Mit einzelne Anweisung oder Start fortsetzen. |
(Und dort steht tatsächlich auseinanderfolgende) :)
Wenn ich dann noch mal den Button betätige, dann gehts...
guinnes - Do 20.01.11 14:31
Hast du es mal mit F7 versucht ? Notfalls mit dem CPU-Fenster ?
jjturbo - Do 20.01.11 14:34
Auch mit F7 kommt nach etwa 1-2 Sekunden exakt die gleiche Fehlermeldung.
jjturbo - Do 20.01.11 14:39
Hier mal noch das CPU-Fenster
Moderiert von
Narses: BMP->PNG und inline.
guinnes - Do 20.01.11 14:39
Hast du mal die Debug-DCU's eingebunden ?
jjturbo - Do 20.01.11 14:43
Was meinst Du damit? Die Zeos dcu´s ins Projekt einbinden?
jjturbo - Do 20.01.11 15:11
Ich habe jetzt mal von dem Button aus eine Botschaft an mein Formular geschickt:
Delphi-Quelltext
1: 2: 3: 4: 5:
| procedure TForm1.ButtonSQLClick(Sender: TObject); var SQLText :String; begin PostMessage(Form1.Handle,MeineMsg,0,0); end; |
Und wenn die Botschaft empfangen wird, dann wird der Code ausgeführt, der vorher im OnClick des Buttons war:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| procedure TForm1.MyMSG(var Message :TMessage); var SQLText :String; begin SQLText := 'SELECT * FROM ' + RueckPufferTabelle;
Form1.ZTable1.Active := false; Form1.DataSource1.DataSet := Form1.ZQuery1; Form1.ZQuery1.Connection := Form1.ZConnection1;
Form1.ZQuery1.Active := false; Form1.ZQuery1.SQL.Clear; Form1.ZQuery1.SQL.SetText(PChar(SQLText)); Form1.ZQuery1.Active := True; end; |
Und so funktioniert es :shock:
guinnes - Do 20.01.11 15:20
jjturbo hat folgendes geschrieben : |
| Was meinst Du damit? Die Zeos dcu´s ins Projekt einbinden? |
Die Zeos sind sowieso schon drin, ich meine die System-DCU's. In Delphi 5 prof gibts unter Projekt | Optionen | Compiler die Möglichkeit, einen Haken bei " Mit Debug-DCU's " zu setzen. Wenn angehakt, kannst du auch durch die VCL debuggen
guinnes - Do 20.01.11 15:25
jjturbo hat folgendes geschrieben : |
| Und wenn die Botschaft empfangen wird, dann wird der Code ausgeführt, der vorher im OnClick des Buttons war.Und so funktioniert es :shock: |
Dann wird irgendetwas überschrieben, was nicht überschrieben werden soll. Hast du Bereichs und Overflow-Checking eingeschaltet ?
ALF - Do 20.01.11 15:40
Ich weiss nicht!? Ich hab mal gelesen oder wurde mir gesagt, wenn eine
Quelltext
1:
| Zugriffsverletzung an Adresse 00000000 |
das etwas zwar declariert aber nicht initiallisiert wurde bzw wieder überschrieben/deaktiviert wurde
Vielleicht sollte er ein bischen mehr Code Zeigen, was vor den Aufruf passiert (o. die gesamte Unit z.B.)
Ansonsten wird es für alle doch nur ein Rätselraten!
Gruss ALf
jjturbo - Do 20.01.11 15:41
Habe mal mit Debug-DCU´s aktiviert, in der Unit Controls bleibt er hängen wenn der Fehler auftritt
Moderiert von
Narses: BMP->PNG und inline.
guinnes - Do 20.01.11 15:54
jjturbo hat folgendes geschrieben : |
| Habe mal mit Debug-DCU´s aktiviert, in der Unit Controls bleibt er hängen wenn der Fehler auftritt |
Wenn du jetzt mit F7 durchsteppst, solltest du zumindest die Stelle finden, wo es knallt
guinnes - Do 20.01.11 16:02
Jetzt kannst du noch kucken, was in FDefWndProc steht, da ist wahrscheinlich NIL drin. Also : Irgendwas überschreibt deine FDefWndProc.
jjturbo - Do 17.03.11 16:59
Also:
Ich habe mal Zeos 6.6.6 deinstalliert und die 7.0.0-alpha genommen, damit ist der Fehler beseitigt gewesen.
Es schien so schön...
Ein Kollege hatte auch das Problem mit einer solchen Zugriffsverletzung, gleiche Adresse, das gleiche Grundgerüst als Programm. Bei ihm hat das Verwenden der neueren Zeos-Kompos keine Besserung gebracht.
Also habe ich heute mal sein ganzes Projekt Stück für Stück zerpflückt. Ein TLMDSpeedButton auf unserer HauptForm ist für das Beenden des Programms vorgesehen:
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: 41: 42:
| procedure THauptForm.FTastenClick(Sender: TObject); var NrFTaste :Integer; s :String; begin
s := (Sender as TLMDSpeedButton).Name; Delete(s,1,15); NrFTaste := StrToIntDef(s,-1);
Case NrFTaste of 1: AufHandSchalten; 2: AufAutomatikSchalten; 3: AutomatikHalt; 4: AutomatikFortsetzen; 5: AnlageReset; 7: Werkzeugwechelposition; 10: begin PostMessage(HauptForm.Handle,WM_CLOSE,0,0); end; 12: ResetDrucker; end;
end;
procedure THauptForm.FormKeyDown(Sender: TObject; var Key: Word;Shift: TShiftState); begin
Case Key of 112: FTastenClick(LMDSpeedButtonF1); 113: FTastenClick(LMDSpeedButtonF2); 114: FTastenClick(LMDSpeedButtonF3); 115: FTastenClick(LMDSpeedButtonF4); 116: FTastenClick(LMDSpeedButtonF5); 118: FTastenClick(LMDSpeedButtonF7); 121: FTastenClick(LMDSpeedButtonF10); end;
end; |
Mit der Maus auf der LMDSpeedButtonF10: Fehler, auf der Tastatur F10 gedrückt alles in Ordnung, obwohl der gleiche Code ausgeführt wird.
Dann habe ich es mal mit einem TButton probiert, da gings mit Maus und Tastatur ohne Probleme. Jetzt habe ich festgestellt, dass es bei dem TLMDSpeedButton eine Option "UseGlobalTimer" gibt, diese von False auf True gesetzt und alles funktioniert wie gewünscht...
Weiß jemand, wofür diese Property gut ist? Wir haben schon einige Projekte am laufen, die alle die gleiche Leiste mit den FTasten haben.
ALF - Do 17.03.11 17:24
Irgend ein Wiederspruch in Deiner Aussage. Ihr verwendet ja 10x LMDSpeedButton und nur bei LMDSpeedButtonF10 krachts :gruebel:
Da würde ich doch sicherhalts halber mal nicht die Eigenschaften ändern, sondern mal in der KeyDown zum Schluss folgendes reinschreiben Key:= 0. Jetzt kannst du testen, ob der Fehler weiter Auftritt.
quatsch: passiert ja beim Mausclick. Dann ruf doch einfach nur close auf anstatt Postmessage. nun schau was passiert!?
Alf
jjturbo - Fr 18.03.11 07:23
Widerspruch würde ich nicht sagen.
F10 soll ja das Programm beenden, dabei werden im Gegensatz zu den Aktionen auf den anderen Buttons ziemlich viele Komponenten freigegeben.
Ein einfaches Close an der Stelle habe ich natürlich auch probiert. Genau das selbe.
Ich habe spasseshalber an der Stelle statt "Close" mal einen 100ms-Timer enabled, bei dem im OnTimer-Ereignis HauptForm.Close aufgerufen wird: Das gleiche Verhalten, mit der Maus geklickt krachts, mit F10 ok.
ALF - Fr 18.03.11 12:49
mh..
sieht ja so aus das nicht alles frei gegeben wird?
Der Aufruf close ruft closequery auf. Prüfst du dort ob alles freigegeben wurde? Mal getestet?
Vielleicht noch ein Thread offen usw.?
ALf
jjturbo - Fr 18.03.11 12:54
Wie kann ich denn prüfen ob alles frei gegeben wurde?
Aber eigentlich ist zu dem Zeitpunkt alles frei gegeben worden.
Ich hatte ja auch ein annähernd leeres Projekt, in dem dieser Fehler auftrat. Darin hatte ich eh alle Threads usw. raus geschmissen.
jaenicke - Fr 18.03.11 12:59
Naja, du hast doch weiter oben schon geschrieben, dass es an den komischen Buttons liegt. Du kannst ja FastMM versuchen, ob das etwas findet.
ALF - Fr 18.03.11 13:03
jjturbo hat folgendes geschrieben : |
| ...Aber eigentlich ist zu dem Zeitpunkt alles frei gegeben worden. |
hab ich auch manchmal gedacht :wink:
jjturbo hat folgendes geschrieben : |
...
Ich hatte ja auch ein annähernd leeres Projekt, .... |
Nimm halt ein komplett leeres. Nur diesen einen Button, Close in diese Buttonclick und sehen ob es immer noch passiert! 8)
Wenn ja, ist die Compo buggylie!
Alf
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!