Italian community of Lazarus and Free Pascal

Programmazione => Generale => Topic aperto da: petrusic - Settembre 13, 2022, 07:06:09 pm

Titolo: Puntamento alla title.caption di una colonna di StringGrid
Inserito da: petrusic - Settembre 13, 2022, 07:06:09 pm
Sto lavorando ad una StringGrid con diverse colonne. Premesso che la StringGrid ha una colonna ed 1 Riga fixed,
in fase di disegno delle singole colonne ho impostato la proprietà "Tile.Caption" col titolo di ciascuna colonna. Non potendo impostare, nello stesso momento, la Caption della cella di vertice della Colonna e Riga Fixed, ho comandato  l'impostazione da codice:
Codice: [Seleziona]
Form2.GridMovv.Cells[0,0]:= 'N.Pro';
.

Ora, in fase di Test del progetto ho voluto accertarmi del contenuto delle singole celle della griglia:
Codice: [Seleziona]
 for j:= 0 to (totCol) do
    begin
      WriteLn('Form2.GridMovv.Cells[' + IntToStr(j) + ',' + IntToStr(0) + ']= "' + Form2.GridMovv.Cells[j, 0]);
    end;               
  end;
Ecco la risposta:
Citazione

Form2.GridMovv.Cells[0,0]= "N.Pro
Form2.GridMovv.Cells[1,0]= "
Form2.GridMovv.Cells[2,0]= "
Form2.GridMovv.Cells[3,0]= "
Form2.GridMovv.Cells[4,0]= "
Form2.GridMovv.Cells[5,0]= "
Form2.GridMovv.Cells[6,0]= "
Form2.GridMovv.Cells[7,0]= "
Form2.GridMovv.Cells[8,0]= "
Form2.GridMovv.Cells[9,0]= "
Form2.GridMovv.Cells[10,0]= "
Form2.GridMovv.Cells[11,0]= "
Form2.GridMovv.Cells[12,0]= "
Form2.GridMovv.Cells[13,0]= "
Form2.GridMovv.Cells[14,0]= "
Form2.GridMovv.Cells[15,0]= "
Form2.GridMovv.Cells[16,0]= "
Form2.GridMovv.Cells[17,0]= "
Form2.GridMovv.Cells[18,0]= "
Tranne la cella di vertice, tutte le altre risultano vuote.

Però, se io ripeto l'estrazione dello stesso contenuto con:
Codice: [Seleziona]
for j:= 0 to (totCol - 1) do
     begin
       WriteLn('Form2.GridMovv.Columns[' + IntToStr(j) + '] "' + Form2.GridMovv.Columns[j].Title.Caption);
     end;                                                         
end;
ottengo:
Citazione
Form2.GridMovv.Columns[0]Title.Caption= "VOCE contabile di  CONTO  e"
Form2.GridMovv.Columns[1]Title.Caption= "SOTTOCONTO"
Form2.GridMovv.Columns[2]Title.Caption= "CAUSALE del movimento"
Form2.GridMovv.Columns[3]Title.Caption= "ENTRATE "
Form2.GridMovv.Columns[4]Title.Caption= "USCITE "
Form2.GridMovv.Columns[5]Title.Caption= "£/€"
Form2.GridMovv.Columns[6]Title.Caption= "BENEFICIARIO  o DEBITORE/CREDITORE"
Form2.GridMovv.Columns[7]Title.Caption= "Tipo di Contropartita ( N,S,P)"
Form2.GridMovv.Columns[8]Title.Caption= "formula dell'importo"
Form2.GridMovv.Columns[9]Title.Caption= "Codice Voce "movimgg""
Form2.GridMovv.Columns[10]Title.Caption= "Codice Voce di Contropartita"
Form2.GridMovv.Columns[11]Title.Caption= "STATUS Prestito"
Form2.GridMovv.Columns[12]Title.Caption= "Data Inizio Prestito"
Form2.GridMovv.Columns[13]Title.Caption= "Data Ultimo Movimento Prestito"
Form2.GridMovv.Columns[14]Title.Caption= "Data Solare "movimgg""
Form2.GridMovv.Columns[15]Title.Caption= "Ora Solare "movimgg""
Form2.GridMovv.Columns[16]Title.Caption= "ID di "movimgg""
Form2.GridMovv.Columns[17]Title.Caption= "ID di "partmovv" o "prestmom""

