Newsgroup: it.comp.lang.delphi
Titolo: TSMDbGrid

Ciao a tutti,
  oggi propongo un piccolo problema di "cosmetica" legato al componente in 
questione.
Si tratta di un componente DBGrid della Scalabium e, per cronaca, gratuito.
 
Nella tabella delle vendite dettagliate ci sono due campi integer, un campo 
definisce l'operazione progressiva (parte da 1 fino n, ogni operazione 
incrementa di 1), l'altro  definisce il progressivo giornaliero.
Quel che succede e' che scorrendo la tabella incontro dei record con 
numerazione progressiva giornaliera uguale.
 
Ecco il (pseudo)problema.
L'evento che controlla la colorazione e' il seguente
SMDBGridGetCellParams(Sender: TObject; Field: TField; AFont: TFont;
  var Background: TColor; Highlight: Boolean);
 
Andando a controllare se il campo PG (Progressivo giornaliero)  e' pari o 
dispari ottengo la griglia colorata separata per pari/dispari.
 
Pero' se filtro la tabella puo' capitare di avere una serie di progressivi 
giornalieri (pari o dispari) consecutivi, per esempio
 
15
15
15
21
23
39
39
39
39
 
essendo tutti dispari (nell'esempio) saranno tutti colorati con il colore 
dispari.
In questo caso, tabella filtrata, come posso avere l'alternanza dei colori 
che coinvolga anche i record con progressivo pari?
 
Le ho provate quasi tutte (quella che funzionera' sara' le definitiva) ma 
senza risultati apprezzabili.
 
Grazie.
 
Ciao
Daniele
 
PS: Al momento ho risolto cosi':
     Se la tabella e' filtrata non uso i due colori ma ne utilizzo uno solo.
 
 

Erediti dalla griglia una tua griglia e crei un override di DrawCell.
Il codice sta tutto li e la modifica richiede max 15 minuti.
Trattandosi di un componente free, dopo potresti anche inciare quello che hai realizzato a team del componente.
 
A.


per colorare le righe di due colori diversi c'è una proprietà apposita: 
GridStyle.
 
Leggi questa faq dal sito scalabium:
19. I want to change a color for odd rows.
 
You may use the GridStyle property and specitfy there any custom colors 
for Odd/Even rows or select any from predefined color schemes 
(price-list, MS Money etc)
 
Also as alternative, you may change the color as I described in previous 
topic - you can do it in OnGetCellParams or OnDrawColumnCell events. For 
example:
 
procedure TForm1.SMDBGrid1GetCellParams(Sender: TObject; Field: TField;
   AFont: TFont; var Background: TColor; Highlight: Boolean);
begin
   if (Table1.RecNo mod 2 = 1) then
     Background := clRed;
end;
 
PS: of course, RecNo is valid for local tables only (Paradox, DBase etc).

Ciao a tutti,
  rispondo qui sia ad Alberto che a Luigi.
 
l'obbiettivo che sto cercando di raggiungere non e' quello di colorare con 
colori diversi le righe pari e dispari, bensi' usare colori diversi per 
quelle righe che contengono un progressivo pari e dispari MA solo nella 
tabella filtrata.
Mi spiego meglio, tabella non filtrata tutto ok progressivi
 
1 rosso
1 rosso
1 rosso
2 blu
3 rosso
4 blu
4 blu
4 blu
 
nell' SMDBGridGetCellParams e' facilmente gestibile (infatti non ho 
problemi.
Ma quando filtro la tabella, magari per prodotto, posso avere una risultato 
di questo tipo
 
15
15
15
21
23
32
36
39
39
39
39
 
che usando il codice originario viene colorato cosi'
 
15 rosso
15 rosso
15 rosso
21 rosso
23 rosso
32 blu
36 blu
39 rosso
39 rosso
39 rosso
39 rosso
 
invece dovrebbe essere
 
15 rosso
15 rosso
15 rosso
21 blu     <---- anche se e' dispari !
23 rosso
32 blu
36 rosso  <----anche se e' pari
39 rosso
39 rosso
39 rosso
39 rosso
 
Sto cercando di risolvere con, all'interno del SMDBGridGetCellParams
 
If DataSet.filter then
begin
    colori con il dataset filtrato
end
else
begin
    colri con dataset non filtrato. Qui OK !
end;
 
Scusate la lungaggine
 
Ciao
 
Daniele
 

Ciao, sto provando con questo codice che funziona parzialmente ...
E' nell'evento SMDBGridGetCellParams
 
if DataSet.Filtered then
begin
    if LastNum=DataSet.FieldByName('PG').AsInteger then // PG = Progressivo 
Giornaliero
    begin
        // L'ultimo PG e' lo stessso di quello precedente, non faccio niente 
tengo i colori come sono
    end
    else
    begin
        // E' diverso ...
        if LastColor=clMoneyGreen then // Se l'ultimo colore usato e' questo 
cambio i colori con questi
        begin
          LastColor:=clWhite;
          LastTextColor:=ClBlack
        end
        else   // Altrimenti con questi
        begin
          LastColor:=clMoneyGreen;
          LastTextColor:=clWhite;
        end;
      end;
      // Utilizzo i colori impostati.
      AFont.Color:=LastTextColor;
      Background:=LastColor;
   end
 
In effetti alla prima colorazione va tutto bene, allora perche' funziona 
parzialmente??
Perche' quando iniziao a scorrere la griglia la colorazione continua a 
cambiare ogni volta.
 
Onestamente sono a corto di idee ....
Qualche suggerimento sulla logica??
 
Grazie
 
Daniele
 
 

 o dispari ottengo la griglia colorata separata per pari/dispari.
 
E' qui l'errore: non devi controllare il PG, bensì se l'indice della 
riga del dataset e' dispari.
 
-- 
Morde


ciao.
 
Suggerimento generale: quando devi gestire un evento di Paint della griglia, 
fai finta che i paint delle celle avvengano in un ordine casuale e non
dall'alto al basso come ti potrebbe sembrare logico.
 
In effetti la prima volta e' cosi', il paint e' dall'alto al basso,
ma dopo, mentre stai scrollando o passando il mouse sopra la griglia o
in generale durante il funzionamento del programma e' normale che
venga forzato un repaint di una sola cella in mezzo alla griglia o
anche di un gruppo: in questo caso devi garantire che quel
repaint faccia sempre la stessa cosa.
 
Quindi devi evitare come la peste di tenere una variabile per
memorizzare "la riga precedente" al fine di cambiare colore.
(nel tuo caso mi sembra che stai tenendo lastColor e lastNum)
 
Infatti dopo un repaint generale, lastColor e lastNum sono
quelli dell'ultima riga, e se ti capita un repaint di una cella
in mezzo? Il tuo codice usera' i valori lastColor dell'ultima
riga e non di quella *precedente*.
 
L'unico modo che hai e' di tenere memorizzata questa informazione
per ogni riga della griglia: questo puoi farlo usando campi
calcolati nel dataset o tenendo una struttura dati parallela da 
riempire appena viene filtrato il dataset.
 
ciao
Giacomo
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 


 
Non avevo letto tutto il thread, ignora la risposta precedente.
 
La logica deve essere:
Nell'evento di repaint della cella, verifica se il PG della *riga 
precedente* è diverso dal corrente: se si, cambia colore
 
Non serve altro. --
Morde

 riempire appena viene filtrato il dataset.
 
Mettere questa logica addirittura nei dati con campi calcolati: stai 
scherzando vero?
 
Nnon ricordo più come si fa in delphi, ma la logica va nel repaint della 
cella che deve guardare la riga precedente. Semplicemente questo.--
Morde

 cella che deve guardare la riga precedente. Semplicemente questo.--
 
Appunto: probabilmente non ricordi piu' che per come sono concepiti i dataset in delphi, guardare la riga precedente e' piuttosto scomodo: 
devi fornare indietro di un record, 
leggere il valore, tornare al record originale, gestire casi particolari
come quando sei sul primo record... tutto questo per ogni 
cella della griglia, cioe' per ogni record e per ogni colonna...
Fai decisamente prima a calcolarti tutto una sola volta per ogni riga, 
prima del draw.
 
ciao
Giacomo
 
 
 
 
 

 cella della griglia, cioe' per ogni record e per ogni colonna...
 
Non sono convinto che devi fare tutto questo..
ecco o cercato in google e questo thread fa quello che vuole l'OP senza 
implementare quello che dici
http://stackoverflow.com/questions/38892755/getting-a-value-from-a-previous-row-in-drawcolumncell
 
 
 
-- 
Morde

 tabella filtrata.
 
Hai valutato o no la mia soluzione, che se ne frega del dato e usa il numero di riga della griglia stessa?
Hai visto il codice del componente?
 
A.