Einer der Wege das ganze etwas zu verpacken (erster Schritt). Eine
Unit mit einer Funktion die es ermöglicht eine Methode für jedes Fenster aufrufen zu lassen:
Delphi-Quellcode:
unit WndUtils;
interface
uses
Windows;
type
// Die Enumerierung wird abgebrochen wenn die Methode False zurückgibt.
TEnumWndCallback =
function(AWnd: HWND): Boolean
of object;
function EnumWnd(ACallback: TEnumWndCallback): Boolean;
implementation
type
PEnumWndParam = ^TEnumWndParam;
TEnumWndParam =
record
Callback: TEnumWndCallback;
end;
function EnumWndProc(AWnd: HWND; AParam: LPARAM): BOOL
stdcall;
begin
Result := PEnumWndParam(AParam).Callback(AWnd);
end;
function EnumWnd(ACallback: TEnumWndCallback): Boolean;
var
Param: TEnumWndParam;
begin
Param.Callback := ACallback;
Result := EnumWindows(Pointer(Addr(EnumWndProc)), LPARAM(Addr(Param)));
end;
end.
In der benutzenden Klasse muss eine Methode vom Typ TEnumWndCallback implementiert werden:
Delphi-Quellcode:
unit Unit1;
interface
uses
Windows, Classes, Forms, Controls, StdCtrls;
type
TForm1 =
class(TForm)
//...
private
{ Private-Deklarationen }
function EnumWndCallback(AWnd: HWND): Boolean;
//...
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
uses
WndUtils;
//...
function TForm1.EnumWndCallback(AWnd: HWND): Boolean;
begin
//...
Result := True;
// Enumerierung fortsetzen
end;
//...
end.
Dann muss der Hilfsfunktion nur die Methode übergeben werden:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
EnumWnd(EnumWndCallback);
end;
Dadurch wird dann TForm1.EnumWndCallback für jedes Fenster aufgerufen.
Der nächste Schritt der Kapselung wäre eine eigene Klasse, die in ihrer EnumWndCallback das Standardverhalten implementiert.