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 API DIALOGBOXPARAMW (https://www.delphipraxis.net/53808-api-dialogboxparamw.html)

bioser 22. Sep 2005 19:53


API DIALOGBOXPARAMW
 
Ich habe in meinem Projekt eine Unit mit einer Resourcendatei eingebunden.
Der Aufruf in dieser unit erfolgt so:


Code:
function dlgfunctionW(hwnd: HWND; umsg: Cardinal; wparam: WPARAM; lparam: LPARAM): BOOL; stdcall;

begin

DialogBoxParamW(hinstance, MAKEINTRESOURCEW(1000), 0, @dlgfunctionW, 0);

end;
Das hat nun zur Folge, daß mein Hauptprogramm nicht mehr aufgerufen wird, sondern
nur noch der Dialog. Es soll aber beides laufen. Woran liegt das ?

marabu 22. Sep 2005 20:06

Re: API DIALOGBOXPARAMW
 
Hi bioser,

du zeigts eine modale dialog box an und gibst die function, mit der du die Anzeige realisierst, als message handler für diese box an...
Wie eine DialogProc aussehen muss, kannst du u.a. hier sehen: klick

Grüße vom marabu

bioser 22. Sep 2005 21:47

Re: API DIALOGBOXPARAMW
 
Die Dialog-Prozedur ist ja fertig.
Nur mein Hauptformular Form1 wird nicht mitangezeigt.

marabu 23. Sep 2005 06:01

Re: API DIALOGBOXPARAMW
 
Sorry, ich habe bei deinem gezeigten Code nicht erkannt, dass die Signatur und der code block gar nicht zusammen gehören.

Wenn deine Form1 nicht angezeigt wird, dann sicher deshalb, weil dein message handler für die dialog box nicht korrekt arbeitet.

Freundliche Grüße vom marabu

Flocke 23. Sep 2005 06:49

Re: API DIALOGBOXPARAMW
 
Zitat:

Zitat von bioser
Code:
function [b]dlgfunctionW[/b](hwnd: HWND; umsg: Cardinal; wparam: WPARAM; lparam: LPARAM): BOOL; stdcall;
begin
DialogBoxParamW(hinstance, MAKEINTRESOURCEW(1000), 0, @[b]dlgfunctionW[/b], 0);
end;

Hast du das wirklich so gemacht, oder ist's ein Tippfehler? Ansonsten kann es nicht funktionieren.

bioser 23. Sep 2005 08:19

Re: API DIALOGBOXPARAMW
 
Ich habe in meinem Projekt ein Hauptformular und eine unit mit der DialogBox.
In dieser unit rufe ich die Box im begin...end-Teil so auf:

DialogBoxParamW(hinstance, MAKEINTRESOURCEW(1000), 0, @dlgfunctionW, 0);

Beim Starten erscheint aber nur die DialogBox, ohne das Formular.

marabu 23. Sep 2005 10:12

Re: API DIALOGBOXPARAMW
 
Der Aufruf im Initialisierungsabschnitt der Unit ist vielleicht etwas unglücklich. Immerhin wird dieser Code ausgeführt, bevor dein Hauptformular angezeigt wird. Dazu kommt noch, dass die Box modal angezeigt wird.

marabu

Flocke 23. Sep 2005 15:19

Re: API DIALOGBOXPARAMW
 
Zitat:

Zitat von bioser
Ich habe in meinem Projekt ein Hauptformular und eine unit mit der DialogBox.
In dieser unit rufe ich die Box im begin...end-Teil so auf:

DialogBoxParamW(hinstance, MAKEINTRESOURCEW(1000), 0, @dlgfunctionW, 0);

Beim Starten erscheint aber nur die DialogBox, ohne das Formular.

Für mich sah das aus wie die Deklaration der Funktion dlgfunctionW, die sich selbst wieder als Dialogprozedur übergibt.

Erzeuge deinen Dialog mit CreateDialogParamW im FormShow-Ereignis deines Hauptprogramms und teile dies der Anwendung mit, also etwa so (ungetestet):

Wird an die Eigenschaft DialogHandle etwas zugewiesen dann prüft die Anwendung in der Meldungsschleife selbst mit IsDialogMessage, ob die Meldung für den Dialog bestimmt ist.

//EDIT:

Nachgelesen:
Zitat:

Verwenden Sie DialogHandle bei der Anzeige eines nichtmodalen Dialogfeldes, das über die API-Funktion CreateDialog erzeugt wurde. Wenn Sie der Eigenschaft DialogHandle das Handle des nichtmodalen Dialogfeldes zuweisen, können im Dialogfeld Meldungen aus der Meldungsschleife der Anwendung angezeigt werden.,

Das Handle des nichtmodalen Dialogfeldes muss dann an die Eigenschaft DialogHandle übergeben werden, wenn dieses eine Aktivierungsbotschaft empfängt (WM_NCACTIVATE). Wenn das Dialogfeld eine Deaktivierungsbotschaft erhält, muss DialogHandle auf den Wert 0 gesetzt werden.
-> die Dialogprozedur erweitern um die Meldung WM_NCACTIVATE.

Delphi-Quellcode:
procedure dlgfunctionW(...);
begin
  ...
  case ... of
    ...
    WM_NCACTIVATE:
      if wParam <> 0 then
        Application.DialogHandle := hDlg
      else
        Application.DialogHandle := 0;
    ...
  end;
end;
Delphi-Quellcode:
begin
  CreateDialogParamW(...);
end.

Luckie 23. Sep 2005 19:32

Re: API DIALOGBOXPARAMW
 
Warum eigentlich diese Mischerei von VCL und nonVCL? Das sollte man möglichst vermeiden, da es sehr häufig nur zu Problemen führt.


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