Jeg vil gerne lave et component baseret på TLabel, når jeg "opretter" et component med TLabel som grundsten får man jo en kode som giver et component som er pricist som TLabel...
Mit spørgsmål er så hvordan gør man så der sker et eller andet når componentet bliver oprettet på formen, og hvordan man gør så der sker noget når musen er over labelen, når musen forlader labelen, når musen er trykket ned og når musen går op
mvh.
Lasse Espeholt
webmaster for espeholt.dk
Hej Lasse,
Hvis du bygger din komponent på TStaticText (TWinControl) så får du events fra musen (OnMouseMove, OnMouseDown og OnMouseUp). Disse events kan du bruge til flere af dine ovenstående spørgsmål.
Jeg har skrevet en komponent som giver dig 3 ekstra events (OnInit, OnEnter og OnExit). De bliver kaldt når komponenten er loaded og når musen går ind over komponenten og når den forlader komponenten.
Jeg bruger "Mouse" variablen (ligger som en global variabel under Controls.pas) til at fange alle events fra musen til komponenten. Du kan dog også bruge Windows egne "GetCapture" og "SetCapture" funktioner.
For at besvare dine spørgsmål så skal du bruge "OnMouseUp" til at angive når brugeren har trykket på musen. "OnEnter" for at angive når brugeren har ført musen over komponenten og "OnExit" når den er fjernet fra komponenten. Du skal bruge OnInit til at angive hvornår du kan/bør sætte data.
Her er koden til komponenten:
unit MyLabel;
interface
uses
Classes,
Windows,
Controls,
StdCtrls;
type
TMyLabelOnEnter = procedure(Sender : TObject; X, Y : Integer) of object;
TMyLabelOnExit = TMyLabelOnEnter;
TMyLabelOnInit = procedure(Sender : TObject) of object;
TMyLabel = class(TStaticText)
private
FCapture : HWND;
FIsCaptured : Boolean;
FOnEnter : TMyLabelOnEnter;
FOnExit : TMyLabelOnExit;
FOnInit : TMyLabelOnInit;
protected
procedure CaptureMouse;
procedure ReleaseMouse;
procedure Notification(AComponent: TComponent; Operation: TOperation); override;
procedure Loaded; override;
procedure MouseMove(Shift: TShiftState; X, Y: Integer); override;
procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override;
public
constructor Create(AOwner : TComponent); override;
destructor Destroy; override;
property OnEnter : TMyLabelOnEnter read FOnEnter write FOnEnter;
property OnExit : TMyLabelOnExit read FOnExit write FOnExit;
property OnInit : TMyLabelOnInit read FOnInit write FOnInit;
end;
procedure Register;
implementation
uses
SysUtils;
constructor TMyLabel.Create(AOwner : TComponent);
begin
inherited Create(AOwner);
FCapture := 0;
FIsCaptured := False;
FOnEnter := nil;
FOnExit := nil;
FOnInit := nil;
end;
destructor TMyLabel.Destroy;
begin
ReleaseMouse;
FOnEnter := nil;
FOnExit := nil;
FOnInit := nil;
inherited Destroy;
end;
procedure TMyLabel.CaptureMouse;
begin
if not FIsCaptured then
begin
FIsCaptured := True;
FCapture := Mouse.Capture;
Mouse.Capture := Handle;
end;
end;
procedure TMyLabel.ReleaseMouse;
begin
if FIsCaptured then
begin
FIsCaptured := False;
Mouse.Capture := FCapture;
FCapture := 0;
end;
end;
procedure TMyLabel.Notification(AComponent: TComponent; Operation: TOperation);
begin
if (AComponent = Self) and (Operation = opRemove) and (FIsCaptured) then
ReleaseMouse;
inherited Notification(AComponent, Operation);
end;
procedure TMyLabel.Loaded;
begin
inherited Loaded;
if Assgined(FOnInit) then
FOnInit(Self);
end;
procedure TMyLabel.MouseMove(Shift: TShiftState; X, Y: Integer);
begin
if (X >= 0) and (X < Width) and (Y >= 0) and (Y < Height) then
begin
if not FIsCaptured then
begin
CaptureMouse;
if Assigned(FOnEnter) then
FOnEnter(Self, X, Y);
end;
end
else
begin
ReleaseMouse;
if Assigned(FOnExit) then
FOnExit(Self, X, Y);
end;
inherited MouseMove(Shift, X, Y);
end;
procedure TMyLabel.MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
ReleaseMouse;
inherited MouseUp(Button, Shift, X, Y);
end;
procedure Register;
begin
RegisterComponents('Additional', [TMyLabel]);
end;
end.
Håber det var det du skulle bruge,
Mvh
Michael.