Newsgroup: it.comp.lang.delphi
Titolo: trovare componenti creati a runtime

salve ragazzi,
sto creando un nuovo progetto che crea dinamicamente dei pulsanti in una 
scrollbox
dm.qryCategorie.Open;
          somma := 0;
          while not dm.qryCategorie.Eof do
          begin
               button:=TButton.Create(scrollbox0);
               button.Parent := scrollbox0;
               button.Visible := true;
               button.Caption := dm.qryCategorieCATEGORIA.Value;
               button.Top := somma;
               button.Width := 115;
               button.height := 50;
               button.tag := dm.qryCategoriePK_CATEGORIA.Value;
               button.Font.Size := 12;
               somma := somma + 51;
               button.OnClick := ClickCategorie;
               dm.qryCategorie.next;
          end;
e fin qui tutto bene, solo che se vado a cercare con una ricerca tramite 
  un ciclo su form.component i tasti non vengono trovati...
come mai?

 ciclo su form.component i tasti non vengono trovati...
Da quel che hai scritto i bottoni li assegni allo scrollbox, il form 
non li troverï¿œ mai tra i suoi controlli! Quindi dovresti fare il for su 
tscrollbox.componentcount
Ciao
-- 
Morde

  un ciclo su form.component i tasti non vengono trovati...
Oltre al suggerimento giï¿œ fornito da Morde, io valuterei l'inserimento 
dei riferimenti ai controlli creati a runtime in una lista.
Se hai una versione recente di Delphi, puoi anche sfruttare i Generics 
per creare una lista
    TMyButtonList = class (TList<TButton>);
oppure ricorrere a un *TDictionary*, se puoi identificare in modo 
univoco i pulsanti, altrimenti costruisci una normale *TList*.
Tenendo i riferimenti in una lista separata, non devi ogni volta 
scorrere i riferimenti di altri controlli eventualmente inseriti nel 
Form e presenti nelle proprietï¿œ "Components" e "Controls", a seconda 
della modalitï¿œ scelta per catalogarli e individuarli.
Ciao,
   Marco.
-- 
MARCO BREVEGLIERI
  (
http://www.marco.breveglieri.name
)

Marco Breveglieri ha scritto:

la versione di delphi ï¿œ la 2009 quindi si ï¿œ recente ma sta cosa non l'ho 
mai fatta qualche esempio da cui vedere?

 mai fatta qualche esempio da cui vedere?
Questo dichiara una classe che gestisce una lista di istanze TButton:
 TMyButtonList = class (TList<TButton>);
Se al posto di TButton scrivessi TPippo gestirebbe una lista di
istanze TPippo.
Nel primo caso, se crei una lista usando quella classe, la property
item[x] restuituisce un TButton:
MyList := TMyButtonLis.Create;
...
MyButton := MyList[0]; //MyButton è ovviamente di tipo TButton
In pratica, non devi scrivere TU il codice per castare un TOBject al
tipo che ti serve.
Altri riferimenti gia sai dove trovarli.
A.

 
grazie alberto credo percorr� questa strada.. :)

 mai fatta qualche esempio da cui vedere?
C'ï¿œ un tutorial fantastico e completo qui:
http://bit.ly/2UEvYl
Brevemente, puoi aggiungere al tuo Form un nuovo campo:
   FButtons: TList<TButton>;
Nel metodo costruttore (Create) del Form, crei un'istanza della lista:
   FButtons := TList<TButton>.Create();
Nel metodo distruttore (Destroy), la deallochi:
   if FButtons <> nil then
     FreeAndNil(FButtons);
Quando crei i pulsanti a runtime, accertati di attribuire loro un 
"owner", cioï¿œ il riferimento al componente responsabile della loro 
distruzione (il Form o la ScrollBox, cosï¿œ come hai fatto, direi che va 
bene).
Creato il pulsante, aggiungi il riferimento alla lista:
   NewButton := TButton.Create(Self);
   // ...
   FButtons.Add(NewButton);
Se vuoi fare un ciclo sui pulsanti inseriti all'interno della lista, 
puoi tranquillamente usare una scrittura del tipo
   var
     Button: TButton;
   begin
     for Button in FButtons do
     begin
       // ... operazioni sul singolo pulsante...
     end;
   end;
