Italian community of Lazarus and Free Pascal

Programmazione => Generale => Topic aperto da: petrusic - Aprile 29, 2022, 05:23:44 pm

Titolo: stringGrid Celle particolari
Inserito da: petrusic - Aprile 29, 2022, 05:23:44 pm
Durante le prove di produzione di una StringGrid con righe di testa, di fine e di dettaglio, mi sono imbattuto in un inaspettato cambio di Font, come si può vedere nell'immagine allegata.
Come faccio di solito, le righe di testa o di fine di una mia StringGrid presentano le loro celle con colori di fondo e di testo diversi dalle righe di dettaglio ed a volte anche con uno style di tipo Bold.

Nella StringGrid attuale ho utilizzato per le singole celle il Font Noto Mono grande 11 e di stile Regolare

Dentro l'evento OnDrawCell ho intercettato quello relativo ad alcune celle dellle righe di Testa e di Fine della StringGrid per impostare uno stile Bold del Testo ed un colore diverso per lo sfondo ed testo:
Codice: [Seleziona]
procedure TForm6.GridStmpDrawCell(Sender: TObject; aCol, aRow: Integer;
  aRect: TRect; aState: TGridDrawState);
type
  Tsfondo = TColor;

const
  grigio: Tsfondo = clGray;

var
  lun: Integer;
  ixRg: Integer = 0;

  cellaSel: String;

  allin : TTextStyle;    // tipo di allineamento

begin
  if (aRow >= 1) then
  begin
    case aCol of
      2, 3, 4, 5:
        begin
          cellaSel:= GridStmp.Cells[aCol, aRow];  // punta alla casella selezionata
          ixRg:= aRow;
          if (GridStmp.Cells[1, aRow] = '') and (GridStmp.Cells[3, aRow] = '') and (GridStmp.Cells[4, aRow] = '') then
          begin
              lun:= GridStmp.Canvas.TextWidth(cellaSel);  // determina la lunghezza del testo presente nella casella
              allin.Alignment:= taLeftJustify;
              GridStmp.Canvas.FillRect(aRect);
              GridStmp.Canvas.Font.Style:= [fsBold];
              GridStmp.Canvas.Font.Color:= clBlack;  // colora il testo
              GridStmp.Canvas.Font.Height:= 14;
              GridStmp.Canvas.TextRect(aRect, aRect.Left + 2, aRect.Top + 6, CellaSel, allin);    // riscrive il testo nella casella
          end
          else begin
            if (GridStmp.Cells[2, aRow] = 'TOT.Sottoconto')  or (GridStmp.Cells[2, aRow] = 'TOTALI Conto') or (GridStmp.Cells[2, aRow] = 'T O T A L I') then
            begin
              lun:= GridStmp.Canvas.TextWidth(cellaSel);  // determina la lunghezza del testo presente nella casella
              allin.Alignment:= taRightJustify;
              GridStmp.Canvas.Brush.Color := grigio;
              GridStmp.Canvas.FillRect(aRect);
              GridStmp.Canvas.Font.Style:= [fsBold];
              GridStmp.Canvas.Font.Color:= clWhite;  // colora il testo
              GridStmp.Canvas.Font.Name:= 'Noto Mono';
              GridStmp.Canvas.Font.Height:= 14;
              GridStmp.Canvas.TextRect(aRect, aRect.Right + 12, aRect.Top + 2, CellaSel, allin);    // riscrive il testo nella casella
            end;
          end;
        end;
    end;
  end;
end;

Ebbene in tutte le celle interessate mi sono ritrovato il Font diverso da quello che avevo impostato io nella fase di disegno della StringGrid, con conseguente disallineamento dei valori monetari presenti nelle righe di dettaglio.

Ho provato a reimpostarlo da codice, dentro l'evento OnDrawCell, ma non ci sono riuscito.
Mi potreste illuminare in proposito?
Titolo: Re:stringGrid Celle particolari
Inserito da: bonmario - Aprile 29, 2022, 07:48:40 pm
Ebbene in tutte le celle interessate mi sono ritrovato il Font diverso da quello che avevo impostato io nella fase di disegno della StringGrid, con conseguente disallineamento dei valori monetari presenti nelle righe di dettaglio.

