* * * *

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.
Settembre 15, 2024, 12:24:48 am

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

30 Visitatori, 0 Utenti

Autore Topic: [Risolto] StringGrid: impostare, da codice; fsBold in tutta urga  (Letto 467 volte)

petrusic

  • Hero Member
  • *****
  • Post: 613
  • Karma: +0/-0
L'Evento drawcell della StringGrid continua  a mettermi in difficoltà, per me insormontabili.

Durante compilazione di una stringGrid, vorrei evidenziare un tipo particolare, impostando  lo style fsbold. Ho pensato di farlo  sfrtuttando l'evento onDrawCell, ma riesco ad applicare lo fsbold soltanto all cella indirizzata dalla coordinate, ma nemmeno bene.
Riporto sia il codice che il risultato pratico della prova:
Codice: [Seleziona]
procedure TForm8.GridPreAmmortDrawCell(Sender: TObject; aCol, aRow: Integer;
  aRect: TRect; aState: TGridDrawState);
var
  lun, p, totRg: Integer;

  cellaSel: String;

  allin : TTextStyle;    // tipo di allineamento

begin
  if (aRow <> 0) then
  begin
    cellaSel:= Form8.GridPreAmmort.Cells[aCol, aRow];    // punta alla casella selezionata
    if (Form8.GridPreAmmort.Cells[8, aRow] = 'X') and (Length(Form8.GridPreAmmort.Cells[7, aRow]) > 0) then
    begin
       bla, bla, bla
    end
    else begin
      p:= pos( 'Totali', cellaSel);     // <--- individuo ogni cella che contiene la sottostringa
      if (p > 0) then
      begin
        GridPreAmmort.Canvas.Font.Style:= [fsBold];
        lun:= Form8.GridPreAmmort.Canvas.TextWidth(cellaSel);
        allin:= Canvas.TextStyle;
        case Form8.GridPreAmmort.Canvas.TextStyle.Alignment of // rileva il tipo di allineamento dichiarato per la casella
          taLeftJustify:
            begin
              if (aCol = 0) then
              begin
                Form8.GridPreAmmort.Canvas.TextOut(aRect.Right - lun - 1, aRect.Top + 2, CellaSel);
              end
              else begin
                Form8.GridPreAmmort.Canvas.TextOut(aRect.Left + 2, aRect.Top + 2, CellaSel);
              end;
            end;
          taRightJustify:
            begin
              Form8.GridPreAmmort.Canvas.TextOut(aRect.Right - lun - 2, aRect.Top + 2, CellaSel);
            end;
          taCenter:
            begin
              Form8.GridPreAmmort.Canvas.TextOut(aRect.Left + ((lun div 2) - 7), aRect.Top + 2, CellaSel);
            end;
        end;
      end;
    end;
  end;
end;
Così facendo però riesco solo ad impostare ilo stile fsbold alla cella contetente la sottostringa "Totali", ma nemmeno bene, come si può vedere benissimo nell'allegato.

Ho scoperto poi che l'evento onDrawCell viene schedulato 2 volte, ... ma perchè?

Andando per gradi, la pima difficoltà da superare, per rispettare il titolo della discusione, credo che sia quella di capire come applicare il carattere fsbold a tutta la riga a cui appartiene la cella con la sottostringa "Totali", anche sporca come appare nell'allegato.

« Ultima modifica: Agosto 01, 2024, 05:24:23 pm da petrusic »
ciao ciao

DragoRosso

  • Scrittore
  • Hero Member
  • *****
  • Post: 1326
  • Karma: +44/-0
  • Prima ascoltare, poi decidere
Re:StringGrid: impostare, da codice; fsBold in tutta urga
« Risposta #1 il: Luglio 28, 2024, 05:34:29 pm »
Ho scoperto poi che l'evento onDrawCell viene schedulato 2 volte, ... ma perchè?

Proprietà "DefaultDrawing" a true della StringGrid ? In questo caso la stringgrid scrive comunque prima il suo default e poi chiama l'evento (e quindi ti sovrapponi a quanto già scritto).
:) Ogni alba è un regalo, ogni tramonto è una conquista :)

DragoRosso

  • Scrittore
  • Hero Member
  • *****
  • Post: 1326
  • Karma: +44/-0
  • Prima ascoltare, poi decidere
Re:StringGrid: impostare, da codice; fsBold in tutta urga
« Risposta #2 il: Luglio 28, 2024, 05:37:17 pm »
Andando per gradi, la pima difficoltà da superare, per rispettare il titolo della discusione, credo che sia quella di capire come applicare il carattere fsbold a tutta la riga a cui appartiene la cella con la sottostringa "Totali", anche sporca come appare nell'allegato.
Discussione già affrontata ? (https://www.lazaruspascal.it/index.php?topic=2388.msg16020;topicseen#msg16020)
:) Ogni alba è un regalo, ogni tramonto è una conquista :)

petrusic

  • Hero Member
  • *****
  • Post: 613
  • Karma: +0/-0
