Newsgroup: it.comp.lang.delphi
Titolo: Consiglio componente

Ciao a tutti, vorrei chiedervi un consiglio riguardo  un componente che ho
sviluppato. Il componente è un led che lampeggia . Per fare ciò prende in
ingresso una ImageList e cicla tra l'immagine di indice 0 e quella di indice
1, dando la sensazioni del lampeggio. Ora, diciamo periodicamente, vedo una
righetta nera di aggiornamento, cioè (penso) un battimento dovuto
all'interferenza tra il timer di cambio immagine e quello di aggiornamento
del monitor. Come potrei fare ad eliminare questo piccolo problema?
Spero di essere stato chiaro..
Grazie in anticipo.
Giuseppe
----------------------------------------------------------------------------
-
unit HNLed;
interface
uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ExtCtrls;
const
  OBJ_WIDTH=50;
  OBJ_Height=50;
type
  THNLed = class(TcustomControl)
  private
    { Private declarations }
    fImage:TPaintBox;
    fTimer:TTimer;
    FImageList:TImageList;
    fCurrImage:Integer;
    FIsON:boolean;
    Procedure TimerOnTimer(Sender:Tobject);
    Function MyNot(value:double):double;
  protected
    { Protected declarations }
    procedure SetImageList(Value:TImageList);
    procedure SetON(Value:Boolean);
    Function  GetON:boolean;
    procedure SetBlinking(Value:Boolean);
    Function  GetBlinking():boolean;
    procedure SetInterval(Value:integer);
    Function  GetInterval:integer;
    Procedure SetBounds(ALeft,ATop, AWidth, AHeight:Integer); override;
    Procedure PaintBoxPaint(Sender:TObject);
  public
    { Public declarations }
    constructor Create(AOwner:TComponent);override;
  published
    { Published declarations }
    property ImageList:TImageList read FImageList write SetImageList;
    property LedON:Boolean read GetON write SetON default False;
    property Interval:Integer read GetInterval write SetInterval default
500;
    property Blink:Boolean read GetBlinking write SetBlinking default False;
  end;
procedure Register;
implementation
procedure Register;
begin
  RegisterComponents('Fiumicino', [THNLed]);
end;
constructor THNLed.Create(AOwner:TComponent);
begin
  inherited Create(AOwner);
  { Creo la paintbox}
  FImage:=TPaintBox.Create(self);
  FImage.Parent:= self;
  //Fimage.Width:=65;
  //FImage.Height:=65;
  FImage.Enabled:=False;
  FImage.OnPaint:=PaintBoxPaint;
  {Istanzio il timer }
  FTImer:=TTimer.Create(Self);
  FTimer.OnTimer:=TimerOnTimer;
  FTimer.Enabled:=False;
  FTimer.Interval:=500;
end;
{--------------------------------------------------------}
procedure THNLed.SetBounds (
  ALeft, ATop, AWidth, AHeight: Integer);
begin
  inherited SetBounds (ALeft, ATop, AWidth, AHeight);
  // center the paintbox, if exists
  if Assigned (fImage) then
  begin
    if Assigned (fImageList) then
      fImage.SetBounds (
        (Width - fImageList.Width) div 2,
        (Height - fImageList.Height) div 2,
        fImageList.Width, fImageList.Height)
    else
     { fImage.SetBounds (
        Width div 2, Height div 2, 0, 0);
    fImage.Invalidate;}
  end;
end;
{--------------------------------------------------------}
procedure THNLed.SetON (Value: Boolean);
begin
 { if value then fCurrImage:=1;
  else fCurrImage:=0;
  FImage.Repaint;}
  FIsOn:=Value;
  if FIsOn then FCurrImage:=1
  else FCurrImage:=0;
  FImage.Repaint
end;
{--------------------------------------------------------}
function THNLed.GetON: Boolean;
begin
  Result:=FIsOn;
end;
{--------------------------------------------------------}
procedure THNLed.SetBlinking (Value: Boolean);
begin
  fTimer.Enabled := Value;
  FIsON:=Value;
  setOn(value);
end;
{--------------------------------------------------------}
function THNLed.GetBlinking: Boolean;
begin
  Result := fTimer.Enabled;
end;
{--------------------------------------------------------}
procedure THNLed.SetInterval (Value: Integer);
begin
  fTimer.Interval := Value;
end;
{--------------------------------------------------------}
function THNLed.GetInterval: Integer;
begin
  Result := fTimer.Interval;
end;
{--------------------------------------------------------}
procedure THNLed.SetImageList (Value: TImageList);
begin
  if fImageList <> Value then
  begin
    fImageList := Value;
    Caption := '';
    // change the position
    SetBounds (Left, Top, Width, Height);
  end;
end;
{--------------------------------------------------------}
procedure THNLed.TimerOnTimer(Sender: TObject);
begin
  if Assigned (fImageList) then
  begin
    // update counter and repaint
    Inc (fCurrImage);
    if fCurrImage >= fImageList.Count then
      fCurrImage := 0;
   // Mynot(FCurrImage);
    fImage.Repaint;
  end;
end;
{--------------------------------------------------------}
procedure THNLed.PaintBoxPaint (Sender: TObject);
begin
  // paintbox OnPaint event handler
  self.Width:=OBJ_WIDTH;
  self.Height:=OBJ_HEIGHT;
  if Assigned (fImageList) then
    fImageList.Draw(FImage.Canvas, 0, 0, fCurrImage);
end;
{--------------------------------------------------------}
Function THNLed.MyNot (Value:double):double;
begin
  Result:=abs(value-1);
end;
end.


Open Delphi Manual (
http://groups.yahoo.com/group/delphi_open_manual/
)

 proprietà ControlStyle nel metodo costruttore Create.
Qui mi perdo.. ho trovato una proprietà .ControlStyle dell'oggetto TImage e
posso impostarla a valore differente da csOpaque, intendevi questo?
Grazie mille.
Giuseppe

 questo?
La proprietà è un insieme, pertanto la rimozione dell'attributo
all'interno del costruttore si ottiene in questo modo:
==============================
constructor TMyControl.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  ControlStyle := ControlStyle - [csOpaque];
  ...
end;
==============================
Ti ho riportato esempi di codice per essere il più pratico possibile,
anche se nessuno degli esempi è stato testato e compilato...servono solo
ad esprimere meglio i concetti.
Spero comunque di averti dato sufficienti indicazioni per apportare le
dovute correzioni al tuo componente.


Grazie mille di tutto, sei stato gentilissimo, proverò ad effettuare le
modifiche.
Giuseppe
"Marco Breveglieri" <ma...@NOSPAMabls.it> ha scritto nel messaggio
news:oeROb.112738$VW.46...@news3.tin.it...


 le modifiche.
Prego ma...occhio a quotare! 8-O
http://wiki.news.nic.it/QuotarBene


   THNLed = class(TcustomControl)
Oltre a quanto ti hanno già detto, visto che derivi da un TCustomControl
potresti provare anche la proprietà TWinControl.DoubleBuffered
-- 
Lis
Mercatino: 
http://snurl.com/sito_lis
Aiuta la ricerca contro il cancro: 
http://snurl.com/ida_team

 potresti provare anche la proprietà TWinControl.DoubleBuffered
Infatti avevo in mente un idea di double buffer. Ti dirò, geniale, mi è
bastata aggiungere quest'istruzione e funziona perfettamente.
Grazie a tutti (scusa Marco per il (not)quoting e grazie ancora).
Giuseppe