Quale delle 2:
- nel sorgente non hai più il Font che avevi impostato tu?
- il font nel sorgente è ok, ma in esecuzione vedi un altro font?

P.S Dallo screenshot, mi sembra di capire che usi Ubuntu. In questi giorni, è uscito l'aggiornamento per passare dalla 21.10 alla 22.04 di Ubuntu. Per caso hai fatto questo aggiornamento?
Lo chiedo, perché in passato mi è capitato che un aggiornamento cancellasse completamente o parzialmente dei Font, ed avevo risolto reinstallandoli ... anche se non ricordo come !!!

Ciao, Mario
Titolo: Re:stringGrid Celle particolari
Inserito da: petrusic - Aprile 29, 2022, 10:30:39 pm
P.S Dallo screenshot, mi sembra di capire che usi Ubuntu. In questi giorni, è uscito l'aggiornamento per passare dalla 21.10 alla 22.04 di Ubuntu. Per caso hai fatto questo aggiornamento?
Si, sto usando Ubuntu, ma NON ho aggiornato alla 21.10.

Citazione da: bonmario
Quale delle 2:
- nel sorgente non hai più il Font che avevi impostato tu?
- il font nel sorgente è ok, ma in esecuzione vedi un altro font?
La seconda. Nell'allegato che ho inserito nel mio post d'apertura è visibile come il font è cambiato nelle righe dove sono intervenuto per impostare:
-  lo stile Bold nella prima riga ;
-  lo stile Bold ed il colore dello sfondo nelle ultime due righe.

Le righe di dettaglio hanno il Font impostato nella fase di disegno della StringGrid.
Titolo: Re:stringGrid Celle particolari
Inserito da: DragoRosso - Aprile 30, 2022, 12:10:08 am
Ti rispondo veloce perchè sono KO.

Quando assegni un font alla Canvas, non puoi definirlo solo in qualche cella .... l'ultima assegnazione rimane anche quella che verrà usata nelle celle in cui non viene "definito" e che verranno successivamente "disegnate", ma quelle precedenti avranno il font di default definto nel componente.

Se definisci il Font.Name per qualche cella, allora lo devi definire anche in TUTTE le altre celle, perchè non sai la canvas con che sequenza "disegnerà" le celle.

Spero ti possa aiutare questo consiglio.
Ciao
Titolo: Re:stringGrid Celle particolari
Inserito da: petrusic - Aprile 30, 2022, 05:26:05 pm
Se definisci il Font.Name per qualche cella, allora lo devi definire anche in TUTTE le altre celle, perchè non sai la canvas con che sequenza "disegnerà" le celle.

Ho seguito il tuo consiglio:
Codice: [Seleziona]
procedure TForm6.GridStmpDrawCell(Sender: TObject; aCol, aRow: Integer;
  aRect: TRect; aState: TGridDrawState);
type
  Tsfondo = TColor;

const
  grigio: Tsfondo = clGray;

var
  lun: Integer;
  ixRg: Integer = 0;

  cellaSel: String;

  allin : TTextStyle;    // tipo di allineamento