Re:StringGrid: impostare, da codice; fsBold in tutta urga
« Risposta #3 il: Luglio 28, 2024, 06:38:43 pm »
Discussione già affrontata ? (https://www.lazaruspascal.it/index.php?topic=2388.msg16020;topicseen#msg16020)

Le somiglia, ma, a mio avviso,  non lo è. Ora devo evidenziare con lo stile fsbold alcune le celle significative di tutte le righe contenenti una data sottostringa, prima della visualizzazione della StringGrid.

Ho scoperto poi che l'evento onDrawCell viene schedulato 2 volte, ... ma perchè?

Proprietà "DefaultDrawing" a true della StringGrid ? In questo caso la stringgrid scrive comunque prima il suo default e poi chiama l'evento (e quindi ti sovrapponi a quanto già scritto).

Si, è quello, ma, impostando la Proprietà "DefaultDrawing" a Fallse, non trovo più valorizzate tutte le altre righe (vedi allegato)
ciao ciao

DragoRosso

  • Scrittore
  • Hero Member
  • *****
  • Post: 1326
  • Karma: +44/-0
  • Prima ascoltare, poi decidere
Re:StringGrid: impostare, da codice; fsBold in tutta urga
« Risposta #4 il: Luglio 28, 2024, 09:14:13 pm »
Si, è quello, ma, impostando la Proprietà "DefaultDrawing" a False, non trovo più valorizzate tutte le altre righe (vedi allegato)

Bhè è certo. Se vuoi scrivere tu qualche cella ... le devi scrivere tutte. Come fà il controllo a sapere quale cella scrivere e quale no ?.

Le somiglia, ma, a mio avviso,  non lo è. Ora devo evidenziare con lo stile fsbold alcune le celle significative di tutte le righe contenenti una data sottostringa, prima della visualizzazione della StringGrid.

La tecnica è sempre la stessa, che poi è quella che hai usato tu. Devi solo controllare RIGA e COLONNA riportate nell'evento e decidere cosa fare (ad esempio a seconda del contenuto del testo o altro).
Il tuo problema è che devi conoscere a priori quale riga devi modificare, non puoi basarti sull'evento a meno di fare strani loop: potresti ogni volta che l'evento cambia riga ciclare sulla stringgrid  (sempre nell'evento) sui valori di quella riga e se trovi il valore "TOTALE" allora imposti il bold su ogni colonna della riga.

Però, a parte il discutibile stile (di programmazione  8) ), non sò se ci sono controindicazioni (ad esempio la lentezza nella visualizzazione o altro).

Ciao
« Ultima modifica: Luglio 28, 2024, 09:15:52 pm da DragoRosso »
:) Ogni alba è un regalo, ogni tramonto è una conquista :)

petrusic

  • Hero Member
  • *****
  • Post: 613
  • Karma: +0/-0
Re:StringGrid: impostare, da codice; fsBold in tutta urga
« Risposta #5 il: Luglio 31, 2024, 05:06:34 pm »
 :-\
Peggio di così non può andare.

Ho impostato a False la proprietà DefaultDrawing della StringGrid e da quel momento qualsiasi azione svolta sulle singole celle , NON produce più la visibilità del loro contenuto, perciò la StringGrid si mostra completamente vuota.
Riporto il codice interno alla procedura-evento GridPreAmmortDrawCell.
Codice: [Seleziona]
procedure TForm8.GridPreAmmortDrawCell(Sender: TObject; aCol, aRow: Integer;
  aRect: TRect; aState: TGridDrawState);

var
  swStylFsBold: Boolean = False;

  i, lun, p, totRg, ixCol, ixRg : Integer;

  cellaSel: String;

  allin : TTextStyle;    // tipo di allineamento

begin
  cellaSel:= GridPreAmmort.Cells[aCol, aRow];  // punta alla casella selezionata
  if (aRow = 0) then
  begin
    GridPreAmmort.Canvas.Font.Style:= [fsBold];
    allin:= Canvas.TextStyle;
  end;
  if (aCol = 0) and (aRow > 0) then
  begin
    GridPreAmmort.Canvas.Font.Style:= [fsBold];
    lun:= Form8.GridPreAmmort.Canvas.TextWidth(cellaSel);
    Dec(ARect.Right, varCellPadding);
    Dec(ARect.Right, 1);
    allin:= Canvas.TextStyle;
    allin.Alignment:= taRightJustify;
  end;
  if (aCol > 0) and (aRow > 0) then
  begin
    p:= pos( 'Totali', cellaSel);
    if (p > 0) then
    begin
      swStylFsBold:= True;
      GridPreAmmort.Canvas.Font.Style:= [fsBold];
      GridPreAmmort.Canvas.Rectangle(aRect);
    end
    else begin
      if swStylFsBold then
      begin
        GridPreAmmort.Canvas.Font.Style:= [fsBold];
      end
      else begin
        GridPreAmmort.Canvas.Font.Style:= [];
      end;
    end;
    case Form8.GridPreAmmort.Canvas.TextStyle.Alignment of // rileva il tipo di allineamento dichiarato per la casella
      taLeftJustify:
        begin
          Form8.GridPreAmmort.Canvas.TextOut(aRect.Left - lun - 1, aRect.Top, CellaSel);
        end;
      taRightJustify:
        begin
          Form8.GridPreAmmort.Canvas.TextOut(aRect.Right - lun - 2, aRect.Top, CellaSel);
        end;
      taCenter:
        begin
          Form8.GridPreAmmort.Canvas.TextOut(aRect.Left + ((lun div 2) - 7), aRect.Top, CellaSel);
        end;
    end;
 end;
