Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi DLL richtig beenden (https://www.delphipraxis.net/89741-dll-richtig-beenden.html)

Tommy82 5. Apr 2007 07:23


DLL richtig beenden
 
Hallo,

zuerst mein Quelltext:

Delphi-Quellcode:
Procedure Artikel_Neu;
var
 Form_anlegen : TForm_Anlegen;
BEGIN
 Form_Anlegen := TForm_Anlegen.Create(NIL);
 Try
  Form_Anlegen.Showmodal;
 Finally
  Form_Anlegen.Release;
 End;
END;
Das klappt auch soweit ganz Prima, die Form wird aufgerufen, aber sobald ich die Form beenden will bekomme ich immer einen Fehler an Adresse "xy".
Ich habe es versucht mit "Form_Anlegen.Release" oder auch einfach nur mit Exit, mit "Form_Close" gehts auch net und mit Hide bleibt es ja immernoch da.
Wie beende ich nun das DLL Formular richtig ?

mfg

Tommy82

RavenIV 5. Apr 2007 07:40

Re: DLL richtig beenden
 
Versuch mal anstatt Form_Anlegen.Release; ein Form_Anlegen.Free;

ste_ett 5. Apr 2007 07:41

Re: DLL richtig beenden
 
Klassen werden mit "VarName.Free" freigegeben. :)

Prüfe, ob du im Programm und in der DLL die gleichen Aufrufkonventionen gesetzt hast (z.B. stdcall).

Tommy82 5. Apr 2007 07:59

Re: DLL richtig beenden
 
Hallo,

danke für die schnellen Antworten.

1) Habe jetzt mal das release gegen das Free getauscht.

Aufrufk. sind gleich (stdCall).

Der Fehler kommt immernoch. Welchen befehl gebe ich dazu, dass er das Form schließt ? Bei Form_anlegen.free tut sich nix, rest wieder Fehler.

mfg

Tommy82

Tommy82 10. Apr 2007 11:01

Re: DLL richtig beenden
 
Keiner eine Lösung ?

mfg

Tommy82

ste_ett 10. Apr 2007 11:09

Re: DLL richtig beenden
 
Erzeugst du irgendwelche Komponenten auf deinem Formular, die nicht wieder freigegeben werden?
Tritt der Fehelr auch auf, wenn du ein komplett neunes, leeres Formular anzeigst?

Geh mal mit dem Debugger durch und prüfe, an welcher Stelle der Fehler genau auftritt.

Beim "Free()"?
Beim "end;?"
Woanders?

Robert Marquardt 10. Apr 2007 11:16

Re: DLL richtig beenden
 
Wieso ist die Form ueberhaupt in einer DLL? Benutzt du ShareMem?

toms 10. Apr 2007 11:16

Re: DLL richtig beenden
 
Inwiefern hat dein Code mit "DLL richtig beenden" etwas zu tun?

Tommy82 10. Apr 2007 16:21

Re: DLL richtig beenden
 
Ich habe ein leeres Formular mal spaßeshalber benutzt, selbes Phänomen.

DLL (Aufruf des Formulars)
Delphi-Quellcode:
Procedure TestDll_Start;
var Form1 : TForm1;
BEGIN
 Form1 := TForm1.Create(NIL);
 Form1.ShowModal;
END;

exports
 TestDll_Start;

begin
end.
DLL (Beenden des Formulars)
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
 Form1.Free;
end;
nach dem ich auf den Beenden Button geklickt habe, bekomm eich einen Adress-Fehler.

Schon probiert :
Delphi-Quellcode:
Procedure TestDll_Start;
var Form1 : TForm1;
BEGIN
 Form1 := TForm1.Create(NIL);
 Try
  Form1.ShowModal;
 Finally
  Form1.Release;
 END;
END;

exports
 TestDll_Start;

begin
end.
.. aber das geht auch nicht.