begin
  WriteLn('TForm6.GridStmpDrawCell');
  if (aRow >= 1) then
  begin
    case aCol of
      2, 3, 4, 5:
        begin
          cellaSel:= GridStmp.Cells[aCol, aRow];  // punta alla casella selezionata
          ixRg:= aRow;
          if (GridStmp.Cells[1, aRow] = '') and (GridStmp.Cells[3, aRow] = '') and (GridStmp.Cells[4, aRow] = '') then
          begin
              lun:= GridStmp.Canvas.TextWidth(cellaSel);  // determina la lunghezza del testo presente nella casella
              allin.Alignment:= taLeftJustify;
              GridStmp.Canvas.FillRect(aRect);
              GridStmp.Canvas.Font.Style:= [fsBold];
              GridStmp.Canvas.Font.Color:= clBlack;  // colora il testo
              GridStmp.Canvas.Font.Name:= 'Noto Mono';
              GridStmp.Canvas.TextRect(aRect, aRect.Left + 2, aRect.Top + 6, CellaSel, allin);    // riscrive il testo nella casella
          end
          else begin
            if (GridStmp.Cells[2, aRow] = 'TOT.Sottoconto')  or (GridStmp.Cells[2, aRow] = 'TOTALI Conto') or (GridStmp.Cells[2, aRow] = 'T O T A L I') then
            begin
              lun:= GridStmp.Canvas.TextWidth(cellaSel);  // determina la lunghezza del testo presente nella casella
              allin.Alignment:= taRightJustify;
              GridStmp.Canvas.Brush.Color := grigio;
              GridStmp.Canvas.FillRect(aRect);
              GridStmp.Canvas.Font.Style:= [fsBold];
              GridStmp.Canvas.Font.Color:= clWhite;  // colora il testo
              GridStmp.Canvas.Font.Name:= 'Noto Mono';
              GridStmp.Canvas.TextRect(aRect, aRect.Right + 12, aRect.Top + 2, CellaSel, allin);    // riscrive il testo nella casella
            end;
          end;
        end;
    end;
  end;
end;
Nonostante la modifica in entrambi i rami dell'evento, puoi constatare che il Font.Name impostato da codice viene assolutamente ignorato. Ho provato anche a non impostare alcun Font.Name ed il risultato è sempre lo stesso: Quando viene impostato, tramite canvas, lo stile Bold, il Font.Name cambia automaticamente.

Assolutamente  INSPIEGABILE.
Titolo: Re:stringGrid Celle particolari
Inserito da: tito_livio - Aprile 30, 2022, 06:23:22 pm
Ciao, io penso che:
1) Potrebbe essere che tu non veda il carattere in formato Bold perché è bianco su grigio, dovresti provare scrivendo i totali nero su bianco.
2)Tu hai tre tipi di riga nella StringGrid, testata, dettaglio e totali/subtotali mentre il tuo codice contempla solo due tipi: testata e totali/subtotali.
Tieni presente che quindi lasci così la riga di dettaglio con le impostazioni definite nel sorgente.
3)Nel caso di tipo di riga totale/subtotale tu sposti la scrittura con quel "+12" e "+2" nell'istruzione:

Codice: [Seleziona]
 GridStmp.Canvas.TextRect(aRect, aRect.Right + 12, aRect.Top + 2, CellaSel, allin);   	// riscrive il testo nella casella

Per questo le cifre dei totali/subtotali non ti vengono allineate. Infatti per le righe "normali" cioè quelle di dettaglio non è stato definito questo spostamento.
4)Non si dovrebbe mai cambiare il font in una riga di totali. Un font diverso da quello usato nel dettaglio, a parità di dimensione (size), potrebbe occupare più o meno spazio e sfalsare l'allineamento. Mettere soltanto in grassetto i totali invece crea meno problemi.
Titolo: Re:stringGrid Celle particolari
Inserito da: petrusic - Maggio 01, 2022, 12:48:00 pm
4)Non si dovrebbe mai cambiare il font in una riga di totali. Un font diverso da quello usato nel dettaglio, a parità di dimensione (size), potrebbe occupare più o meno spazio e sfalsare l'allineamento. Mettere soltanto in grassetto i totali invece crea meno problemi.
Scusa Livio, forse non hai letto quello che ho scritto alla fine del mio precedente post. Lo riporto qui sotto
Citazione
Ho provato anche a non impostare alcun Font.Name ed il risultato è sempre lo stesso: Quando viene impostato, tramite canvas, lo stile Bold, il Font.Name cambia automaticamente.

Per dimostrare la validità del mio operato, ho modificato il codice attinente alla produzione della riga dei totali, lasciando soltanto il comando di impostazione dell'allineamento a destra.
Codice: [Seleziona]