Come si notare, nonc'è più il contenuto della vella di vertice delle colonna e Riga Fixed,
mentre tutte le altre, contengono il titolo che ho impostato in fase di disegno.

Ciò indica, per es. che l'istruzione
Codice: [Seleziona]
 WriteLn('Form2.GridMovv.Cells[' + IntToStr(j) + ',' + IntToStr(0) + ']= "' + Form2.GridMovv.Cells[j, 0]);
non agisce sulla proprietà Title.Caption, altrimenti avrei ottenuto lo stesso valore  che ho ottenuto con l'istruzione
Codice: [Seleziona]
WriteLn('Form2.GridMovv.Columns[' + IntToStr(j) + '] "' + Form2.GridMovv.Columns[j].Title.Caption);

Sembrerebbe che  l'istruzione riferita alla proprietà Cells[col,Row], agisce come se ci fosse una proprietà Text.
Titolo: Re:Puntamento alla title.caption di una colonna di StringGrid
Inserito da: DragoRosso - Settembre 13, 2022, 07:54:43 pm

Ciò indica, per es. che l'istruzione
Codice: [Seleziona]
 WriteLn('Form2.GridMovv.Cells[' + IntToStr(j) + ',' + IntToStr(0) + ']= "' + Form2.GridMovv.Cells[j, 0]);
non agisce sulla proprietà Title.Caption, altrimenti avrei ottenuto lo stesso valore  che ho ottenuto con l'istruzione
Codice: [Seleziona]
WriteLn('Form2.GridMovv.Columns[' + IntToStr(j) + '] "' + Form2.GridMovv.Columns[j].Title.Caption);

Sembrerebbe che  l'istruzione riferita alla proprietà Cells[col,Row], agisce come se ci fosse una proprietà Text.

Per semplicità diciamo di definire una sola colonna con il "Title" a design time, lasciando che le "fixedrows" e le "fixedcols" siano a 1 : le proprietà

Codice: [Seleziona]
Form2.GridMovv.Cells[1, 0]
e
Codice: [Seleziona]
Form2.GridMovv.Columns[0].Title.Caption

devono riportare esattamente la stessa cosa: il contenuto (string) della cella [1,0]

EDIT: sunto, il tuo codice è giusto e il comportamento indicato è giusto. La Cells[0,0] e la Colums[0] non puntano alla stessa cella (se hai la "fixedcols" impostata ad un valore diverso da zero).

Ciao
Titolo: Re:Puntamento alla title.caption di una colonna di StringGrid
Inserito da: petrusic - Settembre 13, 2022, 10:06:20 pm

Per semplicità diciamo di definire una sola colonna con il "Title" a design time, lasciando che le "fixedrows" e le "fixedcols" siano a 1 : le proprietà

Codice: [Seleziona]
Form2.GridMovv.Cells[1, 0]
e
Codice: [Seleziona]
Form2.GridMovv.Columns[0].Title.Caption

devono riportare esattamente la stessa cosa: il contenuto (string) della cella [1,0]

Anch'io avevo la stessissima convinzione, ma il confronto di due writeln diverse sulla stessa cella della RowFixed mi dice che non è così
Citazione
Form2.GridMovv.Cells[1,0]= "     <--  è vuota
Form2.GridMovv.Columns[1]Title.Caption= "SOTTOCONTO"     <-- contiene questa string
Se la risultanza pratica è diversa dalla teoria , allora ci sono 2 possibilità:
1) la proprietà non è la stessa;
2) c'è un'anomalia nella gestione delle celle da parte del software gestionale di Lazarus.

Nella 2.a ipotesi bisognerebbe segnalarla.

