Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   DLL Einbindung - Fehler beim Beenden (https://www.delphipraxis.net/74325-dll-einbindung-fehler-beim-beenden.html)

fsc 2. Aug 2006 10:28

Re: DLL Einbindung - Fehler beim Beenden
 
Delphi-Quellcode:
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;
Der Datenbankzugriff erfolgt über die SoapMemTable bzw SoapManager.

Im Hauptprogramm befindet sich ein ganz gewöhnlicher Prozedurenaufruf. Der Implementationteil steht bereits oben. Sharemem ist erster Eintrag in der uses Liste.

TBx 2. Aug 2006 10:55

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:
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;
Code ist ungetestet, da mir einige Units fehlen.

Hope it helps

onlinekater

fsc 2. Aug 2006 13:48

Re: DLL Einbindung - Fehler beim Beenden
 
situation unverändert...trotzdem super das du dir Zeit nimmst....

Robert Marquardt 3. Aug 2006 05:08

Re: DLL Einbindung - Fehler beim Beenden
 
Forms in DLLs geht ueblicherweise schief.

TBx 3. Aug 2006 08:05

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

fsc 4. Aug 2006 07:16

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...

ste_ett 4. Aug 2006 08:19

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). :)

fsc 6. Aug 2006 16:47

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

Mackhack 6. Aug 2006 19:57

Re: DLL Einbindung - Fehler beim Beenden
 
Zitat:

Zitat von Robert Marquardt
Forms in DLLs geht ueblicherweise schief.

Warum und was fuer Fehler meinst du denn da im Kongreten?

Elvis 6. Aug 2006 20:24

Re: DLL Einbindung - Fehler beim Beenden
 
Zitat:

Zitat von Mackhack
Zitat:

Zitat von Robert Marquardt
Forms in DLLs geht ueblicherweise schief.

Warum und was fuer Fehler meinst du denn da im Kongreten?

Weil die DLL eine eigene Kopie der VCL enthält.
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.
Seite 2 von 3     12 3      

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