![]() |
Re: DLL Einbindung - Fehler beim Beenden
Delphi-Quellcode:
Der Datenbankzugriff erfolgt über die SoapMemTable bzw SoapManager.
library Aenderungsinfo;
uses ShareMem, SysUtils, Dialogs, StdCtrls, Forms, Classes, Grids, kbmMemTable, uSOAPClient, QGraphics, Controls; {$R *.res} procedure benutzerdetails_anzeigen(provider,eindeutiges_feld,aktueller_eintrag,aktueller_eintrag_detail:string);stdcall; export; var Form1:TForm; StrGr_Aenderung:TStringgrid; SoapManager:TSoapManager; SMT_Table:TSoapMemTable; begin Form1:=TForm.Create(nil); Form1.Caption:='Datensatzdetails: '+aktueller_eintrag+' - '+aktueller_eintrag_detail; Form1.Position:=poScreenCenter; Form1.BorderStyle:=bsdialog; SoapManager:=TSoapManager.Create(nil); SoapManager.Active:=True; SMT_Table:=TSoapMemTable.Create(nil); SMT_Table.SOAPManager:=SoapManager; SMT_Table.ProviderName:=provider; SMT_Table.Active:=True; SMT_Table.Filtered:=True; SMT_Table.Filter:=eindeutiges_feld+'='''+aktueller_eintrag+''''; SMT_Table.Refresh; Form1.Height:=80; Form1.Width:=410; StrGr_Aenderung:=TStringgrid.Create(nil); with StrGr_Aenderung do begin Parent:=Form1; DefaultRowHeight:=20; Align:=alClient; if Form1.Height - Form1.ClientHeight > 28 then Form1.ClientHeight:=40 else Form1.ClientHeight:=45;//Form1.ClientHeight - (ClientHeight - Height); Form1.Width:=410; ColCount:=4; ColWidths[1]:=110; ColWidths[2]:=100; ColWidths[3]:=110; ColWidths[0]:=Width - ColWidths[1] - ColWidths[2] - ColWidths[3] - 7; RowCount:=2; FixedCols:=0; Cells[0,0]:=' Anlage von:'; Cells[1,0]:=' Anlagedatum:'; Cells[2,0]:=' Änderung von:'; Cells[3,0]:=' Änderungsdatum:'; Cells[0,1]:=SMT_Table.FieldbyName('benutzer_neu').asstring; Cells[1,1]:=SMT_Table.FieldbyName('datum_neu').asstring; Cells[2,1]:=SMT_Table.FieldbyName('benutzer_aend').asstring; Cells[3,1]:=SMT_Table.FieldbyName('datum_aend').asstring; StrGr_Aenderung.Options:= [goFixedHorzLine, goFixedVertLine, goHorzLine, goVertLine]; SMT_Table.Destroy; SoapManager.Destroy; end; try Form1.Update; Form1.ShowModal; finally Form1.Destroy; end; end; exports benutzerdetails_anzeigen; Im Hauptprogramm befindet sich ein ganz gewöhnlicher Prozedurenaufruf. Der Implementationteil steht bereits oben. Sharemem ist erster Eintrag in der uses Liste. |
Re: DLL Einbindung - Fehler beim Beenden
Hallo!
Du solltest Deine Objekte grundsätzlich nicht über Destroy sondern über Free zerstören. Free gibt nämlich auch den Speicher wieder frei. Außerdem hast Du StrGr_Aenderung nicht zerstört. Anbei nochmal Dein Code, mit Free. Ich habe außerdem das try-finally-Konstruct umgebaut, damit auch wirklich alles freigegeben wird.
Delphi-Quellcode:
Code ist ungetestet, da mir einige Units fehlen.
library Aenderungsinfo;
uses ShareMem, SysUtils, Dialogs, StdCtrls, Forms, Classes, Grids, kbmMemTable, uSOAPClient, QGraphics, Controls; {$R *.res} procedure benutzerdetails_anzeigen(provider,eindeutiges_feld,aktueller_eintrag,aktueller_eintrag_detail:string);stdcall; export; var Form1:TForm; StrGr_Aenderung:TStringgrid; SoapManager:TSoapManager; SMT_Table:TSoapMemTable; begin Form1:=TForm.Create(nil); SoapManager:=TSoapManager.Create(nil); SMT_Table:=TSoapMemTable.Create(nil); StrGr_Aenderung:=TStringgrid.Create(nil); try Form1.Caption:='Datensatzdetails: '+aktueller_eintrag+' - '+aktueller_eintrag_detail; Form1.Position:=poScreenCenter; Form1.BorderStyle:=bsdialog; SoapManager.Active:=True; SMT_Table.SOAPManager:=SoapManager; SMT_Table.ProviderName:=provider; SMT_Table.Active:=True; SMT_Table.Filtered:=True; SMT_Table.Filter:=eindeutiges_feld+'='''+aktueller_eintrag+''''; SMT_Table.Refresh; Form1.Height:=80; Form1.Width:=410; with StrGr_Aenderung do begin Parent:=Form1; DefaultRowHeight:=20; Align:=alClient; if Form1.Height - Form1.ClientHeight > 28 then Form1.ClientHeight:=40 else Form1.ClientHeight:=45;//Form1.ClientHeight - (ClientHeight - Height); Form1.Width:=410; ColCount:=4; ColWidths[1]:=110; ColWidths[2]:=100; ColWidths[3]:=110; ColWidths[0]:=Width - ColWidths[1] - ColWidths[2] - ColWidths[3] - 7; RowCount:=2; FixedCols:=0; Cells[0,0]:=' Anlage von:'; Cells[1,0]:=' Anlagedatum:'; Cells[2,0]:=' Änderung von:'; Cells[3,0]:=' Änderungsdatum:'; Cells[0,1]:=SMT_Table.FieldbyName('benutzer_neu').asstring; Cells[1,1]:=SMT_Table.FieldbyName('datum_neu').asstring; Cells[2,1]:=SMT_Table.FieldbyName('benutzer_aend').asstring; Cells[3,1]:=SMT_Table.FieldbyName('datum_aend').asstring; StrGr_Aenderung.Options:= [goFixedHorzLine, goFixedVertLine, goHorzLine, goVertLine]; end; Form1.Update; Form1.ShowModal; finally StrGr_Aenderung.Free; // fehlte ganz SMT_Table.Free; SoapManager.Free; Form1.Free; end; end; exports benutzerdetails_anzeigen; Hope it helps onlinekater |
Re: DLL Einbindung - Fehler beim Beenden
situation unverändert...trotzdem super das du dir Zeit nimmst....
|
Re: DLL Einbindung - Fehler beim Beenden
Forms in DLLs geht ueblicherweise schief.
|
Re: DLL Einbindung - Fehler beim Beenden
jetzt bleibt Dir eigentlich nur noch, auszuprobieren, welche der verwendeten Komponenten den Fehler verursacht.
Einfach eine nach der anderen auskommentieren und gucken, wann der Fehler sich verdünnisiert. @Robert Marquardt: Habe eigentlich noch keine Probleme mit Forms in DLLs gehabt. Gruß onlinekater |
Re: DLL Einbindung - Fehler beim Beenden
habe die Komponenten nach und nach entfernt, es tut sich nichts, falls ich eine Lösung finde werde ich sie selbstverständlich posten...
|
Re: DLL Einbindung - Fehler beim Beenden
Zeig mal den Code, mit dem du die Funktion aufrufst.
Evtl. hast du da einen Fehler gemacht (z.B. fehlendes stdcall). :) |
Re: DLL Einbindung - Fehler beim Beenden
Morgen poste ich den anderen Code. ich benutze allerdings stdcall, wie oben bereits zu sehen:
procedure benutzer(Provider,feld,eintrag,einrag_detail:strin g)stdcall; external 'Aenderungsinfo.dll'; Mir ist nochwas eingefallen: Ich benutze in der Funktion mit dem Aufruf einmal getmem, welchen ich am Ende allerdings wieder freigebe... mfg |
Re: DLL Einbindung - Fehler beim Beenden
Zitat:
|
Re: DLL Einbindung - Fehler beim Beenden
Zitat:
Natürlich sind auch alle globalen Variablen der VCL doppelt im Speicher. Application aus der DLL ist nicht Application aus der Anwendung. Für sowas gibt nimmt man Packages statt DLLs und Ruhe ist. Möglich wäre es vllt auch in DLL und Exe die RTL & VCL als Runtime package anzugeben, aber da kommt wahrscheinlich immer noch Käse raus. (Habe ich noch nicht probiert) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:41 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-2025 by Thomas Breitkreuz