Titolo: Re:Puntamento alla title.caption di una colonna di StringGrid
Inserito da: DragoRosso - Settembre 13, 2022, 10:23:49 pm
Forse non ci siamo capiti: CELLs[1,0] NON E' COLUMNS[1] ....... CORRISPONDE A COLUMNS[0]...... !!! (fermo restando quanto già detto nel mio post).

Codice: [Seleziona]
Form2.GridMovv.Cells[1,0]= "     <--  è vuota
Form2.GridMovv.Columns[1]Title.Caption= "SOTTOCONTO"     <-- contiene questa string
Se la risultanza pratica è diversa dalla teoria , allora ci sono 2 possibilità:
1) la proprietà non è la stessa;
2) c'è un'anomalia nella gestione delle celle da parte del software gestionale di Lazarus.
Nella 2.a ipotesi bisognerebbe segnalarla.
Titolo: Re:Puntamento alla title.caption di una colonna di StringGrid
Inserito da: petrusic - Settembre 14, 2022, 03:42:39 pm
Forse non ci siamo capiti: CELLs[1,0] NON E' COLUMNS[1] ....... CORRISPONDE A COLUMNS[0]...... !!! (fermo restando quanto già detto nel mio post).

Se Corrisponde a Columns[0], allora l'istruzione
Codice: [Seleziona]
 WriteLn('Form2.GridMovv.Cells[' + IntToStr(j) + ',' + IntToStr(0) + ']= "' + Form2.GridMovv.Cells[j, 0]);
avrebbe dovuto restituirmi:
Citazione
Form2.GridMovv.Cells[1,0]= "VOCE contabile di  CONTO  e"
invece mi restisuisce  "nil". Salvo che non mi si dimostri visivamente perchè il mio ragionamento è sbagliato, rimarrò fermo nella mia convinzione che Lazarus Free Pascal contiene una castroneria nella gestione delle righe e colonne fixed.

Titolo: Re:Puntamento alla title.caption di una colonna di StringGrid
Inserito da: Stilgar - Settembre 14, 2022, 06:22:28 pm

Codice: [Seleziona]
var
  idx, rowIdx: integer;
begin
  for idx := 0 to StringGrid1.ColCount - 1 do
    for rowIdx := 0 to StringGrid1.RowCount - 1 do
    begin
      StringGrid1.Cells[idx, rowIdx] := Format('%d,%d', [idx, rowIdx]);
      WriteLn('StringGrid1.Cells[', idx, ',', rowIdx, '] "', StringGrid1.Cells[idx, rowIdx], '"');
    end;


  for idx := 0 to StringGrid1.Columns.Count - 1 do
  begin
    WriteLn('StringGrid1.Columns[', idx, '] "', StringGrid1.Columns[idx].Title.Caption, '"');
  end;
  for idx := 0 to StringGrid1.ColCount - 1 do
  begin
    WriteLn('StringGrid1.Cell[', idx, ',0] "', StringGrid1.Cells[idx, 0], '"');
  end;
end; 


Stilgar
Titolo: Re:Puntamento alla title.caption di una colonna di StringGrid
Inserito da: nomorelogic - Settembre 14, 2022, 06:54:30 pm
direi di dare uno sguardo alla documentazione e partire da li
https://wiki.freepascal.org/Grids_Reference_Page#Grids_Reference (https://wiki.freepascal.org/Grids_Reference_Page#Grids_Reference)
cerca "property Columns"

Citazione
Custom columns add extra properties or replace default property values on normal grid columns. Not only this, the grid.ColCount value may increase or decrease in order to account for the number of custom columns being attached to the grid. At this point, this means that grid.ColCount = grid.FixedCols + grid.Columns.Count.
Titolo: Re:Puntamento alla title.caption di una colonna di StringGrid
Inserito da: petrusic - Settembre 15, 2022, 05:32:46 pm
@Stilgar
Ti ringrazio per il tentativo d'aiuto, ma le tue istruzioni d'esempio sono sostanzialmente uguali alle prove postate da me sulla mia StringGrid e confermano quanto ho affermato sopra:
il risultato di
Codice: [Seleziona]
 WriteLn('Form2.GridMovv.Cells[' + IntToStr(j) + ',' + IntToStr(0) + ']= "' + Form2.GridMovv.Cells[j, 0]);
