Newsgroup: it.comp.lang.delphi
Titolo: Evidenziare Bottoni a runtime

Creo dei bottoni a runtime e volevo evidenziare in qualche modo il bottone 
sul quale l'utente e' con il mouse. Mi piaceva l'idea di evidenziare i 
contorni del bottone e, non trovando altre idee, avevo pensato di costruire 
attorno un TBevel reso visibile solo dal passaggio del mouse sopra di esso. 
Però non sono riuscito a fare funzionare il congegno. Senbra che la 
proprietà 'visible' sia applicata al TButton piuttosto che al TBevel. Il mio 
codice è il seguente:
 
  for i := 0 to 10 do
  begin
     aButton := TButton.Create(Self);
     aBevel := TBevel.Create(Self);
 
     with aButton do
     begin
       Name := Format('Button%d', [i]);
       Parent := Self;
       Left := 16;
       Top := 40 + i*25;
       Width := 145;
       Height := 20;
       Caption := Format('Button %d', [i]);
       OnMouseEnter := AnyBtnMouseEnter;
       OnMouseLeave := AnyBtnMouseLeave;
     end;
 
     with aBevel do
     begin
       Parent := Self;
       Left := aButton.Left-2;
       Top := aButton.Top-2;
       Width := aButton.Width+4;
       Height := aButton.Height+4;
       Shape:= bsFrame;
       Style:= bsRaised;
       visible:= false;
     end;
  end;
 
Le seguenti proc dovrebbero occuparsi di mostrare e nascondere il bevel 
intorno al bottone, ma invece MouseEnter non ha alcun effetto e MouseLeave 
nasconde del tutto il bottone...
procedure Tform1.AnyBtnMouseEnter(Sender: TObject);
begin
  If Sender is TButton then
     Tbevel(Sender).Visible := true;
end;
 
procedure Tform1.AnyBtnMouseLeave(Sender: TObject);
begin
  If Sender is TButton then
     Tbevel(Sender).Visible := false;
end;
 
Dove sbaglio ? Avete qualche altra idea migliore ' 
 

 Dove sbaglio ? Avete qualche altra idea migliore '
 
 > procedure Tform1.AnyBtnMouseEnter(Sender: TObject);
 > begin
 > If Sender is TButton then
 > Tbevel(Sender).Visible := true;   >>>>> l'errore è qui
 > end;
 >
 > procedure Tform1.AnyBtnMouseLeave(Sender: TObject);
 > begin
 > If Sender is TButton then
 > Tbevel(Sender).Visible := false;   >>>>> l'errore è qui
 > end;
 
Quando crei "aBevel" non lo leghi al suo "aButton". Potresti, creare 
prima aBevel e mentre crei aButton lo assegni alla proprietà tag:
 
aButton.tag := @aBevel;
 
così, dopo puoi renderlo visibile o invisibile nell'evento:
 
procedure Tform1.AnyBtnMouseLeave(Sender: TObject);
begin
   If Sender is TButton then
   Tbevel(TButton(Sender).tag).Visible := false;
end;
 
Codice non testato.
 
Ciao.

 aButton.tag := @aBevel;
 
volevo scrivere: aButton.tag := Integer(aBevel);
 
Ciao.

end;
 
Puo` diventare:
procedure Tform1.AnyBtnMouseEnter(Sender: TObject);
begin
  If Sender is TButton then
    TBevel(TButton(Sender).Owner).Visible := true;
end;
 
E similmente anche l'altra...
La tua non poteva funzionare perche`, se guardi, voleva rendere
invisibile o visibile il Sender, e quindi proprio lo stesso Button...
 
Ciao ciao
Claudio

Adesso mi pare cosě chiaro ! Grazie, correggo subito. 
 

 Claudio
Poichč il TBevel non aveva il look che mi aspettavo, ho provato a 
sostituirlo, nel codice sopra che mi ha gentilmente suggerito Claudio, con 
un TPanel. Perň cosě non funziona: quando passo con il mouse sul bottone 
tutto comincia a flashare rapidissimamente. Se premo il bottone del mouse, 
l'immagine si ferma, ma vedo il Panel e per rivedere il bottone devo 
rilasciare il mouse. ualcuno capisce perchč ? 
 

 Dove sbaglio ? Avete qualche altra idea migliore '
 
Hai provato a usare gli SpeedButton? Se imposti Flat = TRUE hanno gia' 
l'effetto grafico che ti serve senza bisogno di scrivere codice.
 
ciao
Giacomo
 
 

rilasciare il mouse. ualcuno capisce perchè ? 
 
Non lo avevo mai notato prima d'ora, ma a quanto pare quando il Panel
cambia la proprieta` Visible a true, viene ridisegnato _sopra_ il
Button [mi pare, eh! dovrei controllare meglio]... Se poi ricordi che
nel Panel ci si puo` *entrare* ed *uscire* [come nei Button, ma
differentemente dai Bevel] scatenando l'evento *uscita* dei tuoi Button
piazzati in serie, ottieni il casino che ottieni... :-)
 
Potresti anche sistemare le cose, ma... francamente mi sembra tutto
abbastanza *inutile*... Perche` *inutile*? perche` l'*aspetto grafico*
del Panel [che e` l'unico aspetto che sembra interessarti in questo
caso] e` dato proprio dal _suo_ Bevel... e cioe` mettere un panel al
posto di un bevel solo per la resa grafica e` del tutto inutile, a mio
avviso... perche` si comporteranno allo stesso modo [o quasi, ma non
credo che le piccole differenze importino nel tuo caso]...
 
Ma non e` che forse ti conviene derivarti dall'originale un Button tutto
tuo con capacita` di evidenziazione tutte particolari? o anche cercarne
uno gia` pronto tra i millemila componenti free che si trovano in
giro... te lo dico giusto per dare un'occhiata al codice gia` scritto
per problemi simili e farti venire nuove idee...
 
Ciao ciao
Claudio
 

Hai provato a usare gli SpeedButton? Se imposti Flat = TRUE hanno gia'
l'effetto grafico che ti serve senza bisogno di scrivere codice.
 
ciao
Giacomo
 
Ti ringrazio del suggerimento. In effetti volevo che apparisse un bordo di 
un certo spessore al passagio del mouse, ma era uno sfizio di tipo grafico 
suggeritomi da un'applicazione che uso e che mi era parso contemporaneamente 
attraente e di aiuto all'utente.