Newsgroup: it.comp.lang.delphi
Titolo: Oggetti creati dinamicamente

Salve. Posseggo delphi 4 prof.
Debbo piazzare in una form dei controlli creati dinamicamente; questo sono
in grado di farlo. Debbo poi dichiarare dei metodi ed eventi associati a
questi controlli, come ad esempio cliccare su questi oggetti. Come si fa a
dichiarare queste procedure, e dove?
Vi ringrazio
frankie

 ha scritto nel messaggio
news:7hvma.14427$T34.4...@news2.tin.it...

Mi sembra che se ne sia parlato recentemente:
se per esempio e' un bottone:
...
procedure CiaoMamma;
begin
...
end;
...
    aButton := TButton.Create(nil);
    aButton.OnClick := CiaoMamma;
...
Non sono sicuro della sintassi (se c'e' un @ o qualcosa di simile da qualche
parte), ma l'idea e' questa: hai una procedura gia' pronta, e la associ
all'evento OnClick (oppure qualsiasi altro evento del tuo controllo).
Mi attendo correzioni, perche' non sono per nulla sicuro di quello che ho
scritto e ci sara' qualche inesattezza (se non e' cosi' e' abbastanza
simile, comunque...)

     aButton.OnClick := CiaoMamma;
Corretto, unica nota attenzione ai parametri delle procedure associate agli
eventi.
Avrebbe dovuto essere :
 procedure CiaoMamma(Sender : TObject);
 begin
 ...
 end;
Denis

 abbastanza simile, comunque...)
Ottimo, allora correggiamo.
I cosiddetti eventi (degli oggetti) di Delphi sono puntatori a *metodi*,
non a procedure; quindi anInstance.OnEvent := aProcedure e' sbagliato
come assegnare una stringa ad un intero.
Se si va a vedere la dichiarazione di TNotifyEvent (che e' il tipo degli
eventi piu' comuni) vediamo che e'
  type TNotifyEvent = procedure (Sender: TObject) of object;
quindi, oltre al corretto numero e tipo di parametri, la _procedura_ che
leghiamo all'evento deve essere *of object*.
Il modo piu' semplice di costruire una procedure of object (cioe' un
metodo) e' di farsi una bella classe che lo esponga:
type
TForm1 = class(...
end;
TMyButtonHandler = class(TObject)
  procedure GestisciClick(Sender: TObject);
end;
implementation
procedure TMyButtonHandler.GestisciClick(Sender: TObject)
begin
  if Sender is TWinControl then
    ShowMessage('Hai cliccato su ' +
      TWinControl(Sender).Caption);
end;
procedure TForm1.Create(Sender: TObject);
begin
  fBtnHandler := TMyButtonHandler.Create;
  ...
  aButton.OnClick := fBtnHandler.GestisciClick;
end;
procedure TForm1.Destroy(Sender: TObject);
begin
  fBtnHandler.Free;
end;
Saluti
Paolo Arosio

  procedure CiaoMamma(Sender : TObject);
nel caso del bottone tutto ok
bisognerebbe, quando si assegnano questi valori a run time,
assicurarsi del giusto tipo di evento che la classe richiede
(sufficiente e necessario l'Help di Delphi)
per esempio l'evento FormClose non è di tipo TNotifyEvent
come "OnClick" del button ma è di tipo TCloseEvent
tratto dall'help di delfi (chiave di ricerca "TCustomForm.OnClose")
type
  TCloseAction = (caNone, caHide, caFree, caMinimize);
  TCloseEvent = procedure(Sender: TObject;
                            var Action: TCloseAction) of object;
property OnClose: TCloseEvent;
[...]
infatti questo è il metodo che gli posso assegnare
type
  TForm1 = class(TForm)
    procedure FormClose(Sender: TObject; var Action: TCloseAction);   //<---
  [...]
in più volevo sprecare due paroline sulla creazione
a runTime di componenti d'interfaccia
(per essere eventualmente corretto)
E' sempre buono, imho, assegnare l'Owner alla creazione
button1 := TButton.Create(Self); //dove self sta per il form che lo contiene
poi assegnamo il Parent per una corretta
visualizzazione del componente
button1.parent := panel1;
//dove panel1 sta, per esempio,
//per il panel entro cui verrà visualizzato il bottone
  ciao
  Mak


 Ma questo non mi limita l'interazione dell'evento con altri componenti
della finestra che lo contiene?
Ossia se all'evento Onclick voglio ad esempio disabilitare una textbox...
come mi comporto?
Ciao
Denis

 textbox... come mi comporto?
Questo e' solo un problema di visibilita': nell'esempio che ho postato
basta sapere come si chiama l'istanza della form che contiene il
textbox. Comunque era solo un esempio fittizio: nella realta'
dichiarerei il metodo da usare come handler dell'evento nel TForm.
Saluti
Paolo Arosio


Ok. Adesso mi è già più chiaro.
Grazie
Denis De Pauli