end;                                           

Non capisco assolutamente dove sbaglio, ma può anche essere che:  dovrei eseguire qualcosa e non lo faccio.
ciao ciao

DragoRosso

  • Scrittore
  • Hero Member
  • *****
  • Post: 1326
  • Karma: +44/-0
  • Prima ascoltare, poi decidere
Re:StringGrid: impostare, da codice; fsBold in tutta urga
« Risposta #6 il: Luglio 31, 2024, 11:43:07 pm »
Ho provato il tuo codice pari pari (a parte il nome della stringgrid e della Form8), e a me funziona correttamente
:) Ogni alba è un regalo, ogni tramonto è una conquista :)

petrusic

  • Hero Member
  • *****
  • Post: 613
  • Karma: +0/-0
Re:StringGrid: impostare, da codice; fsBold in tutta urga
« Risposta #7 il: Agosto 01, 2024, 10:25:45 am »
Ho provato il tuo codice pari pari (a parte il nome della stringgrid e della Form8), e a me funziona correttamente
Non capisco.

Se a me non funziona, potrebbe dipendere allora da qualche impostazione di base nelle proprietà della StringGrid. Ieri ho cercato di capire come funziona il meccanismo parametrico interno alla StringGrid, impostando a False la proprietà DefaultDrawing, ma nonostante tuttie le prove fatte, non sono riuscito a vedere nemmeno una cella completa del suo contenuto.

Sarà una stupidata, ma intanto non posso andare avanti col programma.
ciao ciao

petrusic

  • Hero Member
  • *****
  • Post: 613
  • Karma: +0/-0
Re:StringGrid: impostare, da codice; fsBold in tutta urga
« Risposta #8 il: Agosto 01, 2024, 12:12:45 pm »
Pare che ho risolto.

Ho reimpostato la proprietà DefaultDrawing = True ed ho scritto le mie istruzioni di evidenziazione dentro la prtocedura legata all'Evento OnPrepareCanvas:
Codice: [Seleziona]
procedure TForm8.GridPreAmmortPrepareCanvas(Sender: TObject; aCol,
  aRow: Integer; aState: TGridDrawState);
var
  ts: TTextStyle;

  p: Integer;
  ixRg: Integer = (-1);

begin
  if (aCol = 0) then
  begin
    With GridPreAmmort.Canvas.Font do
    begin
      Name:= 'Noto Sans TJK TC';
      Size:= 9;
      Style := [fsBold];        // Stile Grassetto per la riga di testa
    end;
    ts := GridPreAmmort.Canvas.TextStyle;
    ts.Alignment := taRightJustify;
    GridPreAmmort.Canvas.TextStyle := ts;
  end;
  if (aCol = 3) and (aRow > 0) then
  begin
    p:= pos( 'Totali', GridPreAmmort.Cells[aCol, aRow]);
    if (p > 0) then
    begin
      GridPreAmmort.Canvas.Font.Style:= [fsBold];
      ixRg:= aRow;
    end;
    if (Length(GridPreAmmort.Cells[aCol, aRow]) > 0) and (aRow = iXRg)   then
    begin
       GridPreAmmort.Canvas.Font.Style:= [fsBold];
    end;
 end;
end;

Ecco il risultato

A questo punto l'Evento OnDrawCell non m'interessa più.
« Ultima modifica: Agosto 01, 2024, 12:16:23 pm da petrusic »
ciao ciao

DragoRosso

  • Scrittore
  • Hero Member
  • *****
  • Post: 1326
  • Karma: +44/-0
  • Prima ascoltare, poi decidere
Re:StringGrid: impostare, da codice; fsBold in tutta urga
« Risposta #9 il: Agosto 01, 2024, 12:38:21 pm »
Anche quella è una strada. Anzi in Lazarus è la strada consigliata se si devono cambiare solo gli attributi della cella.
:) Ogni alba è un regalo, ogni tramonto è una conquista :)

petrusic

  • Hero Member
  • *****
  • Post: 613
  • Karma: +0/-0
Re:StringGrid: impostare, da codice; fsBold in tutta urga
« Risposta #10 il: Agosto 01, 2024, 05:23:50 pm »
Bene. Ora ho terminato le mie prove e posso dire di avere Risolto.

Ho infatti superato anche il problema della selezione di righe multiple non sequenziali, sempre senza disturbare l'evento OnDrawCell

@ DragoRosso
Grazie per tutte le dritte che mi hai regalato.  ;D
ciao ciao

 

Recenti

How To

Utenti
  • Utenti in totale: 797
  • Latest: lorvig
Stats
  • Post in totale: 18971
  • Topic in totale: 2262
  • Online Today: 25
  • Online Ever: 900
  • (Gennaio 21, 2020, 08:17:49 pm)
Utenti Online
Users: 0
Guests: 30
Total: 30

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.