Il linguaggio di programmazione Delphi
 

TSMDbGrid

Daniele 26 Gen 2017 15:08
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.
Alberto Salvati 26 Gen 2017 16:04
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.
Luigi Siciliano 26 Gen 2017 16:16
Il 26/01/2017 15.08, Daniele ha scritto:
> Si tratta di un componente DBGrid della Scalabium e, per cronaca, gratuito.
>
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).
Daniele 27 Gen 2017 11:32
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
Daniele 27 Gen 2017 11:50
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
Morde 27 Gen 2017 12:07
On 26.01.2017 15:08, Daniele wrote:

> Andando a controllare se il campo PG (Progressivo giornaliero) e' pari
> 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
Giacomo Degli Esposti 27 Gen 2017 12:10
On Friday, January 27, 2017 at 11:50:15 AM UTC+1, Daniele wrote:
> 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??

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
Morde 27 Gen 2017 12:16
On 27.01.2017 12:07, Morde wrote:

> E' qui l'errore: non devi controllare il PG, bensì se l'indice della
> riga del dataset e' dispari.
>

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
Morde 27 Gen 2017 12:20
On 27.01.2017 12:10, Giacomo Degli Esposti wrote:

>
> 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.

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
Giacomo Degli Esposti 27 Gen 2017 12:52
On Friday, January 27, 2017 at 12:20:49 PM UTC+1, Morde wrote:
> On 27.01.2017 12:10, Giacomo Degli Esposti wrote:
>
>>
>> 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.
>
> Mettere questa logica addirittura nei dati con campi calcolati: stai
> scherzando vero?

Leggi bene: ho detto nel dataset, non nel DB ! :-)

> Nnon ricordo più come si fa in delphi, ma la logica va nel repaint della
> 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
Morde 27 Gen 2017 13:35
On 27.01.2017 12:52, Giacomo Degli Esposti wrote:

> 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...

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
Alberto Salvati 28 Gen 2017 08:45
On Friday, January 27, 2017 at 11:33:00 AM UTC+1, Daniele wrote:
> 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.

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.

Links
Giochi online
Dizionario sinonimi
Leggi e codici
Ricette
Testi
Webmatica
Hosting gratis
   
 

Il linguaggio di programmazione Delphi | Tutti i gruppi | it.comp.lang.delphi | Notizie e discussioni delphi | Delphi Mobile | Servizio di consultazione news.