Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Dialog aus Delphi DLL verschachtelt aufrufen (https://www.delphipraxis.net/177755-dialog-aus-delphi-dll-verschachtelt-aufrufen.html)

HPW 25. Nov 2013 19:55

Delphi-Version: 7

Dialog aus Delphi DLL verschachtelt aufrufen
 
Hallo,

Ich habe eine Funktion in einer delphi DLL in der ich einen Property-Dialog aufrufe:

Delphi-Quellcode:
FUNCTION nbEditAction( IDNum     : INTEGER;
  VAR Params   : ARRAY OF PChar ) : BOOLEAN;
VAR
      resultstr : String ;
BEGIN
  Result := FALSE;
  nbEditCount := nbEditCount+1;
  CASE IDNum OF
    1 : BEGIN
          { Anzeigen der Form... }
          EditForm2 := TEditForm2.CreateParented( GetActiveWindow );
          TRY
            EditForm2.Caption := CmdParaName[1]+' Properties';
            EditForm2.Edit1.Text := Params[0];
            ...
            ...
            IF EditForm2.ShowModal = mrOK THEN
              BEGIN
                SetStr( Params[0], EditForm2.Edit1.Text );
                ...
                ...
                Result := TRUE;
              END;
          FINALLY
            EditForm2.Free;
          END;
        END;
  END;
  nbEditCount := nbEditCount-1;
END;
Nun kann es vorkommen das der Dialog bei schon geöffnetem ersten Dialog ein zweites Mal aufgerufen wird.
Das funktioniert nun nicht, da EditForm2 vom zweiten Dialog überschrieben wird und ich dann beim Schliessen des ersten Dialog eine Access Violation bekomme. Mit nbEditCount erkenne ich zwar das ein Dialog erneut aufgerufen wird und könnte das mit einer Fehlermeldung verhindern. Aber wenn ich das zulassen möchte, wie bekomme ich das hin, das auch der erste Dialog noch funktioniert.

Grüsse,

Hans-Peter

himitsu 25. Nov 2013 20:10

AW: Dialog aus Delphi DLL verschachtelt aufrufen
 
Zitat:

Zitat von HPW (Beitrag 1237393)
wie bekomme ich das hin, das auch der erste Dialog noch funktioniert.

Indem du keine globalen Variaben benutzt :!:

Wenn die Variable "nur" innerhalb der Funktion genutzt wird, dann definiert sie auch da drin.



Und dann, rate ich davon ab, die VCL innerhalb einer DLL zu benutzen. (außer, wenn sie ausschließlich da genutzt wird)
Oder du mußt dafür sorgen, daß Speichermanager und RTTI über die EXE-DLL-Grenze geshared wird.
Offizieller Weg: Packages benutzen

HPW 25. Nov 2013 20:43

AW: Dialog aus Delphi DLL verschachtelt aufrufen
 
Danke für die Hinweise.
Da muss ich noch ein paar Details nachliefern.
Auf die rufende EXE habe ich keinen Einfluss, da es sich dabei um das neobook-System handelt.
Die nbEditAction ist die offizielle SDK Funktion, die aufgerufen wird um registrierte Plugin-Befehle zu konfigurieren. Daher kann ich die VCL benutzen, da sie nur für das spezielle Plugin genutzt wird.

Grüsse,

hoika 25. Nov 2013 21:13

AW: Dialog aus Delphi DLL verschachtelt aufrufen
 
Hallo,

wie bereits gesagt solltest du eine lokale Variable EditForm2 deklarieren,
so wie du es auch mit resultstr gemacht hast.


Heiko

HPW 25. Nov 2013 21:49

AW: Dialog aus Delphi DLL verschachtelt aufrufen
 
Nochmals Danke für die Tips.
Der nochmalige direkte Hinweiss auf die Variable EditForm2 hat meinem Verständnis auf die Sprünge geholfen.
Nachdem ich alle Dialoge zu lokalen Variablen gemacht habe, funktioniert alles ohne Probleme.
Hatte ich vor Jahren aus der SDK Vorlage übernommen und nicht weiter drüber nachgedacht.
Aber so ist das mit dem Wald und den vielen Bäumen .... ;-)

Grüsse,


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