Autor |
Beitrag |
ensacom
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mi 27.08.08 08:53
Hallo, ich lade eine DLL in der sich ein Formular befindet.
Mit diesem Formular greife ich auf eine MySQL Datenbank zu was auch alles super klappt. (mysqldirect)
Ich kann das Formular super über mine Anwendung starten und benutzen, nur wenn ich meine Hauptanwendung schließe
bekomme ich immer folgende Fehlermeldung.
Exception EAccessViolation in module ntdll.dll at 00061861.
Access violation at adress 771A1861 in module 'ntdll.dll'. Read of
adress 02010044.
im OnCreate meiner Form in der DLL habe ich unter anderem folgendes stehen.
Delphi-Quelltext 1:
| EmbeddedConnection.Connected := true; |
Kommentiere ich diese Zeile aus dann kann ich mein Programm ohne Fehlermeldung beenden nur kann ich dan eben mein Formular aus der DLL nicht nutzen weil ja keine Datenbankverbindung besteht.
Woran kann das liegen?
Danke
Moderiert von Narses: Delphi-Tags hinzugefügtModeriert von Narses: Topic aus Sonstiges (Delphi) verschoben am Mi 27.08.2008 um 09:51
|
|
iKilledKenny
      
Beiträge: 394
Erhaltene Danke: 8
Win XP
D5 Prof, C# Express 2005
|
Verfasst: Mi 27.08.08 10:03
Wie wird denn die Form aus der DLL geschlossen?
Wird dabei auch die DB-Verbindung entsorgt?
|
|
ensacom
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mi 27.08.08 10:17
Also so rufe ich die Form aus der DLL auf
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| implementation
{$R *.dfm}
procedure ShowParameterForm;stdcall; external 'Module\parameter.dll';
procedure TForm1.Button1Click(Sender: TObject); begin ShowParameterForm; end; |
Das ist die Procedure in der DLL
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| procedure ShowParameterForm; stdcall; begin frm_Adressarten := Tfrm_Adressarten.Create(nil); try frm_Adressarten.ShowModal; finally frm_Adressarten.EmbeddedConnection.Connected := False; end; end;
exports ShowParameterForm; |
Datenbank schließe ich im onDestroy des Formulars in der DLL
|
|
Xentar
      
Beiträge: 2077
Erhaltene Danke: 2
Win XP
Delphi 5 Ent., Delphi 2007 Prof
|
Verfasst: Mi 27.08.08 10:23
Gibst du das Formular auch irgendwo wieder frei?
_________________ PROGRAMMER: A device for converting coffee into software.
|
|
ensacom
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mi 27.08.08 10:23
Nein, wo macht man das denn?
Ich dachte das geht automatisch wenn ich es schließe.
Also ich hab es mal mit einer showmessage getestet.
Das frm_Adressarten.Release; aus der procedure ShowParameterForm wird beim schließen des Formulars aus der dll auf jeden Fall aufgerufen.
Kann ich eigentlich irgendwie aus der Form in der DLL auf eine Datenbankkomponente meiner Hauptanwendung zugreifen?
Wie geht das?
Danke
|
|
Mike19
      
Beiträge: 256
Win XP, Vista, Win 7
Delphi 2005, Turbo Delphi
|
Verfasst: Mi 27.08.08 10:32
Hallo,
ich habe mir angewöhnt, alle Formulare welche durch eine DLL erzeugt werden durch FreeAndNil wieder freizugeben. Dadurch habe ich auch keine Fehlermeldungen mehr beim Shliessen und wieder neu Öffnen.
|
|
ensacom
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mi 27.08.08 10:33
und wo genau gibst du die dann frei?
Macht das niht mein frm_Adressarten.Release;?
freeandnil gibts bei mir gar nicht
es gibt nur freeonrelease
Habe anstatt frm_Adressarten.Release; frm_Adressarten.FreeOnRelease benutzt
Nun bekomme ich keinen Fehler beim schließen meiner Hauptanwendung mehr, aber dafür höre ich immer einen Ton wie bei Falscheingaben.
Wie kann ich den unterdrücken und wieso kommt der?
Zuletzt bearbeitet von ensacom am Mi 27.08.08 10:39, insgesamt 1-mal bearbeitet
|
|
iKilledKenny
      
