Utilisateur anonyme
-
6 mai 2008 à 14:45
ThWilliam
Messages postés418Date d'inscriptionmardi 3 janvier 2006StatutMembreDernière intervention26 novembre 2013
-
27 juin 2008 à 11:45
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.
ThWilliam
Messages postés418Date d'inscriptionmardi 3 janvier 2006StatutMembreDernière intervention26 novembre 20134 27 juin 2008 à 11:45
Salut Papyvore.
Si, dans thgrids.pas, tu regardes la procedure TTHBasicGrid.MouseUp, tu verras que l'événement OnCellClick n'est appelé que si on a cliqué sur une cellule de données : if GC.Y >= FixedRows then...
Il est donc très simple d'ajouter un événement "OnHeaderCellClick" si GC.Y < FixedRows.
MAIS : si les options du grid permettent le resize ou le déplacement de colonne, l'événement sera également appelé après ces opérations !
Le plus simple à coder serait de n'appeler l'événement que sur un clic droit.
Désolé de ne pas être plus complet, mais là, je n'ai pas trop le temps.
Thierry
papyvore
Messages postés223Date d'inscriptionsamedi 15 novembre 2003StatutMembreDernière intervention16 décembre 202115 26 juin 2008 à 10:47
bonjour
peut on ajouter un click sur Header columns pour utiliser le tri
par exemple ??
comment ??
merci
ThWilliam
Messages postés418Date d'inscriptionmardi 3 janvier 2006StatutMembreDernière intervention26 novembre 20134 10 mai 2008 à 20:10
Salut Delphiprog.
La colonne Float du grid est de type ctFloat.
Dans la procedure GridDrawDataCell, il y a conversion de valeur pour affichage avec séparateurs (voir ligne 305 de Mainfrm.pas). Cette conversion est entourée de try... except. Cela ne pose pas de problèmes, sauf si, chez toi, dans les options du débogueur, est coché "Arrêter sur exceptions Delphi". Dans ce cas, il y a notification d'exception, c'est normal.
A +
Thierry
cs_Delphiprog
Messages postés4297Date d'inscriptionsamedi 19 janvier 2002StatutMembreDernière intervention 9 janvier 201332 10 mai 2008 à 17:59
Je me suis dit : super travail.
J'ai donc voulu voir à quoi ça ressemblait en fonctionnement et patatras, sous Delphi 7, au lancement de l'application :
---------------------------
Notification d'une exception du débogueur
---------------------------
Le projet DemoTThGrid.exe a provoqué une classe d'exception EConvertError avec le message ''' n'est pas une valeur en virgule flottante correcte'. Processus stoppé. Utilisez Pas-à-pas ou Exécuter pour continuer.
---------------------------
OK Aide
---------------------------
sur la ligne 916 de l'unité thgrids.pas :
if AValue <> '' then
DrawCellValue(AValue, ACol, ARow, ARect, AState);
What's wrong ?
ThWilliam
Messages postés418Date d'inscriptionmardi 3 janvier 2006StatutMembreDernière intervention26 novembre 20134 8 mai 2008 à 19:07
@Tigris1 et Florent : grand merci à vous deux.
@Florent : je vois avec plaisir que nous sommes d'accord sur la non-mémorisation.
Moi je ne regrette pas la non-mémorisation des données: j'adore !
C'est tellement mieux quand tout est séparé.
10/10 sans hésiter.
tigris1
Messages postés57Date d'inscriptiondimanche 27 mars 2005StatutMembreDernière intervention15 janvier 2009 8 mai 2008 à 15:44
Pardon, j'ai écrit trop vite, et le commentaire n'est pas correct (la cause à mon touchpad), je reprends:
Très joli travail, aussi bien du côté visuel que de la programmation. Il y a beaucoup de choses à prendre. Merci et bravo.
Tigris
tigris1
Messages postés57Date d'inscriptiondimanche 27 mars 2005StatutMembreDernière intervention15 janvier 2009 8 mai 2008 à 15:42
Très joli travail, aussi bien du côté visuel que de la programmtion et de la documentation. Il y pas de chose à prendre. Merci et bravo.
Tigris
ThWilliam
Messages postés418Date d'inscriptionmardi 3 janvier 2006StatutMembreDernière intervention26 novembre 20134 6 mai 2008 à 20:59
@Cirec et Mauricio : merci à vous deux pour votre appréciation.
@F0xi : merci pour tes conseils. Mais j'ai testé ta façon de faire, et je n'ai aucun gain de temps (dans le cas présent du dessin en dégradé, je précise). Par contre, je répète inutilement des calculs de couleur, alors qu'il suffirait de le faire une fois pour toutes pour la largeur ou la hauteur du bitmap. Et là j'ai un fameux gain de temps. Je ferai la modif pour la prochaine mise à jour.
A +
Thierry
cs_MAURICIO
Messages postés2106Date d'inscriptionmardi 10 décembre 2002StatutModérateurDernière intervention15 décembre 20145 6 mai 2008 à 18:20
Bien pratique lorsque l' on ne peut utiliser autre chose qu' un TStringGrid.
Impecc'
A+
f0xi
Messages postés4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 mars 202235 6 mai 2008 à 15:26
tite amelioration pour les perf du paint :
procedure ClampPixCol(const iA,iB,iC:integer; var bA,bB,bC: byte);
begin
if (iA and $80000000) = $80000000 then bA := 0 else
if (iA and $0FFFFF00) <> $00000000 then bA := 255 else
bA := byte(iA);
if (iB and $80000000) = $80000000 then bB := 0 else
if (iB and $0FFFFF00) <> $00000000 then bB := 255 else
bB := byte(iB);
if (iC and $80000000) = $80000000 then bC := 0 else
if (iC and $0FFFFF00) <> $00000000 then bC := 255 else
bC := byte(iC);
end;
>>>>>> +35% de performances.
type TPixel32Color (_R0, _G=1, _B=2, _A=3);
TPixel32 = array[TPixel32Color] of byte;
et au lieu des nombreux appels a Get?Value a la noix fait ceci :
var Pixel: TPixel32;
Color: TColor;
...
Pixel := TPixel32(Color);
(traitement)
ClampPixCol(cR,cG,cB, Pixel[_r], pixel[_g], pixel[_b]);
Color := TColor(Pixel);
>>>>>> +90% de performances.
le mieux etant de travailler en 32bit avec pour le scan :
TScanLine = array[0..n] of TPixel;
vus le gain de performance on sera toujours mieux qu'en 24bits.
sinon tout le reste semble vraiment nickel.
j'essayerais de tester le compo quand j'aurais le temps :)
27 juin 2008 à 11:45
Si, dans thgrids.pas, tu regardes la procedure TTHBasicGrid.MouseUp, tu verras que l'événement OnCellClick n'est appelé que si on a cliqué sur une cellule de données : if GC.Y >= FixedRows then...
Il est donc très simple d'ajouter un événement "OnHeaderCellClick" si GC.Y < FixedRows.
MAIS : si les options du grid permettent le resize ou le déplacement de colonne, l'événement sera également appelé après ces opérations !
Le plus simple à coder serait de n'appeler l'événement que sur un clic droit.
Désolé de ne pas être plus complet, mais là, je n'ai pas trop le temps.
Thierry
26 juin 2008 à 10:47
peut on ajouter un click sur Header columns pour utiliser le tri
par exemple ??
comment ??
merci
10 mai 2008 à 20:10
La colonne Float du grid est de type ctFloat.
Dans la procedure GridDrawDataCell, il y a conversion de valeur pour affichage avec séparateurs (voir ligne 305 de Mainfrm.pas). Cette conversion est entourée de try... except. Cela ne pose pas de problèmes, sauf si, chez toi, dans les options du débogueur, est coché "Arrêter sur exceptions Delphi". Dans ce cas, il y a notification d'exception, c'est normal.
A +
Thierry
10 mai 2008 à 17:59
J'ai donc voulu voir à quoi ça ressemblait en fonctionnement et patatras, sous Delphi 7, au lancement de l'application :
---------------------------
Notification d'une exception du débogueur
---------------------------
Le projet DemoTThGrid.exe a provoqué une classe d'exception EConvertError avec le message ''' n'est pas une valeur en virgule flottante correcte'. Processus stoppé. Utilisez Pas-à-pas ou Exécuter pour continuer.
---------------------------
OK Aide
---------------------------
sur la ligne 916 de l'unité thgrids.pas :
if AValue <> '' then
DrawCellValue(AValue, ACol, ARow, ARect, AState);
What's wrong ?
8 mai 2008 à 19:07
@Florent : je vois avec plaisir que nous sommes d'accord sur la non-mémorisation.
8 mai 2008 à 17:20
C'est tellement mieux quand tout est séparé.
10/10 sans hésiter.
8 mai 2008 à 15:44
Très joli travail, aussi bien du côté visuel que de la programmation. Il y a beaucoup de choses à prendre. Merci et bravo.
Tigris
8 mai 2008 à 15:42
Tigris
6 mai 2008 à 20:59
@F0xi : merci pour tes conseils. Mais j'ai testé ta façon de faire, et je n'ai aucun gain de temps (dans le cas présent du dessin en dégradé, je précise). Par contre, je répète inutilement des calculs de couleur, alors qu'il suffirait de le faire une fois pour toutes pour la largeur ou la hauteur du bitmap. Et là j'ai un fameux gain de temps. Je ferai la modif pour la prochaine mise à jour.
A +
Thierry
6 mai 2008 à 18:20
Impecc'
A+
6 mai 2008 à 15:26
procedure ClampPixCol(const iA,iB,iC:integer; var bA,bB,bC: byte);
begin
if (iA and $80000000) = $80000000 then bA := 0 else
if (iA and $0FFFFF00) <> $00000000 then bA := 255 else
bA := byte(iA);
if (iB and $80000000) = $80000000 then bB := 0 else
if (iB and $0FFFFF00) <> $00000000 then bB := 255 else
bB := byte(iB);
if (iC and $80000000) = $80000000 then bC := 0 else
if (iC and $0FFFFF00) <> $00000000 then bC := 255 else
bC := byte(iC);
end;
>>>>>> +35% de performances.
type TPixel32Color (_R0, _G=1, _B=2, _A=3);
TPixel32 = array[TPixel32Color] of byte;
et au lieu des nombreux appels a Get?Value a la noix fait ceci :
var Pixel: TPixel32;
Color: TColor;
...
Pixel := TPixel32(Color);
(traitement)
ClampPixCol(cR,cG,cB, Pixel[_r], pixel[_g], pixel[_b]);
Color := TColor(Pixel);
>>>>>> +90% de performances.
le mieux etant de travailler en 32bit avec pour le scan :
TScanLine = array[0..n] of TPixel;
vus le gain de performance on sera toujours mieux qu'en 24bits.
sinon tout le reste semble vraiment nickel.
j'essayerais de tester le compo quand j'aurais le temps :)
6 mai 2008 à 14:45
c'est vraiment très bien bravo
pour le code j'ai pas regardé (pas trop de temps en ce moment)
mais le résultat est bluffant.
rien que pour ça je te félicite
Continue comme ça ;)