AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Erfolgsmeldung bei EnumChildWindows
Thema durchsuchen
Ansicht
Themen-Optionen

Erfolgsmeldung bei EnumChildWindows

Ein Thema von Cuchulainn · begonnen am 19. Mär 2004 · letzter Beitrag vom 20. Mär 2004
Antwort Antwort
Cuchulainn

Registriert seit: 26. Aug 2003
182 Beiträge
 
Delphi 5 Enterprise
 
#1

Erfolgsmeldung bei EnumChildWindows

  Alt 19. Mär 2004, 13:02
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?
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Erfolgsmeldung bei EnumChildWindows

  Alt 19. Mär 2004, 18:55
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.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
NicoDE
(Gast)

n/a Beiträge
 
#3

Re: Erfolgsmeldung bei EnumChildWindows

  Alt 19. Mär 2004, 19:27
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;
  Mit Zitat antworten Zitat
Cuchulainn

Registriert seit: 26. Aug 2003
182 Beiträge
 
Delphi 5 Enterprise
 
#4

Re: Erfolgsmeldung bei EnumChildWindows

  Alt 20. Mär 2004, 10:21
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.
  Mit Zitat antworten Zitat
NicoDE
(Gast)

n/a Beiträge
 
#5

Re: Erfolgsmeldung bei EnumChildWindows

  Alt 20. Mär 2004, 13:07
Zitat von Cuchulainn:
Warum denn nicht?
BoolOk ist nur im Kontext von PPasswort gültig. EnumChildWindows ruft FEnumChilds direkt auf.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:54 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