Si tratta ovviamente di stralci di codice a puro titolo esemplificativo: 
li ho scritti direttamente nel messaggio, non li ho verificati nï¿œ 
compilati, ma dovrebbero essere sufficienti a rendere l'idea. :)


      begin
azz! hanno aggiunto anche una cosa tipo foreach??
:-D
A.

 azz! hanno aggiunto anche una cosa tipo foreach??
Questa c'era gi� da qualche tempo, per� con i Generics viene 
particolarmente utile perch� non � pi� necessario costruirsi classi 
personalizzate per implementare delle "liste tipizzate" e nemmeno i 
"cast". :)


Marco Breveglieri ha scritto:

ciao marco, sei sempre molto disponibile ed esaustivo grazie :)

 ciao marco, sei sempre molto disponibile ed esaustivo grazie :)
Prego, ma... occhio al "quoting". :)
http://bit.ly/ly3R2


 
ai ragione ho il brutto vizio di non tagliare un tubo...

  TMyButtonList = class (TList<TButton>);
	provato a scrivere:
type
	TmybuttonList = class (Tlist<tbutton>);
end;
ma mi da errore sul tList

 ma mi da errore sul tList
E' come andare dal dottore e dire "sto male"... ;)
Che errore ti da?


 
il Tlist sottolinato in rosso se compilo
[DCC Error] UntPrincipale.pas(140): E2003 Undeclared identifier: 'TList<>'

 [DCC Error] UntPrincipale.pas(140): E2003 Undeclared identifier: 'TList<>'
Hai aggiunto la unit "Generics.Collections" alla clausola *uses*?


 
ovviamente no... grazie :)

allora ragazzi tutto funziona e grazie a voi, adesso avrei una domanda 
in piï¿œ (l'appetito vien mangiando) se alla mia nuova classe volessi 
aggiungere una proprietï¿œ come devo fare? ad esempio
mybuttonlist.usato = true/false
grazie sempre :)

 proprietï¿œ come devo fare? ad esempio
Un ripassino ai fondamentali di OOP ?
http://delphi.about.com/od/course/a/oop_intro.htm
Prima di porre le domande sul ng, abituati a ricercare la risposta da 
te.
Non voglio fare il bacchettone, ma guidarti a trovare un tuo percorso 
di crescita che non sia "come faccio a fare il cioccolato" ma piuttosto 
"dove trovo le ricette per fare il cioccolato?" e un domani "facendo il 
cioccolato ho avuto questo problema, secondo voi come potrei 
risolverlo?"
Ciao
-- 
Morde

C_thelegend ha scritto:

Invece di creare una lista di TButton, crei una lista di oggetti che 
appartengono ad una classe realizzata da te e che prevedono, oltre ad un 
campo che contiene il riferimento del TButton interessato, anche altri 
campi volti a memorizzare tutte le informazioni che vuoi.
I campi fondamentali li puoi inizializzare attraverso il costruttore 
della classe che vai a scrivere.
Se tutti questi termini ti sono oscuri, allora devi approfondire 
l'argomento per evitare di andare per tentativi, ipotizzando un 
determinato funzionamento delle cose che in realtï¿œ non ï¿œ quello 
effettivo, e chiedere ogni singolo step al gruppo di discussione.
In breve, il gruppo puï¿œ servire per un aiuto, ma non ï¿œ sostitutivo allo 
studiare, al documentarsi e al provare direttamente. :)
Ciao,
   Marco.


 cioccolato ho avuto questo problema, secondo voi come potrei risolverlo?"
Ottima similitudine... la riciclerï¿œ senz'altro in altri spazi. :)


 Ottima similitudine... la riciclerï¿œ senz'altro in altri spazi. :)
GOLOSONE..!! :-P
LOL
-- 
Morde

Morde ha scritto:

purtoppo di OOP fino ad adesso solo teoria, adesso il lavoro che sto 
seguendo ne necessita e quindi sto provando, non essendoci riuscito 
chiedevo, comunque ripasso cosï¿œ magari capisco qualcosa di nuovo dovuto 
alla necssitï¿œ
grazie :)