procedure TForm6.GridStmpDrawCell(Sender: TObject; aCol, aRow: Integer;
  aRect: TRect; aState: TGridDrawState);
type
  Tsfondo = TColor;

const
  grigio: Tsfondo = clGray;

var
  lun: Integer;
  ixRg: Integer = 0;

  cellaSel: String;

  allin : TTextStyle;    // tipo di allineamento

begin
  WriteLn('TForm6.GridStmpDrawCell');
  if (aRow >= 1) then
  begin
    case aCol of
      2, 3, 4, 5:
        begin
          cellaSel:= GridStmp.Cells[aCol, aRow];  // punta alla casella selezionata
          ixRg:= aRow;
          if (GridStmp.Cells[1, aRow] = '') and (GridStmp.Cells[3, aRow] = '') and (GridStmp.Cells[4, aRow] = '') then
          begin
              lun:= GridStmp.Canvas.TextWidth(cellaSel);  // determina la lunghezza del testo presente nella casella
              allin.Alignment:= taLeftJustify;
              GridStmp.Canvas.FillRect(aRect);
              GridStmp.Canvas.Font.Style:= [fsBold];
              GridStmp.Canvas.Font.Color:= clBlack;  // colora il testo
              GridStmp.Canvas.TextRect(aRect, aRect.Left, aRect.Top, CellaSel, allin);    // riscrive il testo nella casella
          end
          else begin
            if (GridStmp.Cells[2, aRow] = 'TOT.Sottoconto')  or (GridStmp.Cells[2, aRow] = 'TOTALI Conto') or (GridStmp.Cells[2, aRow] = 'T O T A L I') then
            begin
              lun:= GridStmp.Canvas.TextWidth(cellaSel);  // determina la lunghezza del testo presente nella casella
              allin.Alignment:= taRightJustify;
              GridStmp.Canvas.FillRect(aRect);
              GridStmp.Canvas.TextRect(aRect, aRect.Right, aRect.Top, CellaSel, allin);    // riscrive il testo nella casella
            end;
          end;
        end;
    end;
  end;
end;                       
Allego anche la vista della griglia dopo quest'ultima modifica.
Come è chiaramente visibile il Font.Name è cambiato  da solo, oppure é cambiata la sua dimensione.

Il disallineamento degli importi dei totali rispetto alle righe di dettaglio è dovuto soltanto al cambio automatico del Font.Name o del Font.Height. Nient'altro. Quindi, secondo me, c'è qualcosa che NON funziona in Lazarus.
Titolo: Re:stringGrid Celle particolari
Inserito da: bonmario - Maggio 01, 2022, 04:06:02 pm
Per come la vedo io, l'unico modo che hai per capire se qualcosa non va nel tuo codice o in Lazarus, è questo:
- lancia il tuo programma, ed annotati la posizione di una delle caselle che non ti funziona (supponiamo colonna 2, riga 5), ricordandoti che il conteggio parte da 0
- nella GridStmpDrawCell, disabilita tutto quello che c'è adesso, e metti un semplice
Codice: [Seleziona]
 if (aCol = 2) and (aRow = 5) then begin
end;

e dentro gli metti le impostazioni del carattere come le vuoi tu per quella singola casella.

A questo punto, se funziona, significa che c'è qualcosa che non va in come hai impostato le if ed il case in questo momento, se non funziona, potrebbe anche essere un problema di quel font, vedi se ad esempio aprendo un documento, e provando ad impostare quel font con quelle dimensioni lo vedi bene.

