Newsgroup: it.comp.lang.delphi
Titolo: Componenti particolari...

Salve a tutti, ho in mente questa cosa qui:
siccome sto cercando di creare dei componenti standard per lo sviluppo delle
mie applicazioni gestionali in Delphi 3, volevo creare un DBEdit particolare
per i campi codice, che effettui direttamente il controllo di univocità del
codice in tabella.
Ho già verificato che per fare il controllo è assolutamente necessario
avvalersi dell'evento OnValidate del campo persistente. Ora, la domanda è:
come posso fare in modo che un componente (TDBEditCodice) colleghi
direttamente un event handler ad un oggetto (TField) inserito come sua
proprietà?
Il codice dell'event handler è semplice e facilmente generalizzabile, ma
come faccio a dire nel sorgente del componente che deve associare all'evento
OnValidate della proprietà FFieldName una mia particolare procedura?
A rigor di logica, ho già provato quanto segue (ho spremuto al massimo le
mie capacità progettuali in Delphi :) :
  TDBEditCodice = class(TDBEdit)
  private
    { Private declarations }
    FFieldName: TField;
    procedure SetFieldName( Value: TField);
  protected
    { Protected declarations }
  public
    { Public declarations }
    FieldValidation: TFieldNotifyEvent;
  published
    { Published declarations }
    property FieldName: TField read FFieldName write SetFieldName;
  end;
implementation
procedure TDBEditCodice.SetFieldName( Value: TField);
begin
  FFieldName := Value;
  FFieldName.OnValidate := FieldValidation;
end;
procedure FieldValidation;
begin
  ...
end;
Compila bene, non dà errori, ma ovviamente non funge... :(
Spero di essermi spiegato bene e che possiate aiutarmi.
Grazie!
Ivano
iva...@infinito.it

Avere un altro TField in TDbEdit non credo serva a granchč: inizi ad avere
delle ridondanze.
Invece, semplificati la vita.
Dai un ovveride all'evento onvalidate e lo riscrivi con una colsa del tipo:
...
If not FbEsisteGia then
    begin
    inherited;
    end
  else
   begin
   qualcosa!
   end;

 wrote in message
8itcl0$egm$1...@nslave1.tin.it...


Ivano >>
[...] volevo creare un DBEdit particolare
per i campi codice, che effettui direttamente il controllo di univocità del
codice in tabella.
Ho già verificato che per fare il controllo è assolutamente necessario
avvalersi dell'evento OnValidate del campo persistente. Ora, la domanda è:
come posso fare in modo che un componente (TDBEditCodice) colleghi
direttamente un event handler ad un oggetto (TField) inserito come sua
proprietà?
Il codice dell'event handler è semplice e facilmente generalizzabile, ma
come faccio a dire nel sorgente del componente che deve associare
all'evento
OnValidate della proprietà FFieldName una mia particolare procedura?
[...]
<<
TDBEditValidator = class(TDBEdit)
protected
 procedure SetDataField(const Value: string);    // imposta il Field
 procedure DoValidate(Sender: TField);
end;
in SetDataField chiami il metodo ereditato _e_ imposti DoValidate come
metodo da eseguire nell'evento OnValidate della proprietà Field di
TDbEditValidator; in DoValidate fai quel che devi.
NB: volendo fare le cose per bene dovresti subclassare anche il TField che
assegni al TDbEditValidator: infatti l'evento OnValidate non è più
disponibile per l'applicazione una volta che è stato assegnato al metodo
del debedit e viceversa: se assegni un metodo a OnValidate del TField non
ti viene più richiamato DoValidate del TDbEditValidator.
Anzi, forse la strada migliore è proprio quella di subclassare TField, dopo
tutto
l'evento succede lì: basta cambiare il metodo Validate (public)
hth
Paolo Arosio