Italian community of Lazarus and Free Pascal

Programmazione => Generale => Topic aperto da: mecoman - Aprile 02, 2015, 06:46:00 pm

Titolo: Creare StringGrid da runtime
Inserito da: mecoman - Aprile 02, 2015, 06:46:00 pm
Ciao a tutti. Come da titolo ho la necessità di creare una tabella da runtime ma ho qualche difficoltà e spero che qualcuno possa aiutarmi. Questo è il codice che ho scritto.

Codice: [Seleziona]
procedure TForm1.Button1Click(Sender: TObject);
var
  i: integer;
  tabella: array [1..9] of TStringGrid;
begin

  for i:= 1 to 3 do
  begin

    // CREAZIONE GENERALE TABELLA

    tabella[i]:= TStringGrid.Create(Form1);
    tabella[i].Width:= 300;
    tabella[i].Height:= 200;
    tabella[i].top:= 50;
    tabella[i].left:= 30;
    tabella[i].FixedCols:= 0;

    // CREAZIONE COLONNE

    tabella[i].Columns.Add.Title.Create(0)  // ERRORE!!!!!!
    tabella[i].Columns.Add.Title.Alignment:= taCenter;
    tabella[i].Columns.Add.Title.Caption:=('colonna0');
    tabella[i].Columns.Add.Title.Alignment:= taCenter;
    Tabella[i].Parent:= Form1;
  end;
end;

E' da un po che ci sto sopra e non capisco perché mi da errore quando mi deve creare la prima colonna della tabella.
Spero che qualcuno possa aiutarmi. Ciao.
Titolo: Re:Creare StringGrid da runtime
Inserito da: nomorelogic - Aprile 02, 2015, 06:54:24 pm
usa questo codice per iniziare

Codice: [Seleziona]
  procedure TForm1.Button1Click(Sender: TObject);
  var
    i: integer;
    tabella: array [1..9] of TStringGrid;
  begin

    for i:= 1 to 3 do
    begin

      // CREAZIONE GENERALE TABELLA

      tabella[i]:= TStringGrid.Create(Form1);
      tabella[i].Width:= 300;
      tabella[i].Height:= 200;
      tabella[i].top:= 50;
      tabella[i].left:= 10 + ((i-1) * 320);
      tabella[i].FixedCols:= 0;

      // CREAZIONE COLONNE
      with tabella[i] do
         try
            Parent:= Form1;
            with Columns.Add do begin
               Title.Alignment:= taCenter;
               Title.Caption:='colonna0';
            end;
         except
            on e: exception do
              MessageDlg(Application.Title, 'Errore nella creazione della griglia ' + IntToStr(i) + #10 +
                         e.Message,
                         mtError, [mbOk], 0);
         end;

    end;
  end;
Titolo: Re:Creare StringGrid da runtime
Inserito da: Stilgar - Aprile 02, 2015, 07:13:27 pm
Ciao
Ti stai scontrando con la creazione legata alle collection.
Le collection prevedono di crearsele da sole le varie istanze delle collectionitem.

Nel tuo codice avresti creato, tre colonne, dove ad ogni una avresti assegnato solo un attributo.
Con il codice di nomore, ottieni di non dichiarare la variabile di lavoro e applichi gli attributi allo stesso oggetto.

Sempre nell'esempio di nomore ti incolonna le tabelle e lascia uno spazio di 20 pixel da una griglia all'altra ;)

Stilgar
Titolo: Re:Creare StringGrid da runtime
Inserito da: mecoman - Aprile 03, 2015, 11:14:05 am
Ciao a tutti. Grazie per le risposte.

Ho provato il codice di nomore ed ottengo come risultato 3 tabelle con una colonna (è quello che aveva già predetto stilgar).

Quello che devo ottenere io è una tabella con 3 colonne e non 3 tabelle con una colonna. :'(

Ciao
Titolo: Re:Creare StringGrid da runtime
Inserito da: nomorelogic - Aprile 03, 2015, 12:07:45 pm
lo so che vengono generate 3 griglie ma è la stessa cosa che accadeva sul tuo codice, solo che non te ne accorgevi perché graficamente erano sovrapposte ;)

Se inserisci TStringGrid.Create in un loop, è chiaro  che ad ogni passaggio ne crei 1.
Devi quindi creare la griglia prima del loop ed all'interno crei lo colonne.

Inoltre con la dichiarazione:
Codice: [Seleziona]
tabella: array [1..9] of TStringGrid;
allochi un array di 9 posizioni per 9 griglie...

Dovresti modificare il codice considerando che:
- hai bisogno di un solo puntatore per la griglia
- la griglia va creata fuori dal loop
- l'array delle colonne non serve (la griglia sa di quante colonne dispone)

Titolo: Re:Creare StringGrid da runtime
Inserito da: mecoman - Aprile 03, 2015, 02:52:33 pm
Ciao nomorelogic. Grazie per i consigli.

Adesso provo a metterli in pratica e spero di riuscire a risolvere il mio problema. In caso contrario torno sul forum. Ciao. :)