Newsgroup: it.comp.lang.delphi
Titolo: Component[array]

Come riesco a gestire tale proprieta'? Nel senso: come faccio a sapere
a chi corrisponde Form1.components[3] ? Inolte ogni oggetto
appartenente al form ha tale proprieta. Come interagisce con il
component del form? L'array e' lo stesso per ogni oggetto? 
Guybrush

"Guybrush":

Components e' un array di puntatori a TComponent.
ad esempio se vuoi fare qualcosa con i TButton di una form, potresti fare:
for I := 0 to componentsCount-1 do begin
 if (Component[i] is TButton)
  then begin
   TButton(Component[i]).Caption:='Sono un TButton';
   ....
  end;
end;
Ciao :)
Alan Solo

   TButton(Component[i]).Caption:='Sono un TButton';
OK ci sono ;-)
Ma sorgono nuove domane:
a) In che ordine sono messi i puntatori in
Form1.components[index]?Esiste una tabella che mi dici come sono
messi?
b) Perche' anche gli altri componenti (oltre il form) hanno tale array
di componenti (components[array])? Ad esempio un Edit1.components[0] a
che potrebbe puntare?
c) Mettimo abbia un Form,2 Edit,1 button.
   il form1.components[0] e' edit1
   components[1] e' l'edit2
  e components[2] e il button
Se provo a scrivere  Tedit(components[2]).text:='ciao'
 non mi viene dato l'errore anzi sul bottone viene scritto 'ciao'...
 com'e' possibile?
Guybrush

"Guybrush":
| a) In che ordine sono messi i puntatori in
| Form1.components[index]?Esiste una tabella che mi dici come sono
| messi?
non ne ho idea, probabilmente nell'ordine di creazione.
...pero' quando si mettono sulla form a design time in quale
ordine sono? (forse nell'ordine in cui sono scritti nel dfm(??)..)
| b) Perche' anche gli altri componenti (oltre il form) hanno tale array
| di componenti (components[array])?
perche' components e' una proprieta' di TComponent,
percio' tutti i suoi figli la ereditano (quindi la stragrande maggioranza
degli oggetti VCL, visto che TComponent si trova solo al
terzo "scalino" TObject <- TPersistent <- TComponent)
| Ad esempio un Edit1.components[0] a
| che potrebbe puntare?
components e' un array di puntatori che puntano
agli oggetti posseduti, in pratica agli oggetti di cui l'oggetto
in questione ne e' l'owner
(penso che questa proprieta' venga sfruttata internamente da Delphi
per gestire (non solo) la distruzione degli oggetti figli quando
viene chiamato il proprio distruttore)
volendo, potresti passare come owner al costruttore di un TEdit un TButton:
Button := TButton.Create(Edit);
in questo caso Edit diventa l'owner di Button e Button si trova
nell'array components di Edit
(se e' il primo probabilmente Edit.Components[0] e Button puntano allo
stesso oggetto)
| c) Mettimo abbia un Form,2 Edit,1 button.
|    il form1.components[0] e' edit1
|    components[1] e' l'edit2
|   e components[2] e il button
| Se provo a scrivere  Tedit(components[2]).text:='ciao'
|  non mi viene dato l'errore anzi sul bottone viene scritto 'ciao'...
|  com'e' possibile?
in effetti e' un po' strano, o meglio direi che il compilatore
e' talmente furbo che ha visto che text e' una proprieta'
di TControl, quindi puo' andar bene sia per un TEdit e che per un TButton
(entrambi ereditati da quest'ultimo)
prova a fare ad es.
TEdit(components[2]).MaxLength:=0;
e vedi che non funziona, infatti MaxLength e' una proprieta'
"esclusiva" di TCustomEdit e non di TButton.
coma al solito, spero di non aver detto vaccate...
Ciao, :)
Alan Solo