* * * *

Privacy Policy

Blog italiano

Clicca qui se vuoi andare al blog italiano su Lazarus e il pascal.

Forum ufficiale

Se non siete riusciti a reperire l'informazione che cercavate nei nostri articoli o sul nostro forum vi consiglio di visitare il
Forum ufficiale di Lazarus in lingua inglese.

Lazarus 1.0

Trascinare un file nel programma
DB concetti fondamentali e ZeosLib
Recuperare codice HTML da pagina web
Mandare mail con Lazarus
Stabilire il sistema operativo
Esempio lista in pascal
File INI
Codice di attivazione
Realizzare programmi multilingua
Lavorare con le directory
Utilizzare Unità esterne
TTreeView
TTreeview e Menu
Generare controlli RUN-TIME
LazReport, PDF ed immagini
Intercettare tasti premuti
Ampliare Lazarus
Lazarus e la crittografia
System Tray con Lazarus
UIB: Unified Interbase
Il file: questo sconosciuto
Conferma di chiusura di un applicazione
Liste e puntatori
Overload di funzioni
Funzioni a parametri variabili
Proprietà
Conversione numerica
TImage su Form e Panel
Indy gestiore server FTP lato Client
PopUpMenu sotto Pulsante (TSpeedButton)
Direttiva $macro
Toolbar
Evidenziare voci TreeView
Visualizzare un file Html esterno
StatusBar - aggirare l'errore variabile duplicata
Da DataSource a Excel
Le permutazioni
Brute force
Indy 10 - Invio email con allegati
La gestione degli errori in Lazarus
Pascal Script
Linux + Zeos + Firebird
Dataset virtuale
Overload di operatori
Lavorare con file in formato JSON con Lazarus
Zeos ... dietro le quinte (prima parte)
Disporre le finestre in un blocco unico (come Delphi)
Aspetto retrò (Cmd Line)
Lazarus 1.0
Come interfacciare periferica twain
Ubuntu - aggiornare free pascal e lazarus
fpcup: installazioni parallele di lazarus e fpc
Free Pascal e Lazarus sul Raspberry Pi
Cifratura: breve guida all'uso dell'algoritmo BlowFish con lazarus e free pascal.
Creare un server multithread
guida all'installazione di fpc trunk da subversion in linux gentoo
Indice
DB concetti fondamentali e connessioni standard
Advanced Record Syntax
DB concetti fondamentali e DBGrid
DB concetti fondamentali e TDBEdit, TDBMemo e TDBText
Advanced Record Syntax: un esempio pratico
Superclasse form base per programmi gestionali (e non)
Superclasse form base per programmi gestionali (e non) #2 - log, exception call stack, application toolbox
Superclasse form base per programmi gestionali (e non) #3 - traduzione delle form
Superclasse form base per programmi gestionali (e non) #4 - wait animation
Un dialog per la connessione al database:TfmSimpleDbConnectionDialog
Installare lazarus su mac osx sierra
immagine docker per lavorare con lazarus e free pascal
TDD o Test-Driven Development
Benvenuto! Effettua l'accesso oppure registrati.
Novembre 24, 2024, 04:05:43 am

Inserisci il nome utente, la password e la durata della sessione.

67 Visitatori, 0 Utenti

Autore Topic: stringGrid Celle particolari  (Letto 3906 volte)

petrusic

  • Hero Member
  • *****
  • Post: 624
  • Karma: +0/-0
stringGrid Celle particolari
« il: 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?
ciao ciao

bonmario

  • Hero Member
  • *****
  • Post: 1360
  • Karma: +11/-1
Re:stringGrid Celle particolari
« Risposta #1 il: 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

petrusic

  • Hero Member
  • *****
  • Post: 624
  • Karma: +0/-0
Re:stringGrid Celle particolari
« Risposta #2 il: 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.
ciao ciao

DragoRosso

  • Scrittore
  • Hero Member
  • *****
  • Post: 1399
  • Karma: +44/-0
  • Prima ascoltare, poi decidere
Re:stringGrid Celle particolari
« Risposta #3 il: 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
:) Ogni alba è un regalo, ogni tramonto è una conquista :)

petrusic

  • Hero Member
  • *****
  • Post: 624
  • Karma: +0/-0
Re:stringGrid Celle particolari
« Risposta #4 il: 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.
ciao ciao

tito_livio

  • Full Member
  • ***
  • Post: 173
  • Karma: +4/-0
Re:stringGrid Celle particolari
« Risposta #5 il: 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.

petrusic

  • Hero Member
  • *****
  • Post: 624
  • Karma: +0/-0
Re:stringGrid Celle particolari
« Risposta #6 il: 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.
ciao ciao

bonmario

  • Hero Member
  • *****
  • Post: 1360
  • Karma: +11/-1
Re:stringGrid Celle particolari
« Risposta #7 il: 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

tito_livio

  • Full Member
  • ***
  • Post: 173
  • Karma: +4/-0
Re:stringGrid Celle particolari
« Risposta #8 il: 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;

bonmario

  • Hero Member
  • *****
  • Post: 1360
  • Karma: +11/-1
Re:stringGrid Celle particolari
« Risposta #9 il: 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

DragoRosso

  • Scrittore
  • Hero Member
  • *****
  • Post: 1399
  • Karma: +44/-0
  • Prima ascoltare, poi decidere
Re:stringGrid Celle particolari
« Risposta #10 il: 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
:) Ogni alba è un regalo, ogni tramonto è una conquista :)

petrusic

  • Hero Member
  • *****
  • Post: 624
  • Karma: +0/-0
Re:stringGrid Celle particolari
« Risposta #11 il: 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
ciao ciao

tito_livio

  • Full Member
  • ***
  • Post: 173
  • Karma: +4/-0
Re:stringGrid Celle particolari
« Risposta #12 il: 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

petrusic

  • Hero Member
  • *****
  • Post: 624
  • Karma: +0/-0
Re:stringGrid Celle particolari
« Risposta #13 il: 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.
ciao ciao

petrusic

  • Hero Member
  • *****
  • Post: 624
  • Karma: +0/-0
Re:stringGrid Celle particolari
« Risposta #14 il: 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?
ciao ciao

 

Recenti

How To

Utenti
  • Utenti in totale: 803
  • Latest: maXim.FI
Stats
  • Post in totale: 19180
  • Topic in totale: 2288
  • Online Today: 97
  • Online Ever: 900
  • (Gennaio 21, 2020, 08:17:49 pm)
Utenti Online
Users: 0
Guests: 67
Total: 67

Disclaimer:

Questo blog non rappresenta una testata giornalistica poiché viene aggiornato senza alcuna periodicità. Non può pertanto considerarsi un prodotto editoriale ai sensi della legge n. 62/2001.