Newsgroup: it.comp.lang.delphi
Titolo: Come notificare il cambiamento di una proprietà integer

Usando TPanel come contenitore di altri oggetti
sono riuscito a creare dei component template interessanti senza dovermi
addentrare
nella costruzioni di nuovi componenti derivati
ho constato,però ,che TPanel con l'aggiunta di una proprietà Value:integer
poteva diventare la base per creare dei component template più "potenti"
Allora ho cercato di creare un nuovo componente partendo da TCustomPanel
Ho fatto quello che potevo e sapevo
ho aggiunto le proprietà Min,Max,Value e ho aggiunto l'evento OnChange
Ora il mio problema e che vorrei che in fase di esecuzione su una variazione
della proprietà Value si scateni l'evento OnChange
Il componente che ho creato purtroppo non fa cio'
qualcuno puo' suggerirmi cosa devo fare
Allego il listato
Saluti e Ringraziamenti
Dodo
.-.-.-.-.-.--.-.--.-.-.--.-.-.-.-.-.--.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-
.-.-.-.-.-.-.-
 public
    { Public declarations }
    constructor Create(AOwner:TComponent); override;
  published
    { Published declarations }
    property OnChange: TNotifyEvent read FOnChange write FOnChange;
    property Max:integer read FMax write SetMax default 10;
    property Min:integer read FMin write SetMin default 0;
    property Value:integer read FValue write SetValue default 0;
  end;
procedure Register;
implementation
constructor TPanelNum.Create(AOwner:TComponent);
begin
 inherited Create(AOwner);
 FValue:=0;
 FMin:=0;
 FMax:=10;
end;
procedure TPanelNum.Change;
begin
 if assigned (FOnChange) then FOnChange(Self);
end;
procedure TPanelNum.SetValue(AValue:Integer);
begin
 FValue:=AValue;
 if AValue < FMin then FValue:=FMin;
 if AValue > FMax then FValue:=FMax;
 Update
end;
procedure TPanelNum.SetMin(AMin:Integer);
begin
 FMin:=AMin;
 if (AMin>FValue)then FMin:=FValue;
 Update
end;
procedure TPanelNum.SetMax(AMax:Integer);
begin
 FMax:=AMax;
 if (AMax<FValue) then FMax:=FValue+1;
 Update
end;
procedure Register;
begin
  RegisterComponents('Personal', [TPanelNum]);
end;
end.

 end;
Dovrebbe bastare...
Ciao :-)
--
(¯`·.¸¸.·´¯`·.¸¸.-> Andrea <-.¸¸.·´¯`·.¸¸.·´¯)
AntiSpam: rimuovere il trattino basso dall'indirizzo per rispondere
AntiSpam: remove the underscore from the e-mail address to reply

 Il componente che ho creato purtroppo non fa cio'
L'interfaccia della classe TPanelNum è incompleta. Manca la definizione
della procedura Change, ma immagino che sia una dimenticanza della
pubblicazione sul NG...
Da quello che vedo dal codice l'evento onchange non viene mai lanciato in
quanto la procedura Change non viene mai chiamata.
Nella procedura setvalue, dopo (o prima, scegli tu come ti va meglio) a
Update, metti la chiamata alla procedura change:
procedure TPanelNum.SetValue(AValue:Integer);
begin
 FValue:=AValue;
 if AValue < FMin then FValue:=FMin;
 if AValue > FMax then FValue:=FMax;
 Update;
CHANGE;
end;
Dopo che il controllo verrà ridisegnato a forza con UPdate, partirà la
l'evento onchange se a questo sarà legata una procedura.
Se ho preso un'abbaglio fammi un fischio.
Ciao
Matteo

Ringrazio gli amici che mi hanno risposto
Ho fatto come mi avete detto ed il componente in fase
di esecuzione a risposto a dovere
In pratica all'interno del componente ho messo dei TShape per
simulare una barra a led che cambiava lo stato di quest'ultimi
al variare della proprietą Value del nuovo componente
purtroppo, se in fase di realizzazione inizializzo il Value del componente
con un valore diverso da 0 e poi mando in esecuzione l'applicazione
il programma solleva un EAccessViolation
Se interessa il programma si blocca su un controllo del Value del componente
in questione
procedure TForm1.BarChange(Sender: TObject);
begin
 ---->>>if Bar.Value and 1 = 1 then led1.Brush.Color:=clRed else
led1.Brush.Color:=clGray;
 if Bar.Value and 2 = 2 then led2.Brush.Color:=clRed else
led2.Brush.Color:=clGray;
 if Bar.Value and 4 = 4 then led3.Brush.Color:=clRed else
led3.Brush.Color:=clGray;
 if Bar.Value and 8 = 8 then led4.Brush.Color:=clRed else
led4.Brush.Color:=clGray;
 if Bar.Value and 16 = 16 then led5.Brush.Color:=clRed else
led5.Brush.Color:=clGray;
 if Bar.Value and 32 = 32 then led6.Brush.Color:=clRed else
led6.Brush.Color:=clGray;
 if Bar.Value and 64 = 64 then led7.Brush.Color:=clRed else
led7.Brush.Color:=clGray;
 if Bar.Value and 128 = 128 then led8.Brush.Color:=clRed else
led8.Brush.Color:=clGray;
end;
Saluti e Ringraziamenti
Dodo

 in questione
Hai provato ad inizializzare la variabile nel constructor?
