Jeg forsøger at lave en Function som fanger mouse bevægelse over knappen TBitBtn og derved ændre farven.
Jeg ville jo nok vælge at gøre det på en anden måde. Først ville jeg sub-classe TBitBtn til det følgende:
type
TMyBitBtn = Class(TBitBtn)
private
FOnMouseLeave: TNotifyEvent;
FOnMouseEnter: TNotifyEvent;
procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER;
procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE;
published
property OnMouseEnter: TNotifyEvent read FOnMouseEnter write FOnMouseEnter;
property OnMouseLeave: TNotifyEvent read FOnMouseLeave write FOnMouseLeave;
end;
{ TMyBtnBtn }
procedure TMyBitBtn.CMMouseEnter(var Message: TMessage);
begin
inherited;
if Assigned(FOnMouseEnter) then
FOnMouseEnter(Self);
end;
procedure TMyBitBtn.CMMouseLeave(var Message: TMessage);
begin
inherited;
if Assigned(FOnMouseLeave) then
FOnMouseLeave(Self);
end;
Dernæste ville jeg så bruge TMyBitBtn i stedet for standard knappen (Den skulle selvfølgelig registreres, men her opretter jeg den bare i kode).
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
procedure BtnEnter(Sender: TObject);
procedure BtnExit(Sender: TObject);
end;
{ TForm1 }
procedure TForm1.FormCreate(Sender: TObject);
var
BitBtn: TMyBitBtn;
begin
BitBtn := TMyBitBtn.Create(Self);
with BitBtn do
begin
Name := 'BitBtn';
Parent := Self;
Left := 160;
Top := 52;
Width := 75;
Height := 25;
Caption := 'Test Knap';
TabOrder := 0;
OnMouseEnter := BtnEnter;
OnMouseLeave := BtnExit;
end;
end;
procedure TForm1.BtnEnter(Sender: TObject);
begin
(Sender as TMyBitBtn).Font.Style := [fsBold];
(Sender as TMyBitBtn).Font.Color := clBlue;
end;
procedure TForm1.BtnExit(Sender: TObject);
begin
(Sender as TMyBitBtn).Font.Style := [];
(Sender as TMyBitBtn).Font.Color := clBlack;
end;
Så virker det iøvrigt bare. Denne fremgangsmåde kan jo også bruges på stort set alle andre komponenter, og dermed hjælpe med til at gøre tingene meget meget nemmere.
Iøvrigt vil jeg lige sige at koden til TMyBitBtn event'ene er sakset fra TLabel, som lige netop har OnMouseEnter og OnMouseLeave. Det er en god ide at studere kildekoden til dvs. komponenter. Man kan få mange gode ideer derfra. Det kræver selvfølgelig at man har en PRO udgave eller større.
--
Thomas Due
Software developer
udvikleren.dk - ASP redaktør
tdue@mail.dk
[Redigeret d. 06/01-04 08:23:18 af Thomas Due]
Hej Thomas Due
Mange tak for dit svar!
Jeg bruger dette som indlæring i Delphi.
Den første Kodeeksempel "sub-classe TBitBt"
Forstår jeg ikke rigtig, er hel på bare bund!
Er det en komponent?
Eller hvor skal dette indskrives?
Med venlig hilsen
Monie Jacobsen
energy@sunwind.dk
Hvis du tager udgangspunkt i præcis de eksempler jeg har skrevet kan du gøre således:
unit unit1;
interface
uses
...
type
TForm1 = Class(TForm)
...
private
...
public
...
end;
implements
type
TMyBitBtn = Class(TBitBtn)
private
...
public
...
end;
{ TMyBitBtn }
// Indsæt koden for TMyBitBtn metoder.
{ TForm1 }
// Indsæt koden for TForm1.
Ulempen ved at TMyBitBtn i dens nuværende form er at man skal oprette knapperne runtime, altså man skal skrive kode for at oprette dem. Man kan ikke sætte dem ind på formen. Det kræver at TMyBitBtn registreres som komponent.
Hvis du skal bruge mange af denne type knapper skal du derfor nok registrere knappen som komponent.
Hvis du uden videre vil registrer TMyBitBtn som komponent skal du kopiere koden over i en selvstændig unit. Her skal du så indsætte en særlig procedure som Delphi bruger til at finde ud af at registrere komponenten.
procedure Register; // BEMÆRK!! Case sensitivt navn.
begin
RegisterComponents('Samples', [TMyBitBtn]);
end;
Så installerer du den fra menuen Component->Install Component
--
Thomas Due
Software developer
udvikleren.dk - ASP redaktør
tdue@mail.dk