Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   TaskDialogIndirect - Deklaration der Struktur (https://www.delphipraxis.net/164484-taskdialogindirect-deklaration-der-struktur.html)

sundance 15. Nov 2011 09:43

TaskDialogIndirect - Deklaration der Struktur
 
Hallo,

ich versuche gerade, die neuen TaskDialoge in ein Programm einzubauen. Dabei haben mir die Ausführungen von Michael hier sehr geholfen. Dabei ist mir aufgefallen, dass sich die Deklarationen der TaskDialogConfig-Struktur von der bei MSDN unterscheidet:
MSDN:
Code:
typedef struct _TASKDIALOGCONFIG {
  UINT                          cbSize;
  HWND                          hwndParent;
  HINSTANCE                     hInstance;
  TASKDIALOG_FLAGS              dwFlags;
  TASKDIALOG_COMMON_BUTTON_FLAGS dwCommonButtons;
  PCWSTR                        pszWindowTitle;
  union {
    HICON hMainIcon;
    PCWSTR pszMainIcon;
  };
  PCWSTR                        pszMainInstruction;
  PCWSTR                        pszContent;
  UINT                          cButtons;
  const TASKDIALOG_BUTTON       *pButtons;
  int                           nDefaultButton;
  UINT                          cRadioButtons;
  const TASKDIALOG_BUTTON       *pRadioButtons;
  int                           nDefaultRadioButton;
  PCWSTR                        pszVerificationText;
  PCWSTR                        pszExpandedInformation;
  PCWSTR                        pszExpandedControlText;
  PCWSTR                        pszCollapsedControlText;
  union {
    HICON hFooterIcon;
    PCWSTR pszFooterIcon;
  };
  PCWSTR                        pszFooter;
  PFTASKDIALOGCALLBACK          pfCallback;
  LONG_PTR                      lpCallbackData;
  UINT                          cxWidth;
} TASKDIALOGCONFIG;
Michael:
Delphi-Quellcode:
  TASKDIALOGCONFIG = packed record
    cbSize : uint;
    hwndParent : HWND;
    hInstance : longword;
    dwFlags : dword;
    dwCommonButtons : dword;
    pszWindowTitle : PWideChar;
    case integer of
      0 : (hMainIcon : HICON);
      1 : (pszMainIcon : PWideChar;
           pszMainInstruction : PWideChar;
           pszContent : PWideChar;
           cButtons : uint;
           pButtons : pointer;
           iDefaultButton : integer;
           cRadioButtons : uint;
           pRadioButtons : pointer;
           iDefaultRadioButton : integer;
           pszVerificationText,
           pszExpandedInformation,
           pszExpandedControlText,
           pszCollapsedControlText : PWideChar;
           case integer of
             0 : (hFooterIcon : HICON);
             1 : (pszFooterIcon : PWideChar;
                  pszFooterText : PWideChar;
                  pfCallback : pointer;
                  lpCallbackData : pointer;
                  cxWidth : uint;));
  end;
Wenn ich das recht verstehe (meine C-Kenntnisse sind ein wenig angestaubt...) umfassen die beiden unions bei MSDN nur die beiden Elemente HICON und PCWSTR (also 2 x 32 Bit), während die Delphi-Implementation unterschiedlich große Bereiche zusammenfasst.

Hat das einen tieferen Sinn oder spielt es einfach nur keine Rolle?
Vielleicht kann mich ja jemand "erleuchten"...

.sundance.

uligerhardt 15. Nov 2011 09:49

AW: TaskDialogIndirect - Deklaration der Struktur
 
Zum einen geht es nicht anders, da Delphi variante Teile von Records nur am Schluss zulässt.

Zum andern ist es auch egal, da das entstehende Speicherlayout identisch ist.

himitsu 15. Nov 2011 09:53

AW: TaskDialogIndirect - Deklaration der Struktur
 
Auf den ersten Blick sieht es erstmal "gleich" aus.
Funktioniert denn irgendwas nicht?

Das Problem ist, daß man dähmlicher Weise bei diesen
Delphi-Quellcode:
case
-Abschnitten das
Delphi-Quellcode:
end
vergessen hat, man kann also soeinen Abschnitt nicht mehr vorzeitig/manuell schließen, so wie es in C möglich ist.
Darum diese "eigenartige" Verschachtelung.

Leider wird man diesen Bug wohl niemals beheben können, da sonst die alten Quellcodes nicht mehr kompatibel sind. (es sei denn man erfindet hier ein anderes "end", wie z.B. caseend, welches man dafür verwenden würde ... aber auf mich hört ja keiner)


[edit]
diese faule RedBox immer :warn:

sundance 15. Nov 2011 09:56

AW: TaskDialogIndirect - Deklaration der Struktur
 
Zitat:

...geht es nicht anders, da Delphi variante Teile von Records nur am Schluss zulässt
Stimmt, da hab' ich nicht mehr darangedacht...

Zitat:

Funktioniert denn irgendwas nicht?
Doch, alles bestens. War nur wegen der abweichenden Deklarationen etwas verwirrt...

Kennt ihr (oder ein anderer Leser) vielleicht auch eine ähnlich gute Beschreibung (mit Delphi-Implementation) der Vista/Win7 Open/Save-Dialoge? Es gibt ja dort auch (ähnlich wie bei TaskDialogIndirect) die Möglichkeit, die Dialoge um weitere Controls oder Eigenschaften zu erweitern...

.sundance.


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