è diverso da quello di:
WriteLn('Form2.GridMovv.Columns[' + IntToStr(j) + '] "' + Form2.GridMovv.Columns[j].Title.Caption);

@nomorelogic
Grazie per l'indirizzamento, ma quella guida l'ho letta e riletta, tuttavia non ho trovato alcuna indicazione sulla titolazione di una colonna in StringGrid.

Ho eseguito il seguente esempio:
Codice: [Seleziona]
//--------------------------------------- verifica contenuto GridMovv --------------------------------------------------------------------
  for j:= 1 to totRgGridMovv do
  begin
    for i:= 2 to (totCol) do
    begin
      Form2.GridMovv.Cells[i, j]:= Format('%d,%d', [i, j]);
    end;
  end;
  for j:= 0 to totRgGridMovv do
  begin
    for i:= 0 to (totCol) do
    begin
      WriteLn('Form2.GridMovv.Cells[' + IntToStr(i) + ',' + IntToStr(j) + ']= "' + Form2.GridMovv.Cells[i, j] + '"');
    end;
  end;
  for j:= 0 to (totCol) do
  begin
    WriteLn('Form2.GridMovv.Columns[' + IntToStr(j) + ']Title.Caption= "' + Form2.GridMovv.Columns[j].Title.Caption + '"');
  end;
    WriteLn('-----');
  for j:= 0 to (totCol - 1) do
  begin
    WriteLn('Form2.GridMovv.Cells[' + IntToStr(j) + ',' + IntToStr(0) + ']= "' + Form2.GridMovv.Cells[j, 0] + '"');
  end;
//---------------------------------------------------------- FINE verifica --------------------------------------------------------------------
ottenendo, come risultato:
Citazione
Form2.GridMovv.Cells[0,0]= "vertice"
Form2.GridMovv.Cells[1,0]= "col.1"
Form2.GridMovv.Cells[2,0]= ""
Form2.GridMovv.Cells[3,0]= ""
Form2.GridMovv.Cells[4,0]= ""
Form2.GridMovv.Cells[5,0]= ""
Form2.GridMovv.Cells[6,0]= ""
Form2.GridMovv.Cells[7,0]= ""
Form2.GridMovv.Cells[8,0]= ""
Form2.GridMovv.Cells[9,0]= ""
Form2.GridMovv.Cells[10,0]= ""
Form2.GridMovv.Cells[11,0]= ""
Form2.GridMovv.Cells[12,0]= ""
Form2.GridMovv.Cells[13,0]= ""
Form2.GridMovv.Cells[14,0]= ""
Form2.GridMovv.Cells[15,0]= ""
Form2.GridMovv.Cells[16,0]= ""
Form2.GridMovv.Cells[17,0]= ""
Form2.GridMovv.Cells[18,0]= ""
Form2.GridMovv.Cells[0,1]= ""
Form2.GridMovv.Cells[1,1]= ""
Form2.GridMovv.Cells[2,1]= "2,1"
. . .
Form2.GridMovv.Cells[16,49]= "16,49"
Form2.GridMovv.Cells[17,49]= "17,49"
Form2.GridMovv.Cells[18,49]= "18,49"
Form2.GridMovv.Columns[0]Title.Caption= "VOCE contabile di  CONTO  e"
Form2.GridMovv.Columns[1]Title.Caption= "SOTTOCONTO"
Form2.GridMovv.Columns[2]Title.Caption= "CAUSALE del movimento"
Form2.GridMovv.Columns[3]Title.Caption= "ENTRATE "
Form2.GridMovv.Columns[4]Title.Caption= "USCITE "
Form2.GridMovv.Columns[5]Title.Caption= "£/€"
Form2.GridMovv.Columns[6]Title.Caption= "BENEFICIARIO  o DEBITORE/CREDITORE"
Form2.GridMovv.Columns[7]Title.Caption= "Tipo di Contropartita ( N,S,P)"
Form2.GridMovv.Columns[8]Title.Caption= "formula dell'importo"
Form2.GridMovv.Columns[9]Title.Caption= "Codice Voce "movimgg""
Form2.GridMovv.Columns[10]Title.Caption= "Codice Voce di Contropartita"
Form2.GridMovv.Columns[11]Title.Caption= "STATUS Prestito"
Form2.GridMovv.Columns[12]Title.Caption= "Data Inizio Prestito"
Form2.GridMovv.Columns[13]Title.Caption= "Data Ultimo Movimento Prestito"
Form2.GridMovv.Columns[14]Title.Caption= "Data Solare "movimgg""
Form2.GridMovv.Columns[15]Title.Caption= "Ora Solare "movimgg""
Form2.GridMovv.Columns[16]Title.Caption= "ID di "movimgg""
Form2.GridMovv.Columns[17]Title.Caption= "ID di "partmovv" o "prestmom""