Ciao, Mario
Titolo: Re:stringGrid Celle particolari
Inserito da: tito_livio - Maggio 01, 2022, 11:42:55 pm
Ciao,
ho eseguito delle istruzioni simili su di una mia stringgrid e sono arrivato alla conclusione che un comportamento strano di Lazarus c'è ma si potrebbe superare così:
-Inserire l'allineamento dentro la procedura OnDrawCell crea problemi. Nel tuo caso la riga:
Codice: [Seleziona]
allin.Alignment:= taRightJustify;
può essere tolta, l'allineamento a destra è già impostato nel sorgente.
-OnDrawCell si deve "occupare" di tutte le righe, anche quelle del dettaglio. Infatti il modo di allineare a destra è diverso a seconda se la cella viene o meno ridisegnata dentro OnDrawCell.
Penso che dovresti provare a scrivere la procedura così:
Codice: [Seleziona]
procedure TForm6.GridStmpDrawCell(Sender: TObject; aCol, aRow: Integer;
  aRect: TRect; aState: TGridDrawState);
type
  Tsfondo = TColor;

const
  grigio: Tsfondo = clGray;

var
  lun: Integer;
  ixRg: Integer = 0;

  cellaSel: String;

  allin : TTextStyle;    // tipo di allineamento

begin
  WriteLn('TForm6.GridStmpDrawCell');
  if (aRow >= 1) then
  begin
    case aCol of
      2, 3, 4, 5:
        begin
          cellaSel:= GridStmp.Cells[aCol, aRow]+' ';  // punta alla casella selezionata
          ixRg:= aRow;
          if (GridStmp.Cells[1, aRow] = '') and (GridStmp.Cells[3, aRow] = '') and (GridStmp.Cells[4, aRow] = '') then
          begin
              lun:= GridStmp.Canvas.TextWidth(cellaSel);  // determina la lunghezza del testo presente nella casella
              allin.Alignment:= taLeftJustify;
              GridStmp.Canvas.FillRect(aRect);
              GridStmp.Canvas.Font.Style:= [fsBold];
              GridStmp.Canvas.Font.Color:= clBlack;  // colora il testo
              GridStmp.Canvas.Font.Name:= 'Noto Mono';
              GridStmp.Canvas.TextRect(aRect, aRect.Left + 2, aRect.Top + 6, CellaSel, allin);    // riscrive il testo nella casella
          end
          else begin
            if (GridStmp.Cells[2, aRow] = 'TOT.Sottoconto')  or (GridStmp.Cells[2, aRow] = 'TOTALI Conto') or (GridStmp.Cells[2, aRow] = 'T O T A L I') then
            begin
              lun:= GridStmp.Canvas.TextWidth(cellaSel);  // determina la lunghezza del testo presente nella casella
              GridStmp.Canvas.Brush.Color := grigio;
              GridStmp.Canvas.Font.Style:= [fsBold];
              GridStmp.Canvas.Font.Color:= clWhite;  // colora il testo
            end;
            GridStmp.Canvas.FillRect(aRect);
            GridStmp.Canvas.TextRect(aRect, aRect.Right, aRect.Top, CellaSel);    // riscrive il testo nella casella
          end;
        end;
    end;
  end;
end;
Titolo: Re:stringGrid Celle particolari
Inserito da: bonmario - Maggio 02, 2022, 01:45:25 pm
Ciao,
ho eseguito delle istruzioni simili su di una mia stringgrid e sono arrivato alla conclusione che un comportamento strano di Lazarus c'è ma si potrebbe superare così:

Avevo completamente rimosso questa cosa ... ho verificato nei miei sorgenti e, effettivamente, per allineare a destra, aggiungo degli spazi a sinistra.
Probabilmente mi ero imbattuto in questo comportamento strano, ed avevo aggirato il problema così

Ciao, Mario
Titolo: Re:stringGrid Celle particolari
Inserito da: DragoRosso - Maggio 02, 2022, 02:29:21 pm
....
-OnDrawCell si deve "occupare" di tutte le righe, anche quelle del dettaglio. Infatti il modo di allineare a destra è diverso a seconda se la cella viene o meno ridisegnata dentro OnDrawCell.
....

In generale, quando si usa il "custom draw", a maggiora ragione sulle griglie, sarebbe opportuno come accenni tu che TUTTE LE CELLE, LE ZONE, I CONTROLLI , etc.... venissero gestiti dalla funzione.

