Hey there
Als ich wieder einmal eine Wrapperklasse schreiben wollte, kam mir die Idee, anstatt wie üblich TObject als Basisklasse zu verwenden,
object zu nehmen:
Delphi-Quellcode:
type
Wrapper = object
end;
Obwohl das ja veraltet ist, sehe ich einige Vorteile: Man kann damit ganz einfach Funktionen kapseln, hat jedoch kein Overhead von TObject (vorallem wenn man eh nur ein einziges Feld wie z.B. ein
Handle hat) und die Verwendung ist ein wenig praktischer, da das Instantiieren wegfällt. (Oder?
)
Ein Beispiel:
Delphi-Quellcode:
interface
type
WWindow =
object(Wrapper)
private
FHandle: HWND;
function GetTopMost: Boolean;
procedure SetTopMost(
const Value: Boolean);
public
function Find(
const Caption:
string): Boolean;
property Handle: HWND
read FHandle
write FHandle;
property TopMost: Boolean
read GetTopMost
write SetTopMost;
end;
implementation
function WWindow.Find(
const Caption:
string): Boolean;
begin
FHandle:= FindWindow(
nil, PChar(Caption));
Result:= FHandle <> 0;
end;
function WWindow.GetTopMost: Boolean;
begin
Result:= (GetWindowLong(FHandle, GWL_EXSTYLE)
and WS_EX_TOPMOST) <> 0;
end;
procedure WWindow.SetTopMost(
const Value: Boolean);
const
InsertAfter:
array[Boolean]
of HWND = (HWND_NOTOPMOST, HWND_TOPMOST);
begin
SetWindowPos(FHandle, InsertAfter[Value], 0, 0, 0, 0,
SWP_NOMOVE
or SWP_NOSIZE
or SWP_SHOWWINDOW);
end;
Anwendung:
Delphi-Quellcode:
var
Window: WWindow;
begin
assert(Window.Find('Unbenannt - Editor'));
Window.TopMost:= True;
end
Ich finde, das sieht eigentlich ganz praktisch aus... Nur gibt es bei der Zuweisung von TopMost eine
AV, wenn er in SetTopMost auf FHandle zugreifen will. ABER: Wenn ich SetTopMost direkt aufrufe, funktioniert alles tadellos...
Woran kann das liegen? Ich meine, es wird wohl schon ein Grund geben, warum
object veraltet ist...
Gruss
Shaman