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 Erfolgsmeldung bei EnumChildWindows (https://www.delphipraxis.net/18486-erfolgsmeldung-bei-enumchildwindows.html)

Cuchulainn 19. Mär 2004 13:02


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:
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;
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.

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?

Christian Seehase 19. Mär 2004 18:55

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.

NicoDE 19. Mär 2004 19:27

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;

Cuchulainn 20. Mär 2004 10:21

Re: Erfolgsmeldung bei EnumChildWindows
 
Zitat:

Zitat von NicoDE
Du solltest/darfst nicht auf Stack-Variablen ausserhalb der Funktion zugreifen.

Warum denn nicht?

Vielen Dank, ich werde eure Lösung gleich mal ausprobieren.

NicoDE 20. Mär 2004 13:07

Re: Erfolgsmeldung bei EnumChildWindows
 
Zitat:

Zitat von Cuchulainn
Warum denn nicht?

BoolOk ist nur im Kontext von PPasswort gültig. EnumChildWindows ruft FEnumChilds direkt auf.


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