Beiträge: 394
Erhaltene Danke: 8
Win XP
D5 Prof, C# Express 2005
|
Verfasst: Mi 27.08.08 10:38
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| procedure ShowParameterForm; stdcall; begin frm_Adressarten := Tfrm_Adressarten.Create(nil); try frm_Adressarten.ShowModal; finally frm_Adressarten.Free; end; end; |
Das Schliessen der DB-Verbindung würde ich im OnClose/OnDestroy der Tfrm_Adressarten machen.
|
|
ensacom
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mi 27.08.08 10:41
Also wenn ich dein Beispiel verwende, also nur free;
dann bekomme ich die Fehlermeldung auch. Mit FreeOnRelease bekomme ich wie gesagt die Fehlermeldung nicht aber eben diesen Ton wie wenn man eine Falscheingabe macht.
Wie bekomme ich den Ton weg und wieso bekomme ich ihn?
|
|
iKilledKenny
      
Beiträge: 394
Erhaltene Danke: 8
Win XP
D5 Prof, C# Express 2005
|
Verfasst: Mi 27.08.08 10:44
Was tut denn deine Klasse Tfrm_Adressarten? Ich denke da liegt der Hund begraben.
|
|
ensacom
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mi 27.08.08 10:50
Nicht viel. ist eine ComboBox in die Daten aus einer Datenbank geladen werden.
Beim onSelect der ComboBox werden Daten aus einer Datenbank in eine ListBox geladen.
Dann noch ein paar Funktionen zum erstellen, bearbeiten und löschen von Datensätzen.
Habe ja alles schonmal einzeln auskommentiert, erst als ich den Eintrag EmbeddedConnection.Connected := True;
auskommentiert habe lief es ohne Fehler. Allerdings bekomme ich dann auch nichts angezeigt weil ja die DBConnection fehlt.
Kann ich irgendwie auf die Datenbankkomponente meiner Hauptanwendung zugreifen?
|
|
iKilledKenny
      
Beiträge: 394
Erhaltene Danke: 8
Win XP
D5 Prof, C# Express 2005
|
Verfasst: Mi 27.08.08 10:52
Was tust du beim Entsorgen der Form (destructor, OnDestroy, OnClose...)? Halt die üblichen Verdächtigen. Wird an einer dieser Stellen deine DB-Verbindung wieder geschlossen?
Was für eine DB-Verbindung ist das überhaupt?
|
|
ensacom
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mi 27.08.08 10:54
im onClose der Form in der DLL habe ich das stehen
Delphi-Quelltext 1:
| EmbeddedConnection.Connected := False; |
Das schließt die Verbindung zur Datenbank
Es handelt sich um eine Embedded MySQL Datenbank.
Ich benutze die Zeos Komponenten (TZConnection und TZQuerry)
Zuletzt bearbeitet von ensacom am Mi 27.08.08 11:00, insgesamt 1-mal bearbeitet
|
|
Mike19
      
Beiträge: 256
Win XP, Vista, Win 7
Delphi 2005, Turbo Delphi
|
Verfasst: Mi 27.08.08 10:59
hier mal ein Beispiel, wie ich es mache, man sol mich des Besseren belehren.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| procedure FPEcreate; stdcall; begin
FPE:=TFPE.Create(nil); FPE.ShowModal; FreeAndNil(FPE); end;
exports FPEcreate; |
damit gebe ich die erzeugte Form und alle Inhalte frei, bisher ohne Probleme.
|
|
iKilledKenny
      
Beiträge: 394
Erhaltene Danke: 8
Win XP
D5 Prof, C# Express 2005
|
Verfasst: Mi 27.08.08 11:05
OFFTOPIC @Mike19:
Kein Unterschied zu meinem Vorschlag mit .Free;, da die Variable FPE nach FreeAndNil nicht mehr benutzt wird.
ONTOPIC:
Ich würde an deiner Stelle alles, außer dem Connected := True; und dem Connected := False; mal auskommentieren. Ich kann mir nicht vorstellen, dass es daran liegt.
Ansonsten kann ich nicht viel mehr sagen, da ich die ZEOS nocht kenne.
|
|
Xentar
      
Beiträge: 2077
Erhaltene Danke: 2
Win XP
Delphi 5 Ent., Delphi 2007 Prof
|
Verfasst: Mi 27.08.08 11:19
_________________ PROGRAMMER: A device for converting coffee into software.
|
|
ensacom
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mi 27.08.08 11:20
Das habe ich gemacht. es liegt also eindeutig an diesem connect
Es funktioniert alles nur beim beenden bekomme ich den Fehler.
Kann mir einer sagen wie ich aus meiner DLL-Form auf Komponenten der Hauptform zugreifen kann?
|
|
iKilledKenny
      
Beiträge: 394
Erhaltene Danke: 8
Win XP
D5 Prof, C# Express 2005
|
Verfasst: Mi 27.08.08 11:27
Indem du sie von der Hauptform in die DLL-Funktion als Parameter übergibst.
|
|