![]() |
try - except in Dialogprozedur führt zu Darstellungfehler
Ich zeige in einem NonVCL-Projekt einen Dialog aus einer Ressourcendatei mit DialogBox(...) an. Das funktioniert auch ganz normal. Sobald ich aber in der zugehörigen Dialogprozedur einen Try-Except- oder Try-Finally-Block verwende, wird das Dialogfenster durchsichtig und ohne Titelleiste dargestellt :shock: , d.h. es sind nur die Steuerelemente zu sehen. Das ganze passiert unabhängig davon, ob der Try-Except-Block überhaupt durchlaufen wird oder nicht. (OS: Win98)
Hat jemand schon mal die selbe Erfahrung gemacht oder könnte das mal ausprobieren und schreiben, ob der Fehler bei ihm auch auftritt? Vielen Dank |
Re: try - except in Dialogprozedur führt zu Darstellungfehle
Noch nicht getestet, noch nicht gesehen, noch nicht gemacht. Aber was hat ein try-finally Bloch in der Dialog-Prozedur verloren? Und wenn du da einen hast, ist dein Programm schlecht strukturiert.
|
Re: try - except in Dialogprozedur führt zu Darstellungfehle
Ich belege in der Dialogprozedur dynamisch Speicher zum Auslesen eines Edit-Feldes und wollte den gerne mit try-finally schützen. Dafür eine eigene Prozedur zu schreiben lohnt sich eigentlich nicht.
|
Re: try - except in Dialogprozedur führt zu Darstellungfehle
Hallo Niko,
benutzt Du vielleicht gepatchte Units, ähnliche denen, die bei der ![]() Eine bessere Antwort kann ich Dir leider nicht geben. Vielleicht, wenn Du den verursachenden Code postest? |
Re: try - except in Dialogprozedur führt zu Darstellungfehle
Zeig mal Code.
|
Re: try - except in Dialogprozedur führt zu Darstellungfehle
Liste der Anhänge anzeigen (Anzahl: 1)
Erstmal Danke für die Antworten.
@choose: Ich verwende nur Units, die mit Delphi geliefert werden. Der Code der Dialogprozedur:
Delphi-Quellcode:
Ich hab mal eine Projektdatei, die den Fehler erzeugt, zusammen mit der verwendeten Ressourcendatei angehängt.
function DlgProc(hDlg: HWND; uMsg: UINT; wParam: WPARAM; lParam: LPARAM):
Boolean; stdcall; begin Result := true; case uMsg of WM_COMMAND: begin if LOWORD(wParam) = IDOK then begin try // Wenn man diesen try-finally-Block entfernt, ist der Fehler weg. // Hier steht eigentlich Code, aber der Fehler tritt auch ohne auf. finally // Code end; EndDialog(hDlg, 0); end; end; else Result := false; end; end; |
Re: try - except in Dialogprozedur führt zu Darstellungfehle
Da der Code ja immerhin schon zwei mal heruntergeladen wurde, trau ich mich noch mal nachzufragen: Könnte mal bitte jemand die oben angehängte dpr kompilieren und schreiben, ob das erzeugte Dialogfeld durchsichtig ist oder richtig angezeigt wird. Mich würde interessieren, ob der Fehler bei neueren Delphi-Versionen auch auftritt.
|
Re: try - except in Dialogprozedur führt zu Darstellungfehle
Tja, ich habe den gleichen Effekt, wie du. Bin aber auch etwas ratlos.
|
Re: try - except in Dialogprozedur führt zu Darstellungfehle
Hallo Niko,
sorry, dass ich erst jetzt antworte, hatte etwas viel um die Ohren... Nachdem ich das Problem auf
Delphi-Quellcode:
eingrenzen konnte (das Case- und das Try-Statement sind notwendig!), wurde ich doch etwas stutzig und habe mir den produzierten ASM-Code einmal etwas genauer angesehen. Der Rückgabewert wird wie folgt gebildet:
function myDlgProc(hDlg: HWND; uMsg: UINT; wParam: WPARAM; lParam: LPARAM):
Boolean; stdcall; begin Result:= False; try finally end; case uMsg of 123: p(); end; end;
Code:
In der Win32-Referenz steht zu DialogProc "[...] the dialog box procedure should return nonzero if it processes the message, and zero if it does not.", während in der Deklaration von einem Datentyp BOOL ausgegangen wird. Dies ist typische C-Manier, bei der die Programmierer tatsächlich fast ausschließlich von Ints ausgehen und die Typen nur geschaffen wurden, um hübsch auszusehen...
mov al, [ebp-$01]
Tatsache ist nun, dass Delphi ein Boolean als Byte ansieht (trotzdem wg des ByteAlignment aber 4 Bytes beansprucht) und Deine DlgProc aus sicht des Compilers dann False ist, wenn das LowByte des LowWords von eax null ist (siehe snippet von oben)! Durch den vorherigen Code (TryFinally, Case,...) ist der Akkumulator aber geändert worden, so dass mindestens eines der anderen Bits von eax gesetzt ist. Das API intepretiert diesen Wert (ungleich null) nun gemäß der Definition "Ungleich null heißt True" (siehe oben). Wenn Du Den Rückgabewert von DlgProc auf LongBool änderst, geht auch der Compiler von einem bool'schen Wert aus, der 32 Bit breit ist, kompiliert den Rückgabewerte so
Code:
und der Code sollte funktionieren.
mov eax, [ebp-$04]
|
Re: try - except in Dialogprozedur führt zu Darstellungfehle
Vielen Dank für die Antwort! Der Code funktioniert jetzt. :-D
Alleine wäre ich nie auf den Fehler gekommen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:52 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