Questo fatto è legato a molteplici aspetti, uno per tutti è che il formato di scrittura non è detto sia costante nelle varie release dell'ambiente di sviluppo, non perchè gli sviluppatori si divertono a metterci in difficoltà, ma perchè andando a "disegnare" in controlli grafici non si sà come il controllo verrà trattato: potrebbe essere che la nella prossima versione (vedi ad esempio le modifiche in Windows 11) l'area sia più ristretta, oppure bordata oppure venga mantenuta una distanza di rispetto maggiore dai bordi, etc ....

Se il controllo scrive per default, tutto apparirà uniforme (anche se diverso dalla volta precedente), ma se il controllo scrive in parte ed in parte scriviamo noi allora l'effetto potrebbe non essere così gradevole.

Ulteriore consiglio, quando si usano i metodi OnDraw conviene settare TUTTI i parametri che si vanno a toccare ... SEMPRE IN OGNI CONTROLLO. Quindi se setto un FONT, allineamento, stile, etc ...., per una cella, li devo settare per tutte. Posso anche farmi della "variabili" globali con già settati i valori, così non posso sbagliare nella funzione (ad esempio setting di dettaglio, setting di primo totale, di secondo totale, ....).

Ciao
Titolo: Re:stringGrid Celle particolari
Inserito da: petrusic - Maggio 02, 2022, 03:56:14 pm
Codice: [Seleziona]
allin.Alignment:= taRightJustify;
può essere tolta, l'allineamento a destra è già impostato nel sorgente.
-OnDrawCell si deve "occupare" di tutte le righe, anche quelle del dettaglio. Infatti il modo di allineare a destra è diverso a seconda se la cella viene o meno ridisegnata dentro OnDrawCell.

Ho riportato le modifiche che mi hai suggerito, ma è saltato l'allineamento a destra nelle colonne contenenti valori numerici. Ciò è determinato dal fatto che dovendo impostare soprattutto il colore di sfondo delle caselle interne alle colonne 3, 4, 5, sono costretto ad eseguire  sempre la riga di riscrittura del testo nella casella. In quella riga è contenuto il parametro allin che, evidentemente, ha un suo default, diverso da quello dichiarato in fase di disegno per le colonne 3, 4, 5.
Codice: [Seleziona]
 else begin
      if (GridStmp.Cells[2, aRow] = 'TOT.Sottoconto')  or (GridStmp.Cells[2, aRow] = 'TOTALI Conto') or (GridStmp.Cells[2, aRow] = 'T O T A L I') then
      begin
         lun:= GridStmp.Canvas.TextWidth(cellaSel);  // determina la lunghezza del testo presente nella casella
         GridStmp.Canvas.Font.Color:= clWhite;  // colora il testo
         GridStmp.Canvas.Brush.Color := grigio;
         GridStmp.Canvas.FillRect(aRect);
         GridStmp.Canvas.TextRect(aRect, aRect.Right - 10, aRect.Top, CellaSel, allin);    // riscrive il testo nella casella
       end;
  end;                                                                   

A dimostrazione di quanto detto sopra, riporto in allegato la schermata con la StrigGrid incriminata
Titolo: Re:stringGrid Celle particolari
Inserito da: tito_livio - Maggio 02, 2022, 04:28:08 pm
Il metodo TextRect può essere usato anche con 4 argomenti.
Se scrivi
Codice: [Seleziona]
 GridStmp.Canvas.TextRect(aRect, aRect.Right - 10, aRect.Top, CellaSel)
non avrai questi problemi.
Infatti nelle modifiche suggerite io avevo usato solo 4 argomenti e non 5.
Buon lavoro
Titolo: Re:stringGrid Celle particolari
Inserito da: petrusic - Maggio 03, 2022, 11:22:43 am
Il metodo TextRect può essere usato anche con 4 argomenti.
Ho fatto come mi hai indicato, tuttavia la dimensione del carattere è comunque diversa da quella impostata per le colonne 2, 3, 4, 5, durante la fase di disegno.
Il codice modificato è:
Codice: [Seleziona]
procedure TForm6.GridStmpDrawCell(Sender: TObject; aCol, aRow: Integer;
  aRect: TRect; aState: TGridDrawState);
