Newsgroup: it.comp.lang.delphi
Titolo: Problema con PageControl e Controlli a runtime

Salve a tutti ho questo problema, io creo in maniera dinamica delle TabSheet
e gli aggiungo una StringGrid con il seguente codice:
  with TTabSheet.Create(Self) do
  begin
    PageControl:=pagePC;
    Caption:='Pag'+IntToStr(pagePC.PageCount);
    sg:=TStringGrid.Create(Self);
    InsertControl(sg);
  end;
Il mio problema e' adesso dovrei prendere in maniera dinamica la StringGrid
posizionato sul tab corrente, ma non riesco a capire come. Ho provato cosi':
stringgrid:=pagePC.ActivePage.Components[0] As TStringGrid;
Qualcuno mi sa' dire come posso risolvere questo problema, se per caso
sbaglio nel creare a runtime il TabSheet e ad associargli la relativa
StrigGrid, oppure il metodo per poter selezionare il controllo in questione.
Grazie
Alan Serpini

 stringgrid:=pagePC.ActivePage.Components[0] As TStringGrid;
Forse non ho capito bene il tuo problema ma se devi avere la
TStringGrid con il focus attivo dopo averla creata puoi aggiungere al
tuo codice:
with TTabSheet.Create(Self) do
  begin
    PageControl:= PC;
    Caption:='Pag'+IntToStr(PC.PageCount);
    sg := TStringGrid.Create(Self);
    InsertControl(sg);
//^^^^^^^^^^^^^^^^^^^^^^^^
    ActiveControl := sg;
//^^^^^^^^^^^^^^^^^^^^^^^^
  end;
end; 
guastatore

Il problema non e' come attivarlo, ma in un secondo momento come posso fare
a prenderlo in maniera dinamica. Esempio, ogni tab creata ha un solo
componente su di essa (StringGrid), io devo prendere la StringGrid sul tab
corrente e poi fare le dovute operazioni.
Grazie
Alan Serpini



Prova cosě:
  for i := 0 to ComponentCount - 1 do
    if (Components[i] is TStringGrid) then
      if TStringGrid(Components[i]).Parent = TABCONTROLATTUALE then
      begin
        sgridtabcontrolcorrente := TStringGrid(Components[i]);
        ..
      end;
Ricordati solo di impostare, in fase di creazione della StringGrid, la sua
property Parent al TabControl che la contiene, altrimenti la soluzione non
funziona.
Saluti
	Marco Bortolani
	info @ 
marcobortolani.it
P.S.
Per velocizzare un po' il ciclo potersti impostare anche ciascun owner
delle tue StringGrid al TabControl che la contiene, per poter utilizzare il
ciclo "ridotto":
  for i := 0 to TABCONTROLATTUALE.ComponentCount - 1 do
    if (TABCONTROLATTUALE.Components[i] is TStringGrid) then
    begin
      sgridtabcontrolcorrente := 
          TStringGrid(TABCONTROLATTUALE.Components[i]);
      ..
    end;
Tutto ciň implica perň che ti ricordi anche di gestire la distruzione degli
oggetti, ma forse poichč l'owner dei TabControl č il form magari ci pensa
lui a distruggere anche le StringGrid... magari controlla!

Utilizzo questo codice per creare la TabSheet e la StringGrid:
  tabsheet:=TTabSheet.Create(Self);
  tabsheet.PageControl:=pagePC;
  tabsheet.Caption:='Pag'+IntToStr(pagePC.PageCount);
  sg:=TStringGrid.Create(Self);
  tabsheet.InsertControl(sg);
  sg.Parent:=tabsheet;
  pagePC.ActivePage:=pagePC.Pages[pagePC.PageCount-1];
Pero' se provo a vedere il numero di componenti sul tab corrente con la
propieta'
pagePC.ActivePage.ComponentCount
Mi risulta essere uguale a ZERO, cosa impossibile da come ho inizializzato i
vari controlli.
Avete delle spiegazioni?
Ciao
Alan Serpini

 pagePC.ActivePage.ComponentCount
Non ho avuto il tempo di controllare il tuo codice, però a questo punto
non potrebbe andare bene una TList in cui memorizzare i puntatori delle
varie StringGrid ? IN questo caso potresti avere un'associazione tra il
numero di pagina ed il riferimento dell'Item nella TList e dover fare
solo un casting del puntatore, qualcosa del genere:
TStringGrid(MyList.Items[0]).Cells[1,1] := 'Antonio';
Ovviamente quando crei la StringGrid devi aggiungerla alla lista: 
MyList.Add(sg);
Ciao
guastatore

 Alan Serpini
-- 
Ciao, Anto', [37, 143, AQ] 
MB C SC 220 CDI Magma Rot
"Oggi c'è una grande battaglia di idee, ma alla 
fine, non ci saranno ne vinti, ne vincitori, ne idee!"
S. Benni da Elianto

 vari controlli.
E' ovvio: pagePC.ActivePage.ComponentCount conta i controlli "posseduti"
dalla tua ActivePage, ma tu nella creazione hai impostato come owner della
stringgrid il form (Self indica l'oggetto corrente -> se scrivi un metodo
che estende TForm1, l'oggetto corrente è l'istanza di TForm1 e quindi il
form vero e proprio).
Prova infatti a visualizzare il numero di oggetti del form prima e dopo la
creazione della stringgrid, e vedrai che questi aumentano di 1:
  ShowMessage(IntToStr(pagePC.ActivePage.ComponentCount));
  .. // CREAZIONE
  ShowMessage(IntToStr(pagePC.ActivePage.ComponentCount));


Sono riuscito a risolvere il problema, il tutto era dovuto al fatto di come
creavo la StringGrid prima di aggiungerla alla TabSheet:
  sg:=TStringGrid.Create(Self);
deve essere modificata come:
  sg:=TStringGrid.Create(tabsheet);
Cosi' ho risolto tutti i miei problemi.
Grazie a tutti.
Alan Serpini

> stringgrid:=pagePC.ActivePage.Components[0] As TStringGrid;
Prova ad iterare su tutti i suoi componenti (della Tab):
With PagePC.ActivePage do
    for n:=0 to Components.count-1 do
        if Components[n] is TStringGrid then
            ....
giorgio