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/)
-   -   Problem mit MessageboxTimeout (https://www.delphipraxis.net/167623-problem-mit-messageboxtimeout.html)

Ines 10. Apr 2012 09:29

Problem mit MessageboxTimeout
 
WinXP - SP3, Delphi2009 Enterprise


Hallo,

ich hoffe, ihr könnt mir helfen!

Ich wollte MessageBoxTimeout ausprobieren, habe den Sourcecode in mein Programm übertragen - funktioniert soweit alles (fast) gut. Ich bekomme keine Fehlermeldungen beim Compilieren, die Messagebox "verschwindet" nach der eingestellten Zeit, allerdings werden weder der Text für lpCaption noch für lpText richtig dargestellt. Klartext: vom Text wird nur das 1. Zeichen dargestellt, der Rest nicht.
Delphi-Quellcode:
 
// Define a MessageBox with a Yes and No button and a timeout of
// 5 seconds
   iFlags := MB_YESNO or MB_SETFOREGROUND or MB_SYSTEMMODAL or MB_ICONINFORMATION;
   iResult := MessageBoxTimeout(Application.Handle, 'Test a timeout of 5 seconds.', 'MessageBoxTimeout Test', iFlags, 0, 5000);
Statt MessageBoxTimeout Test erscheint ein "M", statt Test a timeout of 5 seconds nur das "T".
Könnt ihr mir bitte weiterhelfen und sagen, wo ich den Fehler mache.

Vielen Dank für eure Mühe
Ines

himitsu 10. Apr 2012 09:34

AW: Problem mit MessageboxTimeout
 
Ein alltägliches Unicode-ANSI-Verständigungsproblem.
Du wirst die Parameter als Unicode übergeben, aber die ANSI-Version der API aufrufen.
Der Compiler gibt wohl keine Warnungen aus?

Zitat:

habe den Sourcecode in mein Programm übertragen
Welchen?

Bernhard Geyer 10. Apr 2012 09:35

AW: Problem mit MessageboxTimeout
 
Zitat:

Zitat von himitsu (Beitrag 1160903)
Ein nettes Unicode-Ansi-Verständigungsproblem.
Du wirst die Parameter als Unicode übergeben, aber die ANSI-Version der API aufrufen.

Und höchstwahrscheinlich weißt ihn der Compiler auf das Problem hin. Aber wer interessiert sich für sowas unwichtiges wie Compilermeldungen ...

Bummi 10. Apr 2012 09:44

AW: Problem mit MessageboxTimeout
 
Du kannst die im Netz kursierenden Deklarationen anpassen
Delphi-Quellcode:
{$IFDEF UNICODE}
function MessageBoxTimeOut(hWnd: HWND; lpText: PChar; lpCaption: PChar;uType: UINT; wLanguageId: WORD; dwMilliseconds: DWORD): Integer; stdcall;external user32 name 'MessageBoxTimeoutW';
{$ELSE}
function MessageBoxTimeOut(hWnd: HWND; lpText: PChar; lpCaption: PChar;uType: UINT; wLanguageId: WORD; dwMilliseconds: DWORD): Integer; stdcall;external user32 name 'MessageBoxTimeoutA';
{$ENDIF}
function MessageBoxTimeOutA(hWnd: HWND; lpText: PChar; lpCaption: PChar;uType: UINT; wLanguageId: WORD; dwMilliseconds: DWORD): Integer; stdcall;external user32 name 'MessageBoxTimeoutA';
function MessageBoxTimeOutW(hWnd: HWND; lpText: PWideChar; lpCaption: PWideChar;uType: UINT; wLanguageId: WORD; dwMilliseconds: DWORD): Integer; stdcall; external user32 name 'MessageBoxTimeoutW';

DeddyH 10. Apr 2012 09:46

AW: Problem mit MessageboxTimeout
 
Geht auch etwas kürzer und vor allem korrekter (bei der Ansi-Variante muss das auch PAnsiChar sein):
Delphi-Quellcode:
function MessageBoxTimeOut(hWnd: hWnd; lpText: PChar; lpCaption: PChar;
  uType: UINT; wLanguageId: WORD; dwMilliseconds: DWORD): Integer; stdcall;
  external user32 name
{$IFDEF UNICODE}'MessageBoxTimeoutW'{$ELSE}'MessageBoxTimeoutA'{$ENDIF};
function MessageBoxTimeOutA(hWnd: hWnd; lpText: PAnsiChar; lpCaption: PAnsiChar;
  uType: UINT; wLanguageId: WORD; dwMilliseconds: DWORD): Integer; stdcall;
  external user32 name 'MessageBoxTimeoutA';
function MessageBoxTimeOutW(hWnd: hWnd; lpText: PWideChar; lpCaption: PWideChar;
  uType: UINT; wLanguageId: WORD; dwMilliseconds: DWORD): Integer; stdcall;
  external user32 name 'MessageBoxTimeoutW';

Ines 10. Apr 2012 09:59

AW: Problem mit MessageboxTimeout
 
Von hier habe ich den SourceCode:

http://www.delphipraxis.net/72859-se...timeout-2.html

Zitat:

Zitat von Bernhard Geyer (Beitrag 1160904)
Zitat:

Zitat von himitsu (Beitrag 1160903)
Ein nettes Unicode-Ansi-Verständigungsproblem.
Du wirst die Parameter als Unicode übergeben, aber die ANSI-Version der API aufrufen.

Und höchstwahrscheinlich weißt ihn der Compiler auf das Problem hin. Aber wer interessiert sich für sowas unwichtiges wie Compilermeldungen ...

Nein, der Compiler weißt sie nicht auf das Problem hin
0 Hinweise
0 Warnungen

Sonst hätte ich nicht behauptet, der Compiler läuft anstandslos durch!

@DeddyH + Bummi:

Vielen Dank, jetzt funktionierts! Ihr habt mir wirklich sehr geholfen.

Ines

himitsu 10. Apr 2012 10:13

AW: Problem mit MessageboxTimeout
 
noch kürzer
Delphi-Quellcode:
const LibLang = {$IFDEF UNICODE}'W'{$ELSE}'A'{$ENDIF}; // wenn man das öfters mal braucht

function MessageBoxTimeOut(hWnd: HWND; lpText, lpCaption: PChar;
  uType: UINT; wLanguageId: WORD; dwMilliseconds: DWORD): Integer; stdcall;
  external user32 name 'MessageBoxTimeout' + LibLang;
function MessageBoxTimeOutA(hWnd: HWND; lpText, lpCaption: PAnsiChar;
  uType: UINT; wLanguageId: WORD; dwMilliseconds: DWORD): Integer; stdcall;
  external user32;
function MessageBoxTimeOutW(hWnd: HWND; lpText, lpCaption: PWideChar;
  uType: UINT; wLanguageId: WORD; dwMilliseconds: DWORD): Integer; stdcall;
  external user32;
Man kann es sogar verpascalen. :roll: (wenn man weiß wie die Strings intern arbeiten)
Delphi-Quellcode:
function MessageBoxTimeOut(OwnerWindow: HWND; const Text, Caption: string;
  MType: LongWord; LanguageID: Word; Milliseconds: LongWord): Integer; stdcall;
  external user32 name 'MessageBoxTimeout' + LibLang;
function MessageBoxTimeOutA(OwnerWindow: HWND; const Text, Caption: AnsiString;
  MType: LongWord; LanguageID: Word; Milliseconds: LongWord): Integer; stdcall;
  external user32;
function MessageBoxTimeOutW(OwnerWindow: HWND; const Text, Caption: {$IFDEF UNICODE}UnicodeString{$ELSE}WideString{$ENDIF};
  MType: LongWord; LanguageID: Word; Milliseconds: LongWord): Integer; stdcall;
  external user32;
Zitat:

Nein, der Compiler weißt sie nicht auf das Problem hin
Du hast dann bestimmt sowas erwischt:

PChar und dann ein ...A :wall:
http://delphi.about.com/od/adptips20...ltip1004_5.htm

Ines 10. Apr 2012 11:09

AW: Problem mit MessageboxTimeout
 
@himitsu

Den ersten Quellcode werde ich ausprobieren.
Danke :-D


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