type
  Tsfondo = TColor;

const
  grigio: Tsfondo = clGray;

var
  lun: Integer;
  ixRg: Integer = 0;

  cellaSel: String;

  allin : TTextStyle;    // tipo di allineamento

begin

  WriteLn('TForm6.GridStmpDrawCell');
  if (aRow >= 1) then
  begin
    case aCol of
      2, 3, 4, 5:
        begin
          cellaSel:= GridStmp.Cells[aCol, aRow];  // punta alla casella selezionata
          ixRg:= aRow;
          if (GridStmp.Cells[1, aRow] = '') and (GridStmp.Cells[3, aRow] = '') and (GridStmp.Cells[4, aRow] = '') then
          begin
            lun:= GridStmp.Canvas.TextWidth(cellaSel);  // determina la lunghezza del testo presente nella casella
            GridStmp.Canvas.Font.Color:= clBlack;  // colora il testo
            GridStmp.Canvas.Font.Style:= [fsBold];
            GridStmp.Canvas.FillRect(aRect);
            GridStmp.Canvas.Font.Name:= 'Noto Mono';
            GridStmp.Canvas.TextRect(aRect, aRect.Left, aRect.Top, CellaSel);    // riscrive il testo nella casella
          end
          else begin
            if (GridStmp.Cells[2, aRow] = 'TOT.Sottoconto')  or (GridStmp.Cells[2, aRow] = 'TOTALI Conto') or (GridStmp.Cells[2, aRow] = 'T O T A L I') then
            begin
              cellaSel:= cellaSel + ' ';
              lun:= GridStmp.Canvas.TextWidth(cellaSel);  // determina la lunghezza del testo presente nella casella
              GridStmp.Canvas.Font.Color:= clWhite;  // colora il testo
              GridStmp.Canvas.Brush.Color := grigio;
              GridStmp.Canvas.Font.Name:= 'Noto Mono';
              GridStmp.Canvas.Font.Height:= 11;
              GridStmp.Canvas.FillRect(aRect);
              GridStmp.Canvas.TextRect(aRect, aRect.Right - 105, aRect.Top, CellaSel);    // riscrive il testo nella casella
            end;
          end;
        end;
    end;
  end;
end;
Ho dovuto modificare il parametro aRect.Right - 10  in aRect.Right - 105 perchè il testo nella cella della colonna 2 era sparito.

Allego anche un'immagine tipo relativa all'impostazione del Font e quella della vista dopo la modifica di stamani.

Devo dire che sono alquanto deluso, ma devo accontentarmi  di quanto ottenuto, grazie a tutti voi.
Titolo: Re:stringGrid Celle particolari
Inserito da: petrusic - Maggio 16, 2022, 04:55:40 pm
Nonostante la presenza di aspetti negativi sulla visibilità delle stringGrid, sto andando avanti.
Purtroppo ai principianti come me i problemi non mancano mai, perciò avrei ancora bisogno di aiuto:
In allegato ho riportato l'immagine di una stringGrid che contiene la colonna della descrizione troppo grande rispetto al suo contenuto.

L'ideale sarebbe:
- Rendere la larghezza della colonna proporzionata al contenuto della cella, ma non oltre ad un certo limite massimo;
- in caso di larghezza superiore al limite massimo, la cella dovrebbe potersi impostare nella modalità multiriga.

Come fare?
Titolo: Re:stringGrid Celle particolari
Inserito da: petrusic - Maggio 16, 2022, 06:58:23 pm
Relativamente alla
Citazione da: petrusic
- Rendere la larghezza della colonna proporzionata al contenuto della cella, ma non oltre ad un certo limite massimo;

