Einzelnen Beitrag anzeigen

ustra

Registriert seit: 12. Mär 2003
Ort: Geesthacht
138 Beiträge
 
Delphi 5 Professional
 
#1

Wo ist hier der (Denk-)Fehler? Aufruf von EnumWindowsProc

  Alt 5. Feb 2004, 16:31
Hi,

ich habe folgenden Code:

Delphi-Quellcode:
type
  TWaechter = class(TObject)
  private
    { Private-Deklarationen }
    TZeitgeber : TTimer;
    function EnumWindowsProc(const hWindow : DWORD;const AdwDummy : DWORD) : Longbool; stdcall;
    procedure TZeitgeberOntimer(Sender : TObject);
    procedure kontrolle(text:pchar);
  public
    constructor create;
    destructor destroy;
    procedure einstellungen;
    procedure enabled (res : boolean);
    { Public-Deklarationen }
  end;

var
  liste : array of String;

implementation

function TWaechter.EnumWindowsProc(const hWindow : DWORD;const AdwDummy : DWORD) : Longbool; stdcall;
var
  pCaption : PChar; // Die Adresse eines Buffers, der den jeweiligen Fenstertitel aufnehmen soll
  dwSize : DWORD; // Bufferlänge

begin
  Result := true; // TRUE = weitermachen

  // Nur sichtbare Fenster prüfen
  if not IsWindowVisible(hWindow) then exit;

  // Ermitteln, wie lang der Text des Fenstertitels ist
  dwSize := SendMessage(hWindow,WM_GETTEXTLENGTH,0,0);

  // Speicher für die auszulesende Caption reservieren + 1, wg. der terminierenden 0
  pCaption := AllocMem(dwSize+1);
  try

    // Fenstertitel auslesen
    // da als zweiter Parameter ein lParam erwartet wird, aber eine Adresse zu
    // übergeben ist, findet hier eine Typumwandlung statt
    SendMessage(hWindow,WM_GETTEXT,dwSize+1,lParam(pCaption));

    // Fenstertitel anzeigen
    // Hier kann dann auch die Prüfung stattfinden, ob das Handle des gesuchten Fensters
    // an diese Funktion übergeben wurde, um damit anzustellen, was auch immer
    // passieren soll.
    // War es das richtige, dann kann man Result auf FALSE setzen, um anzuzeigen,
    // das keine weiteren Fenster durchgegangen werden müssen
    if (pcaption^ <> '')
    then
      kontrolle(pcaption);
  finally
    // Speicher wieder freigeben
    FreeMem(pCaption,dwSize+1);
  end;
end;

procedure TWaechter.TZeitgeberOntimer(Sender : TObject);
begin
  EnumWindows(@EnumWindowsProc, 0);
end;

procedure TWaechter.kontrolle(text:pchar);
var i :integer;
    bo : boolean;
begin
  //Weitere Verarbeitungen mit dem Namen des Fensters
end;

constructor TWaechter.create;
begin
  TZeitgeber := TTimer.create(nil);
  with TZeitgeber do
  begin
    interval := 500;
    onTimer := TZeitgeberOnTimer;
    enabled := false;
  end;
  SetLength(liste, 0);
end;

destructor TWaechter.destroy;
begin
  SetLength(liste, 0);
end;

procedure TWaechter.enabled(res: boolean);
begin
  TZeitgeber.enabled := res;
end;

end.
Der Source ist gekürzt.

In der Methode TZeitgeberOnTimer meldet der Compiler, dass die Variable nicht definiert ist. Das Problem liegt wohl daran, dass ich eine Methode aufrufe, die innerhalb des Objektes liegt, das geht aber anscheinend so nicht. Wenn ich vor EnumwinodwsProc die Definition TWaechter entferne, meldet er beim Aufruf von kontrolle einen Fehler, der dann natürlich logisch ist, weil das dann wieder innerhalb des Objektes ist. Kann ich das irgendwie lösen? es sollte schon objektorientiert sein.

Beste Grüße
Ulrich
Ulrich Strauer
  Mit Zitat antworten Zitat