![]() |
Erfolgsmeldung bei EnumChildWindows
Kaum ist das eine Problem gelöst, kommt auch schon das nächste.
Ich benutze die Funktion EnumChildWindows. Dank DP habe ich auch relativ schnell gelernt, damit und mit der Callbackfunktion umzugehen. Aber leider habe ich immer noch ein Problem damit. Folgende Situation: Ich rufe in einer Funktion die Funktion EnumChildWindows auf. In der Callbackfunktion tue ich etwas, und zwar suche ich nach einem bestimmten Editfeld und trage dort etwas ein. Wenn das funktioniert hat, möchte ich gerne eine Erfolgsmeldung an die aufrufende Funktion zurückgeben. Dazu habe ich mir eine Boolean-Variable deklariert, die true annehmen soll, wenn es funktioniert hat. Das klingt in der Theorie ganz gut, dachte ich mir und probierte es aus. Das Ergebnis war ernüchternd. Ich wurde zugeworfen mit Zugriffsverletzungen. Zuerst baute ich die Callbackfunktion als Unterfunktion in die aufrufende Funktion ein. Am Anfang der aufrufenden Funktion deklarierte ich meine Boolean-Variable. Etwa so:
Delphi-Quellcode:
Daraus schloss ich, dass die Callbackfunktion nicht auf die Variablen der aufrufenden Prozedur zugreifen kann. Also schlug ich einen anderen Weg ein: Ich nahm die Callbackfunktion aus der Prozedur PPasswort heraus und deklarierte BoolOk als globale Variable. Das Ergebnis war eigentlich kein anderes. Wieder bekam ich eine Zugriffsverletzung.
procedure PPasswort;
var BoolOk: Boolean; function FEnumChilds(hWindow: HWND; lParameter: lparam): boolean; stdcall; begin // Hier passiert etwas. Bei Erfolg folgende Anweisung: BoolOk := true; // Hier krachte es: Zugriffsverletzung end; begin if BoolOk = true then // Hier passiert noch mehr end; Jetzt meine Frage: Kann ich von dieser Callbackfunktion aus auf keine Variablen zugreifen, die außerhalb (global) deklariert worden sind? Welche anderen Lösungen gäbe es für mein Problem noch? |
Re: Erfolgsmeldung bei EnumChildWindows
Moin Cuchulainn,
die Ursache könnte ich anhand Deiner bisherigen Angaben nicht nachvollziehen, eigentlich müsste es funktionieren. Du könntest allerdings, als Workaround, im Parameter lParam die Adresse der gewünschten Zielvariablen angeben, und den Rückgabewert an diese Stelle schreiben. |
Re: Erfolgsmeldung bei EnumChildWindows
Du solltest/darfst nicht auf Stack-Variablen ausserhalb der Funktion zugreifen.
Wie Christian schon vorgeschlagen hat:
Delphi-Quellcode:
type
PMyEnumCildParam = ^TMyEnumCildParam; TMyEnumCildParam = record Done: Boolean; end; function MyEnumChildProc(Wnd: HWND; Param: PMyEnumCildParam): LongBool; stdcall; begin If Wnd = Form1.Edit1.Handle then begin Form1.Edit1.Text := 'Done'; Param.Done := True; Result := False; end else begin EnumChildWindows(Wnd, @MyEnumChildProc, LPARAM(Param)); Result := True; end; end; procedure TForm1.Button1Click(Sender: TObject); var Param: TMyEnumCildParam; begin Param.Done := False; EnumChildWindows(Handle, @MyEnumChildProc, LPARAM(@Param)); if Param.Done then ShowMessage('Done') else ShowMessage('Nope'); end; |
Re: Erfolgsmeldung bei EnumChildWindows
Zitat:
Vielen Dank, ich werde eure Lösung gleich mal ausprobieren. |
Re: Erfolgsmeldung bei EnumChildWindows
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:42 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