Ich möchte das Formular gerne in eine DLL auslagern, da ich dieses Formular :
a) in mehreren Programmen verwenden möchte
b) ein Update des Formulars schneller möglich ist (ohne das Programm neu zu schreiben)

Nur sobald ich das Formular beende, bekomme ich immer : Zugriffsverletzung bei Adresse 0036D875 in Modul 'TestDll.dll'. Lesen von Adresse 00000000".

Wie kann ich nun das Formular beenden ohne einen Fehler zu bekommen?

mfg

Tommy82

brechi 10. Apr 2007 16:29

Re: DLL richtig beenden
 
Die Form kann sich doch nicht selbst freigeben. Und hast du mal ein leeres Formular benutzt mit dem Code den du vorher hattest. Also ShowModal + Form.free hintereinander?

Tommy82 10. Apr 2007 16:46

Re: DLL richtig beenden
 
Showmodal + Free klappt nicht hintereinander

ste_ett 10. Apr 2007 16:53

Re: DLL richtig beenden
 
Zitat:

Zitat von Tommy82
Showmodal + Free klappt nicht hintereinander

Warum sollte das nicht gehen?
Es ist ein lokales Objekt, was nach Beendigung der Funktion "ShowModal()" ohne Weiteres wieder freigegeben werden kann. :)

Tommy82 10. Apr 2007 17:02

Re: DLL richtig beenden
 
Delphi-Quellcode:
Procedure TestDll_Start;
var Form1 : TForm1;
BEGIN
 Form1 := TForm1.Create(NIL);
 Form1.ShowModal;
 Form1.Free;
END;
Formular bleibt offen, es tut sich nix
mfg

Tommy82

Tommy82 10. Apr 2007 17:19

Re: DLL richtig beenden
 
Delphi-Quellcode:
Procedure TestDll_Start;
var Form1 : TForm1;
BEGIN
 Form1 := TForm1.Create(NIL);
 Form1.Show;
 Form1.Free;
END;
da schließt sich das Fenster SOFORT wieder (flackert).

Aber wie baue ich es nun in die Form1 ein?

MyRealName 10. Apr 2007 17:30

Re: DLL richtig beenden
 
setz mal in den Optionen von exe und dll auf "build with runtime packages" und lass dort RTL und VCL drin stehen. das sollte dein Problem beheben, denn ohne arbeiten exe und DLL jeweils mit einer eigenen Kopie der VCL.
Ansonsten ist es kein problem, folgendes zu machen :

Delphi-Quellcode:
  form1 := TForm1.Create(Application);
  try
    form1.showmodal;
  finally
    form1.free;
  end;

Tommy82 10. Apr 2007 17:36

Re: DLL richtig beenden
 
Wenn ich auf das Formular einen Butten setze und den mit
Delphi-Quellcode:
Self.Release oder Self.Free
setze, dann klappt das auch.

mfg

Tommy82

oki 10. Apr 2007 17:51

Re: DLL richtig beenden
 
Hi,

das ist ein Code den ich in einer meiner Kompos zum aufruf eines Einstellungsfensters benutze. Klappt anstandslos:


Delphi-Quellcode:
procedure TBaseSeyControl.PropertyButtonClick(Sender: TObject);
var PropForm : TBaseSeyControlPropForm;
begin
   PropForm := TBaseSeyControlPropForm.Create(self);
   try
     LoadItemsinPropertyForm(PropForm);
     PropForm.ShowModal;
     LoadItemsfromPropertyForm(PropForm);
   finally
     FreeAndNil(PropForm);
   end;
end;
LoadItemsinPropertyForm und LoadItemsfromPropertyForm sind meine Methoden zum Laden und Lesen der Einstellungswerte. Also nicht dran stören.

Gruß oki

Tommy82 10. Apr 2007 18:38

Re: DLL richtig beenden
 
Auch interressant, werde ich mal bei der nächsten Gelegenheit testen.

mfg

Tommy82


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:26 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