Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi CreateDialogParam mit mehreren Instanzen (https://www.delphipraxis.net/184205-createdialogparam-mit-mehreren-instanzen.html)

jaenicke 7. Mär 2015 22:48

CreateDialogParam mit mehreren Instanzen
 
Hallo,

ich verstehe aktuell nicht wie CreateDialogParam mit mehreren Instanzen funktioniert. Denn ich kann nur eine einfache Funktion als DialogProc übergeben. Einen Verweis auf die aktuelle Instanz oder so etwas sehe ich dort nicht.

Eine Möglichkeit wäre jeweils Speicherplatz zu reservieren, dort einen Befehl zu hinterlegen, der die Instanz auf den Stack oder in ein Register packt. So hätte ich für jede Instanz eine eigene Einsprungstelle und in der Funktion die Instanz. Schön finde ich die Lösung allerdings nicht.

Hat jemand vielleicht eine andere Lösung?

Vielen Dank und schönen Gruß,
Sebastian Jänicke

Sir Rufo 7. Mär 2015 22:59

AW: CreateDialogParam mit mehreren Instanzen
 
In der Callback Funktion wird doch das Handle des Dialogs mit übergeben
https://msdn.microsoft.com/en-us/lib...(v=vs.85).aspx
damit weißt du doch welcher Dialog gerade schickt ... :gruebel:

jaenicke 8. Mär 2015 07:24

AW: CreateDialogParam mit mehreren Instanzen
 
Schon, aber das heißt ja, dass ich bei jeder Message die Fensterinstanz suchen muss. Bei der Vielzahl an Messages, die ankommen, dauert das vergleichsweise lange, zumal ich den Zugriff auf die Fensterverwaltung auch noch threadsicher gestalten muss...

Ich habe auch gerade mal geschaut wie Delphi selbst das macht, dort passiert das wie ich es beschrieben habe mit einem eigenen Speicherbereich. Ich denke mal das werde ich dann auch so machen... vielleicht kann ich die vorhandenen Funktionen ja auch selbst nutzen.

jaenicke 8. Mär 2015 14:13

AW: CreateDialogParam mit mehreren Instanzen
 
Um die Frage selbst zu beantworten... Es genügt z.B. folgender Code:
Delphi-Quellcode:
  FHandle := CreateDialogParam(hInstance, MAKEINTRESOURCE(AResource), 0, MakeObjectInstance(NonVclDialogProc), 0);
  // AResource ist die Nummer der Dialogressource
MakeObjectInstance ist hier das Entscheidende. Diese Funktion sorgt dafür dass die Methode im Kontext des korrekten Objekts ausgeführt wird. Dafür wird die Instanz gespeichert und in der StdWndProc ausgelesen.


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