Newsgroup: it.comp.lang.delphi
Titolo: Nuova proprietà su componente derivato.

Ciao a tutti,
ho la necessità di aggiungere alcune funzionalità al TCheckBox classico.
In particolare vorrei far sì che il testo associato al checkbox si
evidenzi quando il mouse ci passa sopra. 
A tal fine ho derivato una nuova classe dalla classe TCheckbox ed ho
aggiunto le proprietà e i metodi che mi servivano: HotTrack e
HotTrackColor. Il tutto funziona, però ho un problema: non riesco a
settare il valore di default della proprietà HotTrackColor. Infatti
succede che l'Object Inspector mi mostra sempre il colore nero di
default anche se nella classe io ho impostato clBlue. Altra cosa: nei
file .dfm la proprietà HotTrackColor non viene salvata, se non quando ha
il valore clBlack. Inoltre ho notato che il valore della proprietà
HotTrackColor viene perso e ripristinato a clBlack se visualizzo (anche
solo per un attimo e senza apportare modifiche) il file .dfm come testo.
Sapreste darmi qualche indicazione?
Qui di seguito c'è la parte di codice che ho usato. Potete aiutarmi?
Grazie 1000.
Claudio Carniato.
type
  TCheckBoxExt = class(TCheckBox)
  private
    FGruppo: Integer;
    OldColor: TColor;
    FHotTrack: Boolean;
    FHotTrackColor: TColor;
  protected
    procedure MouseEnter; override;
    procedure MouseExit; override;
    procedure SetColor(Color: TColor);
  public
    constructor Create(AOwner: TComponent); override;
  published
   property HotTrack: Boolean read FHotTrack write FHotTrack default
False;
   property HotTrackColor: TColor read FHotTrackColor write SetColor
default clBlue;
   property OnMouseEnter;
   property OnMouseExit;
  end;
implementation
constructor TCheckBoxExt.Create(AOwner: TComponent);
begin
 inherited Create(AOwner);
 FHotTrack := False;
 FHotTrackColor := clBlue;
end;
procedure TCheckBoxExt.SetColor(Color: TColor);
begin
 if FHotTrackColor <> Color then
   FHotTrackColor := Color;
end;
procedure TCheckBoxExt.MouseEnter;
begin
 inherited MouseEnter;
 if FHotTrack then
   begin
    OldColor := Font.Color;
    Font.Color := FHotTrackColor;
   end;
end;
procedure TCheckBoxExt.MouseExit;
begin
 inherited MouseExit;
 if FHotTrack then
   Font.Color := OldColor;
end;

 default anche se nella classe io ho impostato clBlue.
Questo accade probabilmente perché hai usato come parametro del metodo il
nome Color e viene agganciata la proprietà. Se guardi nel codice che ho
riscritto l'ho cambiato con Value.
Per il resto dai un'occhiata al codice seguente. L'ho scritto un pò di
fretta ma sembra che vada. In particolare ho usato un campo privato boolean
per evitare "scontri" nel setting della proprietà Color nei metodi di
gestione dei messaggi MouseMove CM_MouseLeave.
Non mi sembra di aver trovare i metodi MouseEnter e MouseExit di cui fai
l'override nella tua classe e delle proprietà OnMouseEnter OnMouseExit e li
ho sostituiti.
Ciao
Antonio
type
  TCheckBoxExt = class(TCheckBox)
  private
    FGruppo: Integer;
    OldColor: TColor;
    FHotTrack: Boolean;
    FHotTrackColor: TColor;
    fSwapped: boolean;
    procedure CMMouseLeave(var Msg: TMessage); message CM_MOUSELEAVE;
  protected
//    procedure MouseEnter; override;
//    procedure MouseExit; override;
    procedure MouseMove(Shift: TShiftState; X, Y: Integer); override;
    procedure DoMouseLeave; virtual;
    procedure SetColor(Value: TColor);
  public
    constructor Create(AOwner: TComponent); override;
  published
    property HotTrack: Boolean read FHotTrack write FHotTrack default False;
    property HotTrackColor: TColor read FHotTrackColor write SetColor
default clBlue;
  end;
procedure Register;
implementation
constructor TCheckBoxExt.Create(AOwner: TComponent);
begin
 inherited Create(AOwner);
   FHotTrack := False;
   FHotTrackColor := clBlue;
   fSwapped := False;
end;
procedure TCheckBoxExt.SetColor(Value: TColor);
begin
  if FHotTrackColor <> Value then
    FHotTrackColor := Value;
end;
{procedure TCheckBoxExt.MouseEnter;
begin
 inherited MouseEnter;
 if FHotTrack then
   begin
    OldColor := Font.Color;
    Font.Color := FHotTrackColor;
   end;
end;}
{procedure TCheckBoxExt.MouseExit;
begin
 inherited MouseExit;
 if FHotTrack then
   Font.Color := OldColor;
end;}
procedure Register;
begin
  RegisterComponents('As', [TCheckBoxExt]);
end;
procedure TCheckBoxExt.CMMouseLeave(var Msg: TMessage);
begin
  DoMouseLeave;
end;
procedure TCheckBoxExt.DoMouseLeave;
begin
 if FHotTrack and fSwapped then
 begin
   Font.Color := OldColor;
   fSwapped := False;
 end;
end;
procedure TCheckBoxExt.MouseMove(Shift: TShiftState; X, Y: Integer);
begin
  inherited MouseMove(Shift, X, Y);
  if FHotTrack and (not FSwapped) then
   begin
     OldColor := Font.Color;
     Font.Color := FHotTrackColor;
     fSwapped := True;
   end;
end;
end.

 l'override nella tua classe e delle proprietà OnMouseEnter OnMouseExit
Infatti, nel codice non ho specificato che la classe è derivata da
TLMDCheckBox (CheckBox dei LMDTools).
Ciao e grazie ancora!
Claudio Carniato