Mi pare importante la differerenza di contenuto, ottenuta nella Form2.GridMovv.Cells[1,0]
Citazione
Form2.GridMovv.Cells[1,0]= "col.1"
Form2.GridMovv.Columns[0]Title.Caption= "VOCE contabile di  CONTO  e"
Se puntare alla Cella[1.0] con Form2.GridMovv.Cells[1,0] fosse UGUALE a Form2.GridMovv.Columns[0]Title.Caption, avrei dovuto leggere sempre la stessa stringa, cioè "col.1", ultima inserita.

Anche l'immagine parziale sulla vista della StringGrid mostra, per la col.1 , il titolo impostato in fase di disegno.
Titolo: Re:Puntamento alla title.caption di una colonna di StringGrid
Inserito da: DragoRosso - Settembre 15, 2022, 06:24:22 pm
Vediamo se riesco a spiegare la cosa in poche righe.

Come dice l'articolo citato da @NomoreLogic, il componente TGridColumn sostituisce alcune funzionalità della griglia. Le sostituisce e fornisce nuovi metodi e proprietà e un editor aggiuntivo (ad esempio per selezionare il contenuto della cella da una lista).

1) Il TITLE (quello che viene renderizzato a video) di una COLUMNS è accessibile SOLO ED ESCLUSIVAMENTE tramite la proprietà Ttile.Caption della COLUMNS. Non si può accedere dalla proprietà Cells della griglia.

2) Il resto delle righe invece è accessibile da Cells.

3) Per accedere alla prima riga (cella) NOT FIXED della prima colonna di una StringGrid, sempre che si abbia 1 riga e 1 colonna fixed si accede tramite Cells[1,1].

La Cells[1,0] nonostante sia accessibile (in read e write) non viene renderizzata in quanto il componente TGridColumn semplicemente si sovrappone   (per farla semplice).

PER ACCEDERE nelle righe sotto la COLUMNS[0] devi ciclare con Cells[1, riga]

Ciao
Titolo: Re:Puntamento alla title.caption di una colonna di StringGrid
Inserito da: Stilgar - Settembre 15, 2022, 06:37:39 pm
petrusc.
La "demo" serviva a tagliare la testa al toro.


Puoi mettere quello che vuoi ma la prima riga, se imposti le colonne, viene renderizzata con le informazioni impostate sulle colonne.


Se vuoi gestirti tutto da codice, o sincronizzi le column con il contenuto delle cells[].


In ogni caso sono comportamenti noti e non ci sono errori.


Stilgar
Titolo: Re:Puntamento alla title.caption di una colonna di StringGrid
Inserito da: petrusic - Settembre 15, 2022, 09:57:54 pm
Si, la gestione non è affatto lineare ed io, in ogni nuova StringGrid che devo mettere sul campo, mi ingarbuglio sempre.
Comunque, oggi ho chiarito alcuni punti non chiari, tra puntamenti tramite la proprietà cells, cols, columns e colonna fixed (iniziale).
Spero di trovarmi meglio in futuro.
Grazie a tutti.