ho risolto con:
Codice: [Seleziona]
case GridStmp.Columns[1].Title.Caption of
    'DESCRIZIONE':
      begin
        for i:= 1 to totRgStmp do
        begin
          cellasel:= GridStmp.Cells[2, i];
          w:= GridStmp.Canvas.TextWidth(cellasel);  // determina la lunghezza del testo presente nella casella
          if (w > lun) then
          begin
            lun:= w;
          end;
        end;
        lun:= lun + 10;
        GridStmp.Columns[1].Width:= lun;
      end;
  end;                                               

Resta da capire come rendere una cella multiriga.
Titolo: Re:stringGrid Celle particolari
Inserito da: nomorelogic - Maggio 16, 2022, 07:02:06 pm

la classe TCanvas ha un metodo che si chiama TextWidth
https://lazarus-ccr.sourceforge.io/docs/lcl/graphics/tcanvas.textwidth.html (https://lazarus-ccr.sourceforge.io/docs/lcl/graphics/tcanvas.textwidth.html)

questo metodo ritorna la lunghezza di una stringa quando disegnata su quel canvas.
quindi puoi fare qualcosa tipo:
Codice: [Seleziona]
var l: integer;
begin
  l := StringGrid1.Canvas.TextWidth('ciao mondo!');
  if l > 250 then
     l:=250;
end;


Edit:
mi hai battuto sul tempo ;)
Titolo: Re:stringGrid Celle particolari
Inserito da: DragoRosso - Maggio 16, 2022, 09:44:10 pm
Resta da capire come rendere una cella multiriga.

Intendi dire così (vedi allegato) ?

Quelli scritti nella cella sono due testi distinti e non un testo (con l'accapo).
Titolo: Re:stringGrid Celle particolari
Inserito da: petrusic - Maggio 18, 2022, 09:50:09 pm
Resta da capire come rendere una cella multiriga.
Intendi dire così (vedi allegato) ?
Quelli scritti nella cella sono due testi distinti e non un testo (con l'accapo).
Mi sono accorto solo ora della tua risposta.
 :-\

Comunque quello che intendo dire è quello che ho riportato nell'esempio allegato, realizzato su un foglio elettronico
Titolo: Re:stringGrid Celle particolari
Inserito da: Stilgar - Maggio 19, 2022, 12:36:18 am
Ciao.
Per fare quello che hai messo nell'immagine, devi prima calcolare l'altezza del testo e poi assegnarla alla riga che ti interessa.


Hai la possibilità di chiedere l'altezza del testo al canvas.


Stilgar.
Titolo: Re:stringGrid Celle particolari
Inserito da: petrusic - Maggio 30, 2022, 10:30:05 pm
Per fare quello che hai messo nell'immagine, devi prima calcolare l'altezza del testo e poi assegnarla alla riga che ti interessa.
Hai la possibilità di chiedere l'altezza del testo al canvas.

Rispondo solo ora perchè sono stato impegnato e sono impegnato a risolvere un errore logico di programmazione che stento a risolvere per via di lungaggini nella lettura dati da DB Sqlite3 e successiva compilazione della StringGrid successsiva.

Ho letto la tua indicazione, ma ho il problema di capire come potere individuare l'altezza della riga a cui appartiene la casella del testo da spalmare su due linee. Infatti quando eseguo il trasferimento del testo in essa non sono in grado di sapere a priori se rientra tutto nello spazio massimo assegnato o se, superandolo, devo raddoppiare l'altezza della riga.

Dovrei chiedere al canvas l'altezza. D'accordo, ma se il mio testo è disposto in un'unica linea, canvas mi darà sempre l'altezza corrispondente a quell'unica linea.  O no?

Titolo: Re:stringGrid Celle particolari
Inserito da: nomorelogic - Maggio 31, 2022, 10:02:09 am
hai provato a mettere un "a capo" (ASCII #10) nella stringa?



Titolo: Re:stringGrid Celle particolari
Inserito da: Stilgar - Giugno 01, 2022, 12:19:13 pm
Meglio usare la costante legata al sistema.
Se sta lavorando su Windows il ritorno è #13#10. (Come le stampanti di vecchia concezione).


https://www.freepascal.org/docs-html/rtl/system/lineending.html


Stilgar