Novembre 2024 | Lun | Mar | Mer | Jeu | Ven | Sam | Dim |
---|
| | | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | | Calendrier |
|
|
| KGF_dll - nouvelles versions | |
|
+12JL35 Oscaribout bignono Pedro pascal10000 silverman Jicehel papydall Minibug Marc Yannick Klaus 16 participants | |
Auteur | Message |
---|
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: KGF_dll - nouvelles versions Ven 17 Juil 2020 - 1:09 | |
| KGF.dll V9.18 du 16/07/2020Nouveautés: - nouvelles fonctions: OrganizeSparseGridAsArray, SetSparseGridColumnWidth, SetSparseGridRowHeightModules modifiés: KGF.dll KGF.chmLa doc est à jour. Ces fonctions agissent globalement sur un SparseGrid en entier pour la première fonction, et sur une ligne ou une colonne respectivement pour les autres. La fonction OrganizeSparseGrid permet, en une seule opération, de rassembler l'ensemble des cellules dans un seul objet parent, sous forme d'un tableau compact en deux dimensions, à la manière d'un objet GRID. Les deux autres fonctions changent la largeur ou la hauteur de toutes les cellules d'une ligne ou d'une colonne. Elles permettent en même temps de décaler les cellules à droite ou en-dessous de la cellule modifiée pour éviter des chevauchements si une représentation en tableau est en place, tellle qu'à l'issue de la fonction OrganizeSparseGridAsArray par exemple. De plus, ces valeurs de largeur de cellule pour une colonne sera mémorisée dans le SparseGrid de sorte que toutes les cellules créées dans celle colonne auront cette largeur par défaut. Idem pour la hauteur des cellules dans une ligne. Voici, pour mémoire,, le programme de démo (fonctionnellement inchangé par rapport à la version précédente): - Code:
-
' test_SparceGrid.bas
' ce programme est une démonstration des capacités de l'objet SparseGrid. ' Il représente une version rudimentaire d'une facture, avec 3 lignes de produits. ' Chaque ligne contient 3 champs: prix (à saisir), TVA 20 % et total ligne (calculés automatiquement) ' Dans la form séparée, il y a une cellule de total général qui est la somme des totaux des 3 lignes ' et qui est calculée automatiquement également. ' ' Le tableau est défini par 9 lignes et 5 colonnes, mais tout n'est pas utilise. ' Les lignes 1 à 3 sont les lignes "produit", la ligne 9 est la ligne du total général. Les autres lignes sont indéfinies. ' La colonne 1 est le prix (à saisir). Les colonnes 2 et 3 sont calculées automatiquement. ' La colonne 5 représente les totaux et est calculée automatiquement. Les autres colonnes sont indéfinies. ' ' Un clic sur le bouton "Créer" crée toute la structure. Dans un mémo à droite, on affiche le plan du SparseGrid, ' avec des X à la place des cellules non définies. ' ' On peut maintenant saisir des valeurs dans la première colonne, et on observe les autres cellules ' qui se mettent à jour automatiquement. Les cellules de la première colonne acceptent des valeurs flottantes ' composes de chiffres, du point ou de la virgule décimale (indifféremment !) et éventuellement du signe "-" en première ' position. La saisie dans les autres cellules est bloquée. ' ' Le bouton "Configurer" change la présentation de la preière cellule de la première ligne, à titre d'exemple. ' ' Le bouton "Supprimer" supprime l'ensemble de l'objet SparseGrid. Il peut être récréé, vide, prê à l'emploi. ' ' Le bouton "Calculer" calcule le total des lignes de la colonne 5, identique à ce qui apparaît dans le champ "Tolal".
label userevent, creer, supprimer, configurer, somme
dim SG%, res%, nom$, nom1$, ind1%, data$, fontname$, attrib$, somme, formule$, i%, ident%, lig%, col%
' *** boutons des opérations dll_on "KGF.dll"
height 0,screen_y : width 0,900 button 1 : top 1,0 : left 1,0 : caption 1,"Créer" : on_click 1,creer button 2 : top 2,height(1) : left 2,0 : caption 2,"Supprimer" : on_click 2,supprimer button 3 : top 3,0 : left 3,left(1)+width(1) : caption 3,"Configurer" : on_click 3,configurer button 4 : top 4,height(3) : left 4,left(3) : caption 4,"Somme" : on_click 4,somme
' *** containers pour les cellules container 20 : top 20,100 : left 20,10 : width 20,600 : height 20,80 : caption 20,"Ligne 1" container 21 : top 21,190 : left 21,10 : width 21,600 : height 21,80 : caption 21,"Ligne 2" container 22 : top 22,280 : left 22,10 : width 22,600 : height 22,80 : caption 22,"Ligne 3"
' *** form et container pour la cellule de totalisation form 31 : top 31,80 : left 31,width(0)+10 : width 31,400 : height 31,200 : caption 31,"Total colonne 3" container 29 : parent 29,31 : top 29,20 : left 29,20 : width 29,300 : height 29,80 : caption 29,"Total"
memo 99 : top 99,10 : left 99,620 : width 99,250 : height 99,300 : bar_both 99
on_user_event userevent
caption 0,str$(handle(0))+" "+str$(handle(31)) end
creer: SG% = dll_call1("CreateSparseGrid",17) : ' créer un SparseGrid avec l'identifiant 1 ' message "CreateSparseGrid: "+str$(SG%)
fontname$ = "Arial" attrib$ = "BI" res% = dll_call6("SetSparseGridAttributes",SG%,adr(fontname$),16,adr(attrib$),hex("FFFFFF"),hex("FF")) ' message "SetSparseGridAttributes: "+str$(res%)
for i%=1 to 3 : ' 3 lignes ' *** ligne i% nom$ = "Edit"+str$(i%*10+1) ' res% = dll_call6("CreateSparseCell",SG%,adr(nom$),0,handle(0),i%,1) : ' text ' res% = dll_call6("CreateSparseCell",SG%,adr(nom$),1,handle(0),i%,1) : ' integer ' res% = dll_call6("CreateSparseCell",SG%,adr(nom$),2,handle(0),i%,1) : ' float res% = dll_call6("CreateSparseCell",SG%,adr(nom$),3,handle(19+i%),i%,1) : ' money ' message "CreateSparseCell: "+str$(res%)
res% = dll_call5("PositionSparseCell",SG%,i%,1,20,20) ' message "PositionSparseCell: "+str$(res%)
nom$ = "Edit"+str$(i%*10+2) res% = dll_call6("CreateSparseCell",SG%,adr(nom$),3,handle(19+i%),i%,2) : ' money res% = dll_call5("PositionSparseCell",SG%,i%,2,200,20)
nom$ = "Edit"+str$(i%*10+3) res% = dll_call6("CreateSparseCell",SG%,adr(nom$),3,handle(19+i%),i%,5) : ' money res% = dll_call5("PositionSparseCell",SG%,i%,5,380,20) ' nom$ = "Edit"+str$(i%)+"1" ' nom1$ = "Edit"+str$(i%)+"2" formule$ = "$cell["+str$(i%)+",1]*0.20" res% = dll_call6("AddSparceCellDependancyFormula",SG%,i%,1,i%,2,adr(formule$)) ' message "AddSparceCellDependancyFormula: "+str$(res%)
nom$ = "Edit"+str$(i%)+"2" nom1$ = "Edit"+str$(i%)+"3" formule$ = "$cell[i%,1]+$cell[edit"+str$(i%)+"2]" formule$ = "$sum[edit"+str$(i%)+"1,edit"+str$(i%)+"2]" : ' nom1,nom2 formule$ = "$sum[edit"+str$(i%)+"1,"+str$(i%)+",2]" : ' nom,lig2,col2 formule$ = "$sum["+str$(i%)+",1,edit"+str$(i%)+"2]" : ' lig1,col1,nom2 formule$ = "$sum["+str$(i%)+",1,"+str$(i%)+",2]" : ' lig1,col1,lig2,col2 res% = dll_call6("AddSparceCellDependancyFormula",SG%,i%,2,i%,5,adr(formule$)) ' message "AddSparceCellDependancyFormula: "+str$(res%) next i% ' *** ligne du total nom$ = "Total' res% = dll_call6("CreateSparseCell",SG%,adr(nom$),3,handle(29),9,5) : ' money ' message "CreateSparseCell: "+str$(res%)
res% = dll_call5("PositionSparseCell",SG%,9,5,20,20) ' message "PositionSparseCell: "+str$(res%)
' *** gérer le total général for i%=1 to 3 formule$ = "$sum[1,5,3,5]" res% = dll_call6("AddSparceCellDependancyFormula",SG%,i%,5,9,5,adr(formule$)) next i% ' *** bloquer les cellules calculées res% = dll_call6("BlockSparseCells",SG%,1,2,9,5,1) ' message "BlockSparseCells: "+str$(res%) ' *** autoriser USER_EVENT sur cellule (9,5) res% = dll_call6("SetSparseCellEvents",SG%,9,5,9,5,1) ' message "SetSparseCellEvents: "+str$(res%) res% = dll_call2("TestSparseGrid",SG%,handle(99))
' res% = dll_call4("SetSparseGridColumnWidth",SG%,2,30,1) ' message "SetSparseGridColumnWidth: "+str$(res%)
' res% = dll_call4("SetSparseGridRowHeight",SG%,1,50,1) ' message "SetSparseGridRowHeight: "+str$(res%)
return
supprimer: SG% = dll_call1("DeleteSparseGrid",SG%) ' message "DeleteSparseGrid: "+str$(SG%) clear 99 return
configurer: res% = dll_call5("ResizeSparseCell",SG%,1,1,150,50) ' message "ResizeSparseCell: "+str$(res%) data$ = "11.23" res% = dll_call4("SetSparseCellData",SG%,1,1,adr(data$)) ' message "SetSparseCellData: "+str$(res%)
fontname$ = "Courier" attrib$ = "BU" res% = dll_call6("SetSparseCellAttributes",SG%,adr(fontname$),24,adr(attrib$),1,1) ' message "SetSparseCellAttributes: "+str$(res%)
res% = dll_call5("SetSparseCellColors",SG%,hex("FF0000"),hex("0"),1,1) ' message "SetSparseCellColors: "+str$(res%)
return
somme: res% = dll_call6("CalculateSparseCellSum",SG%,1,1,2,2,adr(somme)) message "CalculateSparseCellSum: "+str$(res%)+" somme="+str$(somme) return
userevent: if bin_and(user_event_wparam,hex("FFFF0000"))=hex("10010000") ident% = bin_and(user_event_wparam,hex("FFFF")) lig% = int(user_event_lparam / 65536) col% = bin_and(user_event_lparam,hex("FFFF")) item_add 99,"Change: ["+str$(lig%)+","+str$(col%)+"]" end_if return
data$ = string$(255," ") res% = dll_call4("GetSparseCellData",SG%,1,1,adr(data$)) data$ = trim$(data$) message "GetSparseCellData: "+str$(res%)+" = "+data$
res% = dll_call2("GetAllSparceCellContents",SG%,handle(99)) message "GetAllSparceCellContents: "+str$(res%)
| |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: KGF_dll - nouvelles versions Sam 18 Juil 2020 - 18:42 | |
| KGF.dll V9.19 du 1/07/2020 Nouveautés: - SparseGrid: correction d'un bug dans le calcul des formules de dépendances - SparseGrid: gestion de la touche TAB pour passer au champ suivant actif et nonh bloquéModules modifiés: KGF.dllLa doc est à jour. Et voici une autre démo, plus realiste celle-ci. C'est un formulaire de facture de 10 lognes produit, avec 6 colonnes: - quantité (laissée en flottant pour pouvoir saisier 2.5 par exemple, pour les produits en vrac) - libelle (texte libre) - prix unitaire - taux de TVA - montant de la TVA de la ligne - totel TTC de la ligne En-desous de ce tableau, il y a une autre ligne (faisant partie du SparseGrid). Pour cette 11ème ligne, seuls les colonnes 5 et 6 sont définis, affichant respectivement le total de la TVA et total TTC. La touche TAB permet de passer d'un champ à l'autre. Voici le code: - Code:
-
' Facture_avec_SparseGrid.bas
label userevent, creer, supprimer, configurer, somme
dim SG%, res%, nom$, nom1$, ind1%, data$, fontname$, attrib$, somme, formule$, i%, ident%, lig%, col%
' *** boutons des opérations dll_on "KGF.dll"
full_space 0 caption 0,"Facture"
on_user_event userevent
gosub creer end
creer: SG% = dll_call1("CreateSparseGrid",17) : ' créer un SparseGrid avec l'identifiant 1 ' message "CreateSparseGrid: "+str$(SG%) alpha 1 : top 1,40 : left 1,25 : caption 1,"Quantité" res% = dll_call4("SetSparseGridColumnWidth",SG%,1,60,0) alpha 2 : top 2,40 : left 2,80 : caption 2,"Libellé" res% = dll_call4("SetSparseGridColumnWidth",SG%,2,200,0) alpha 3 : top 3,40 : left 3,355 : caption 3,"Prix unitaire" res% = dll_call4("SetSparseGridColumnWidth",SG%,3,120,0) alpha 4 : top 4,40 : left 4,450 : caption 4,"Taux TVA" res% = dll_call4("SetSparseGridColumnWidth",SG%,4,80,0) alpha 5 : top 5,40 : left 5,600 : caption 5,"TVA" res% = dll_call4("SetSparseGridColumnWidth",SG%,5,120,0) alpha 6 : top 6,40 : left 6,760 : caption 6,"Prix" res% = dll_call4("SetSparseGridColumnWidth",SG%,6,120,0) alpha 7 : top 7,30+12*30 : left 7,460 : caption 7,"Totaux:" for i%=1 to 10 : ' 10 lignes ' *** ligne i% nom$ = "Quantité"+str$(i%*10+1) res% = dll_call6("CreateSparseCell",SG%,adr(nom$),3,handle(0),i%,1) : ' integer res% = dll_call5("PositionSparseCell",SG%,i%,1,10,30+30*i%)
nom$ = "Libellé"+str$(i%*10+1) res% = dll_call6("CreateSparseCell",SG%,adr(nom$),0,handle(0),i%,2) : ' text res% = dll_call5("PositionSparseCell",SG%,i%,2,80,30+30*i%)
nom$ = "PrixUnit"+str$(i%*10+1) res% = dll_call6("CreateSparseCell",SG%,adr(nom$),3,handle(0),i%,3) : ' money res% = dll_call5("PositionSparseCell",SG%,i%,3,290,30+30*i%)
nom$ = "TauxTVA"+str$(i%*10+1) res% = dll_call6("CreateSparseCell",SG%,adr(nom$),3,handle(0),i%,4) : ' money res% = dll_call5("PositionSparseCell",SG%,i%,4,420,30+30*i%)
nom$ = "TVA"+str$(i%*10+1) res% = dll_call6("CreateSparseCell",SG%,adr(nom$),3,handle(0),i%,5) : ' money res% = dll_call5("PositionSparseCell",SG%,i%,5,510,30+30*i%)
nom$ = "Prix"+str$(i%*10+1) res% = dll_call6("CreateSparseCell",SG%,adr(nom$),3,handle(0),i%,6) : ' money res% = dll_call5("PositionSparseCell",SG%,i%,6,660,30+30*i%)
next i% nom$ = "TotalTVA" res% = dll_call6("CreateSparseCell",SG%,adr(nom$),3,handle(0),11,5) : ' money res% = dll_call5("PositionSparseCell",SG%,11,5,510,30+30*12)
nom$ = "TotalHT" res% = dll_call6("CreateSparseCell",SG%,adr(nom$),3,handle(0),11,6) : ' money res% = dll_call5("PositionSparseCell",SG%,11,6,660,30+30*12)
res% = dll_call6("BlockSparseCells",SG%,1,5,12,6,1) for i%=1 to 11 res% = dll_call5("SetSparseCellColors",SG%,0,hex("FFFF00"),i%,5) res% = dll_call5("SetSparseCellColors",SG%,hex("FFFFFF"),hex("FF8080"),i%,6) next i% for i%=1 to 10 formule$ = "$cell["+str$(i%)+",1]*$cell["+str$(i%)+",3]*$cell["+str$(i%)+",4]/100" res% = dll_call6("AddSparseCellDependancyFormula",SG%,i%,1,i%,5,adr(formule$)) res% = dll_call6("AddSparseCellDependancyFormula",SG%,i%,3,i%,5,adr(formule$)) res% = dll_call6("AddSparseCellDependancyFormula",SG%,i%,4,i%,5,adr(formule$)) formule$ = "$cell["+str$(i%)+",5]+$cell["+str$(i%)+",1]*$cell["+str$(i%)+",3]" res% = dll_call6("AddSparseCellDependancyFormula",SG%,i%,5,i%,6,adr(formule$))
formule$ = "$sum[1,5,10,5]" res% = dll_call6("AddSparseCellDependancyFormula",SG%,i%,5,11,5,adr(formule$)) formule$ = "$sum[1,6,10,6]" res% = dll_call6("AddSparseCellDependancyFormula",SG%,i%,6,11,6,adr(formule$)) next i%
return ' *** gérer le total général for i%=1 to 3 formule$ = "$sum[1,5,3,5]" res% = dll_call6("AddSparseCellDependancyFormula",SG%,i%,5,9,5,adr(formule$)) next i% ' *** bloquer les cellules calculées res% = dll_call6("BlockSparseCells",SG%,1,2,9,5,1) ' message "BlockSparseCells: "+str$(res%) ' *** autoriser USER_EVENT sur cellule (9,5) res% = dll_call6("SetSparseCellEvents",SG%,9,5,9,5,1) ' message "SetSparseCellEvents: "+str$(res%) res% = dll_call5("SetSparseCellComboData",SG%,1,1,handle(98),3) res% = dll_call2("TestSparseGrid",SG%,handle(99))
' res% = dll_call4("SetSparseGridColumnWidth",SG%,2,30,1) ' message "SetSparseGridColumnWidth: "+str$(res%)
' res% = dll_call4("SetSparseGridRowHeight",SG%,1,50,1) ' message "SetSparseGridRowHeight: "+str$(res%)
return
supprimer: SG% = dll_call1("DeleteSparseGrid",SG%) ' message "DeleteSparseGrid: "+str$(SG%) clear 99 return
configurer: res% = dll_call5("ResizeSparseCell",SG%,1,1,150,50) ' message "ResizeSparseCell: "+str$(res%) data$ = "11.23" res% = dll_call4("SetSparseCellData",SG%,1,1,adr(data$)) ' message "SetSparseCellData: "+str$(res%)
fontname$ = "Courier" attrib$ = "BU" res% = dll_call6("SetSparseCellAttributes",SG%,adr(fontname$),24,adr(attrib$),1,1) ' message "SetSparseCellAttributes: "+str$(res%)
res% = dll_call5("SetSparseCellColors",SG%,hex("FF0000"),hex("0"),1,1) ' message "SetSparseCellColors: "+str$(res%)
return
somme: res% = dll_call6("CalculateSparseCellSum",SG%,1,1,2,2,adr(somme)) message "CalculateSparseCellSum: "+str$(res%)+" somme="+str$(somme) return
userevent: if bin_and(user_event_wparam,hex("FFFF0000"))=hex("10010000") ident% = bin_and(user_event_wparam,hex("FFFF")) lig% = int(user_event_lparam / 65536) col% = bin_and(user_event_lparam,hex("FFFF")) item_add 99,"Change: ["+str$(lig%)+","+str$(col%)+"]" end_if return [url=https://servimg.com/view/18686814/634][img]https://i.servimg.com/u/f28/18/68/68/14/aa136.png[/img][/url]
data$ = string$(255," ") res% = dll_call4("GetSparseCellData",SG%,1,1,adr(data$)) data$ = trim$(data$) message "GetSparseCellData: "+str$(res%)+" = "+data$
res% = dll_call2("GetAllSparseCellContents",SG%,handle(99)) message "GetAllSparseCellContents: "+str$(res%)
Et voici de quoi ça a l'air: Sympa, non ? La modification de n'importe quel champ entraîne aussitôt le recalcul de l'ensemble, à chaque touche frappée. | |
| | | Marc
Nombre de messages : 2466 Age : 63 Localisation : TOURS (37) Date d'inscription : 17/03/2014
| Sujet: Re: KGF_dll - nouvelles versions Sam 18 Juil 2020 - 19:36 | |
| - Klaus a écrit:
- Sympa, non ? La modification de n'importe quel champ entraîne aussitôt le recalcul de l'ensemble, à chaque touche frappée.
Oui ! C'est très pro ! J'ai testé : R.A.S. C'est excellent! Bravo Klaus ! | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: KGF_dll - nouvelles versions Sam 18 Juil 2020 - 20:24 | |
| Merci beaucoup, Marc !
La beauté de la chose, c'est que le code Panoramic sert uniquement à créer les objets. Les calculs sont entièrement automatiés au assurés par l'objet SparseGrid, en s'aidant des formules de calcul passées à l'objet. aucun évènement à gérer, aucun crontrôle de cohérence des données à programmer.
Pour obtenir une application réelle, il suffit d'utiliser les fonctions disponibles (voir l'aide !) pour charger éventuellement les données initiales, puis récupérer les données du tableau par le même moyen, en vue d'un enregistrement ou d'une impression, par exemple. | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: KGF_dll - nouvelles versions Dim 26 Juil 2020 - 12:39 | |
| KGF.dll V9.20 du 26/07/2020Nouveautés: -SparseGrid: nouveau type de cellule "Combo" - nouvelle fonction: LoadSparseGridComboCellModules modifiés: KGF.dll KGF.chmLa doc est à jour. Cette version apporte le type de cellule "Combo". On peut y charger des textes ou des valeurs numériques. Dans le programme de démo ci-après (la maquette de facture déjà publiée), j'ai changé le type des cellules "Taux de TVA" en combo contenant la liste des taix de TVA pour loa France. J'ai également activé l'interception des USER_EVENT et on reconnaît bien le changement de taix de TVA et le changement du contenu de la somme totale: - Code:
-
' Facture_avec_SparseGrid.bas
label userevent, creer
dim SG%, res%, nom$, nom1$, ind1%, data$, fontname$, attrib$, somme, formule$, i%, ident%, lig%, col%, s$
' *** boutons des opérations dll_on "KGF.dll"
full_space 0 caption 0,"Facture" memo 98 : hide 98 : bar_both 98 : ' pour contenir les taux possibles de TVA clear 98 item_add 98,"20" item_add 98,"10" item_add 98,"5.5" item_add 98,"2.1" memo 99 : top 99,400 : left 99,10 : bar_both 99 : width 99,300 : height 99,300
on_user_event userevent
gosub creer end
creer: SG% = dll_call1("CreateSparseGrid",17) : ' créer un SparseGrid avec l'identifiant 1 ' message "CreateSparseGrid: "+str$(SG%) alpha 1 : top 1,40 : left 1,25 : caption 1,"Quantité" res% = dll_call4("SetSparseGridColumnWidth",SG%,1,60,0) alpha 2 : top 2,40 : left 2,80 : caption 2,"Libellé" res% = dll_call4("SetSparseGridColumnWidth",SG%,2,200,0) alpha 3 : top 3,40 : left 3,355 : caption 3,"Prix unitaire" res% = dll_call4("SetSparseGridColumnWidth",SG%,3,120,0) alpha 4 : top 4,40 : left 4,450 : caption 4,"Taux TVA" res% = dll_call4("SetSparseGridColumnWidth",SG%,4,80,0) alpha 5 : top 5,40 : left 5,600 : caption 5,"TVA" res% = dll_call4("SetSparseGridColumnWidth",SG%,5,120,0) alpha 6 : top 6,40 : left 6,760 : caption 6,"Prix" res% = dll_call4("SetSparseGridColumnWidth",SG%,6,120,0) alpha 7 : top 7,30+12*30 : left 7,460 : caption 7,"Totaux:" for i%=1 to 10 : ' 10 lignes ' *** ligne i% nom$ = "Quantité"+str$(i%*10+1) res% = dll_call6("CreateSparseCell",SG%,adr(nom$),3,handle(0),i%,1) : ' money res% = dll_call5("PositionSparseCell",SG%,i%,1,10,30+30*i%)
nom$ = "Libellé"+str$(i%*10+1) res% = dll_call6("CreateSparseCell",SG%,adr(nom$),0,handle(0),i%,2) : ' text res% = dll_call5("PositionSparseCell",SG%,i%,2,80,30+30*i%)
nom$ = "PrixUnit"+str$(i%*10+1) res% = dll_call6("CreateSparseCell",SG%,adr(nom$),3,handle(0),i%,3) : ' money res% = dll_call5("PositionSparseCell",SG%,i%,3,290,30+30*i%)
nom$ = "TauxTVA"+str$(i%*10+1) res% = dll_call6("CreateSparseCell",SG%,adr(nom$),4,handle(0),i%,4) : ' money res% = dll_call5("PositionSparseCell",SG%,i%,4,420,30+30*i%) res% = dll_call5("LoadSparseComboCell",SG%,i%,4,1,handle(98)) : ' charger les taux TVA, sélectionner ligne 1
nom$ = "TVA"+str$(i%*10+1) res% = dll_call6("CreateSparseCell",SG%,adr(nom$),3,handle(0),i%,5) : ' money res% = dll_call5("PositionSparseCell",SG%,i%,5,510,30+30*i%)
nom$ = "Prix"+str$(i%*10+1) res% = dll_call6("CreateSparseCell",SG%,adr(nom$),3,handle(0),i%,6) : ' money res% = dll_call5("PositionSparseCell",SG%,i%,6,660,30+30*i%)
next i% nom$ = "TotalTVA" res% = dll_call6("CreateSparseCell",SG%,adr(nom$),3,handle(0),11,5) : ' money res% = dll_call5("PositionSparseCell",SG%,11,5,510,30+30*12)
nom$ = "TotalHT" res% = dll_call6("CreateSparseCell",SG%,adr(nom$),3,handle(0),11,6) : ' money res% = dll_call5("PositionSparseCell",SG%,11,6,660,30+30*12)
for i%=1 to 11 res% = dll_call5("SetSparseCellColors",SG%,0,hex("FFFF00"),i%,5) res% = dll_call5("SetSparseCellColors",SG%,hex("FFFFFF"),hex("FF8080"),i%,6) next i% for i%=1 to 10 formule$ = "$cell["+str$(i%)+",1]*$cell["+str$(i%)+",3]*$cell["+str$(i%)+",4]/100" res% = dll_call6("AddSparseCellDependancyFormula",SG%,i%,1,i%,5,adr(formule$)) res% = dll_call6("AddSparseCellDependancyFormula",SG%,i%,3,i%,5,adr(formule$)) res% = dll_call6("AddSparseCellDependancyFormula",SG%,i%,4,i%,5,adr(formule$)) formule$ = "$cell["+str$(i%)+",5]+$cell["+str$(i%)+",1]*$cell["+str$(i%)+",3]" res% = dll_call6("AddSparseCellDependancyFormula",SG%,i%,5,i%,6,adr(formule$))
formule$ = "$sum[1,5,10,5]" res% = dll_call6("AddSparseCellDependancyFormula",SG%,i%,5,11,5,adr(formule$)) formule$ = "$sum[1,6,10,6]" res% = dll_call6("AddSparseCellDependancyFormula",SG%,i%,6,11,6,adr(formule$)) next i% ' bloquer les cellules calculées res% = dll_call6("BlockSparseCells",SG%,1,5,11,6,1) ' message "BlockSparseCells: "+str$(res%)
' autoriser USER_EVENT sur lec combos et le total général res% = dll_call6("SetSparseCellEvents",SG%,1,4,10,4,1) res% = dll_call6("SetSparseCellEvents",SG%,11,6,11,6,1) return
' traiter USER_EVENT ici userevent: if bin_and(user_event_wparam,hex("FFFF0000"))=hex("10010000") ident% = bin_and(user_event_wparam,hex("FFFF")) lig% = int(user_event_lparam / 65536) col% = bin_and(user_event_lparam,hex("FFFF")) item_add 99,"Change: ["+str$(lig%)+","+str$(col%)+"]" end_if if bin_and(user_event_wparam,hex("FFFF0000"))=hex("10020000") ident% = bin_and(user_event_wparam,hex("FFFF")) lig% = int(user_event_lparam / 65536) col% = bin_and(user_event_lparam,hex("FFFF")) item_add 99,"Combo sélection: ["+str$(lig%)+","+str$(col%)+"]" end_if return
Et voici le résulgtat: | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: KGF_dll - nouvelles versions Mar 28 Juil 2020 - 10:53 | |
| Sans changement dans KGF.dll, juste en déclarant 2 champs supplémentaires et une formule de calcul supplémentaire, j'ai ajouté le traitement d'unacompte versé qui sera déduit du total général pour établir le montant à payer réel: - Code:
-
' Facture_avec_SparseGrid.bas
label userevent, creer
dim SG%, res%, nom$, nom1$, ind1%, data$, fontname$, attrib$, somme, formule$, i%, ident%, lig%, col%, s$
' *** boutons des opérations dll_on "KGF.dll"
full_space 0 caption 0,"Facture" memo 98 : hide 98 : bar_both 98 : ' pour contenir les taux possibles de TVA clear 98 item_add 98,"20" item_add 98,"10" item_add 98,"5.5" item_add 98,"2.1" memo 99 : top 99,400 : left 99,10 : bar_both 99 : width 99,300 : height 99,300
on_user_event userevent
gosub creer end
creer: SG% = dll_call1("CreateSparseGrid",17) : ' créer un SparseGrid avec l'identifiant 1 ' message "CreateSparseGrid: "+str$(SG%) alpha 1 : top 1,40 : left 1,25 : caption 1,"Quantité" res% = dll_call4("SetSparseGridColumnWidth",SG%,1,60,0) alpha 2 : top 2,40 : left 2,80 : caption 2,"Libellé" res% = dll_call4("SetSparseGridColumnWidth",SG%,2,200,0) alpha 3 : top 3,40 : left 3,355 : caption 3,"Prix unitaire" res% = dll_call4("SetSparseGridColumnWidth",SG%,3,120,0) alpha 4 : top 4,40 : left 4,450 : caption 4,"Taux TVA" res% = dll_call4("SetSparseGridColumnWidth",SG%,4,80,0) alpha 5 : top 5,40 : left 5,600 : caption 5,"TVA" res% = dll_call4("SetSparseGridColumnWidth",SG%,5,120,0) alpha 6 : top 6,40 : left 6,760 : caption 6,"Prix" res% = dll_call4("SetSparseGridColumnWidth",SG%,6,120,0) alpha 7 : top 7,30+12*30 : left 7,460 : caption 7,"Totaux:" alpha 8 : top 8,30+14*30 : left 8,460 : caption 8,"Acompte: " alpha 9 : top 9,30+16*30 : left 9,460 : caption 9,"A payer: " for i%=1 to 10 : ' 10 lignes ' *** ligne i% nom$ = "Quantité"+str$(i%*10+1) res% = dll_call6("CreateSparseCell",SG%,adr(nom$),3,handle(0),i%,1) : ' money res% = dll_call5("PositionSparseCell",SG%,i%,1,10,30+30*i%)
nom$ = "Libellé"+str$(i%*10+1) res% = dll_call6("CreateSparseCell",SG%,adr(nom$),0,handle(0),i%,2) : ' text res% = dll_call5("PositionSparseCell",SG%,i%,2,80,30+30*i%)
nom$ = "PrixUnit"+str$(i%*10+1) res% = dll_call6("CreateSparseCell",SG%,adr(nom$),3,handle(0),i%,3) : ' money res% = dll_call5("PositionSparseCell",SG%,i%,3,290,30+30*i%)
nom$ = "TauxTVA"+str$(i%*10+1) res% = dll_call6("CreateSparseCell",SG%,adr(nom$),4,handle(0),i%,4) : ' money res% = dll_call5("PositionSparseCell",SG%,i%,4,420,30+30*i%) res% = dll_call5("LoadSparseComboCell",SG%,i%,4,1,handle(98)) : ' charger les taux TVA, sélectionner ligne 1
nom$ = "TVA"+str$(i%*10+1) res% = dll_call6("CreateSparseCell",SG%,adr(nom$),3,handle(0),i%,5) : ' money res% = dll_call5("PositionSparseCell",SG%,i%,5,510,30+30*i%)
nom$ = "Prix"+str$(i%*10+1) res% = dll_call6("CreateSparseCell",SG%,adr(nom$),3,handle(0),i%,6) : ' money res% = dll_call5("PositionSparseCell",SG%,i%,6,660,30+30*i%)
next i% nom$ = "TotalTVA" res% = dll_call6("CreateSparseCell",SG%,adr(nom$),3,handle(0),11,5) : ' money res% = dll_call5("PositionSparseCell",SG%,11,5,510,30+30*12)
nom$ = "TotalTTC" res% = dll_call6("CreateSparseCell",SG%,adr(nom$),3,handle(0),11,6) : ' money res% = dll_call5("PositionSparseCell",SG%,11,6,660,30+30*12)
nom$ = "Acompte" res% = dll_call6("CreateSparseCell",SG%,adr(nom$),3,handle(0),12,6) : ' money res% = dll_call5("PositionSparseCell",SG%,12,6,660,30+30*14)
nom$ = "APayer" res% = dll_call6("CreateSparseCell",SG%,adr(nom$),3,handle(0),13,6) : ' money res% = dll_call5("PositionSparseCell",SG%,13,6,660,30+30*16)
for i%=1 to 11 res% = dll_call5("SetSparseCellColors",SG%,0,hex("FFFF00"),i%,5) res% = dll_call5("SetSparseCellColors",SG%,hex("FFFFFF"),hex("FF8080"),i%,6) next i% res% = dll_call5("SetSparseCellColors",SG%,hex("FFFFFF"),hex("FF8080"),13,6) for i%=1 to 10 formule$ = "$cell["+str$(i%)+",1]*$cell["+str$(i%)+",3]*$cell["+str$(i%)+",4]/100" res% = dll_call6("AddSparseCellDependancyFormula",SG%,i%,1,i%,5,adr(formule$)) res% = dll_call6("AddSparseCellDependancyFormula",SG%,i%,3,i%,5,adr(formule$)) res% = dll_call6("AddSparseCellDependancyFormula",SG%,i%,4,i%,5,adr(formule$)) formule$ = "$cell["+str$(i%)+",5]+$cell["+str$(i%)+",1]*$cell["+str$(i%)+",3]" res% = dll_call6("AddSparseCellDependancyFormula",SG%,i%,5,i%,6,adr(formule$))
formule$ = "$sum[1,5,10,5]" res% = dll_call6("AddSparseCellDependancyFormula",SG%,i%,5,11,5,adr(formule$)) formule$ = "$sum[1,6,10,6]" res% = dll_call6("AddSparseCellDependancyFormula",SG%,i%,6,11,6,adr(formule$)) next i%
formule$ = "$cell[11,6]-$cell[12,6]" res% = dll_call6("AddSparseCellDependancyFormula",SG%,11,6,13,6,adr(formule$)) formule$ = "$cell[11,6]-$cell[12,6]" res% = dll_call6("AddSparseCellDependancyFormula",SG%,12,6,13,6,adr(formule$)) ' bloquer les cellules calculées res% = dll_call6("BlockSparseCells",SG%,1,5,11,6,1) res% = dll_call6("BlockSparseCells",SG%,13,6,13,6,1) ' message "BlockSparseCells: "+str$(res%)
' autoriser USER_EVENT sur les combos et le total à payer res% = dll_call6("SetSparseCellEvents",SG%,1,4,10,4,1) res% = dll_call6("SetSparseCellEvents",SG%,13,6,13,6,1) return
' traiter USER_EVENT ici userevent: if bin_and(user_event_wparam,hex("FFFF0000"))=hex("10010000") ident% = bin_and(user_event_wparam,hex("FFFF")) lig% = int(user_event_lparam / 65536) col% = bin_and(user_event_lparam,hex("FFFF")) item_add 99,"Change: ["+str$(lig%)+","+str$(col%)+"]" end_if if bin_and(user_event_wparam,hex("FFFF0000"))=hex("10020000") ident% = bin_and(user_event_wparam,hex("FFFF")) lig% = int(user_event_lparam / 65536) col% = bin_and(user_event_lparam,hex("FFFF")) item_add 99,"Combo sélection: ["+str$(lig%)+","+str$(col%)+"]" end_if return
data$ = string$(255," ") res% = dll_call4("GetSparseCellData",SG%,1,1,adr(data$)) data$ = trim$(data$) message "GetSparseCellData: "+str$(res%)+" = "+data$
res% = dll_call2("GetAllSparseCellContents",SG%,handle(99)) message "GetAllSparseCellContents: "+str$(res%)
Et voici ce que ça donne: | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: KGF_dll - nouvelles versions Sam 1 Aoû 2020 - 11:53 | |
| KGF.dll V9.21 du 31/07/2020Nouveautés: -Nouvelles fonctions: Nouvelles fonctions: GetSparseCellIndexFromName, GetSparseCellDataFromName - IconListBox: ignorer le double clicModules modifiés: KGF.dll KGF.chmLa doc est à jour. Les nouvelles fonctions permettent d'interroger le SparseGrid en donnant le nom d'une cellule. Dans la démo, j'au ajouté une combo donnant le nom de 4 cellules signiicatives. En choisissant un de ces noms, puis en cliquant sur le bouton en-dessous, le contenu de la cellule du nom sélectionné sera affiché: - Code:
-
' Facture_avec_SparseGrid.bas
label userevent, creer, lire
dim SG%, res%, nom$, nom1$, ind1%, data$, fontname$, attrib$, somme, formule$, i%, ident%, lig%, col%, s$, donnee
' *** boutons des opérations dll_on "KGF.dll"
full_space 0 caption 0,"Facture" memo 98 : hide 98 : bar_both 98 : ' pour contenir les taux possibles de TVA clear 98 item_add 98,"20" item_add 98,"10" item_add 98,"5.5" item_add 98,"2.1" memo 99 : top 99,400 : left 99,10 : bar_both 99 : width 99,300 : height 99,300
on_user_event userevent
gosub creer end
creer: SG% = dll_call1("CreateSparseGrid",17) : ' créer un SparseGrid avec l'identifiant 1 ' message "CreateSparseGrid: "+str$(SG%) alpha 1 : top 1,40 : left 1,25 : caption 1,"Quantité" res% = dll_call4("SetSparseGridColumnWidth",SG%,1,60,0) alpha 2 : top 2,40 : left 2,80 : caption 2,"Libellé" res% = dll_call4("SetSparseGridColumnWidth",SG%,2,200,0) alpha 3 : top 3,40 : left 3,355 : caption 3,"Prix unitaire" res% = dll_call4("SetSparseGridColumnWidth",SG%,3,120,0) alpha 4 : top 4,40 : left 4,450 : caption 4,"Taux TVA" res% = dll_call4("SetSparseGridColumnWidth",SG%,4,80,0) alpha 5 : top 5,40 : left 5,600 : caption 5,"TVA" res% = dll_call4("SetSparseGridColumnWidth",SG%,5,120,0) alpha 6 : top 6,40 : left 6,760 : caption 6,"Prix" res% = dll_call4("SetSparseGridColumnWidth",SG%,6,120,0) alpha 7 : top 7,30+12*30 : left 7,460 : caption 7,"Totaux:" alpha 8 : top 8,30+14*30 : left 8,460 : caption 8,"Acompte: " alpha 9 : top 9,30+16*30 : left 9,460 : caption 9,"A payer: " combo 20 : top 20,570 : left 20,400 : width 20,150 item_add 20,"TotalTVA" item_add 20,"TotalTTC" item_add 20,"Acompte" item_add 20,"APayer" button 21 : top 21,600 : left 21,400 : width 21,150 : caption 21,"Récupérer données" on_click 21,lire for i%=1 to 10 : ' 10 lignes ' *** ligne i% nom$ = "Quantité"+str$(i%*10+1) res% = dll_call6("CreateSparseCell",SG%,adr(nom$),3,handle(0),i%,1) : ' money res% = dll_call5("PositionSparseCell",SG%,i%,1,10,30+30*i%)
nom$ = "Libellé"+str$(i%*10+1) res% = dll_call6("CreateSparseCell",SG%,adr(nom$),0,handle(0),i%,2) : ' text res% = dll_call5("PositionSparseCell",SG%,i%,2,80,30+30*i%)
nom$ = "PrixUnit"+str$(i%*10+1) res% = dll_call6("CreateSparseCell",SG%,adr(nom$),3,handle(0),i%,3) : ' money res% = dll_call5("PositionSparseCell",SG%,i%,3,290,30+30*i%)
nom$ = "TauxTVA"+str$(i%*10+1) res% = dll_call6("CreateSparseCell",SG%,adr(nom$),4,handle(0),i%,4) : ' money res% = dll_call5("PositionSparseCell",SG%,i%,4,420,30+30*i%) res% = dll_call5("LoadSparseComboCell",SG%,i%,4,1,handle(98)) : ' charger les taux TVA, sélectionner ligne 1
nom$ = "TVA"+str$(i%*10+1) res% = dll_call6("CreateSparseCell",SG%,adr(nom$),3,handle(0),i%,5) : ' money res% = dll_call5("PositionSparseCell",SG%,i%,5,510,30+30*i%)
nom$ = "Prix"+str$(i%*10+1) res% = dll_call6("CreateSparseCell",SG%,adr(nom$),3,handle(0),i%,6) : ' money res% = dll_call5("PositionSparseCell",SG%,i%,6,660,30+30*i%)
next i% nom$ = "TotalTVA" res% = dll_call6("CreateSparseCell",SG%,adr(nom$),3,handle(0),11,5) : ' money res% = dll_call5("PositionSparseCell",SG%,11,5,510,30+30*12)
nom$ = "TotalTTC" res% = dll_call6("CreateSparseCell",SG%,adr(nom$),3,handle(0),11,6) : ' money res% = dll_call5("PositionSparseCell",SG%,11,6,660,30+30*12)
nom$ = "Acompte" res% = dll_call6("CreateSparseCell",SG%,adr(nom$),3,handle(0),12,6) : ' money res% = dll_call5("PositionSparseCell",SG%,12,6,660,30+30*14)
nom$ = "APayer" res% = dll_call6("CreateSparseCell",SG%,adr(nom$),3,handle(0),13,6) : ' money res% = dll_call5("PositionSparseCell",SG%,13,6,660,30+30*16)
for i%=1 to 11 res% = dll_call5("SetSparseCellColors",SG%,0,hex("FFFF00"),i%,5) res% = dll_call5("SetSparseCellColors",SG%,hex("FFFFFF"),hex("FF8080"),i%,6) next i% res% = dll_call5("SetSparseCellColors",SG%,hex("FFFFFF"),hex("FF8080"),13,6) for i%=1 to 10 formule$ = "$cell["+str$(i%)+",1]*$cell["+str$(i%)+",3]*$cell["+str$(i%)+",4]/100" res% = dll_call6("AddSparseCellDependancyFormula",SG%,i%,1,i%,5,adr(formule$)) res% = dll_call6("AddSparseCellDependancyFormula",SG%,i%,3,i%,5,adr(formule$)) res% = dll_call6("AddSparseCellDependancyFormula",SG%,i%,4,i%,5,adr(formule$)) formule$ = "$cell["+str$(i%)+",5]+$cell["+str$(i%)+",1]*$cell["+str$(i%)+",3]" res% = dll_call6("AddSparseCellDependancyFormula",SG%,i%,5,i%,6,adr(formule$))
formule$ = "$sum[1,5,10,5]" res% = dll_call6("AddSparseCellDependancyFormula",SG%,i%,5,11,5,adr(formule$)) formule$ = "$sum[1,6,10,6]" res% = dll_call6("AddSparseCellDependancyFormula",SG%,i%,6,11,6,adr(formule$)) next i%
formule$ = "$cell[11,6]-$cell[12,6]" res% = dll_call6("AddSparseCellDependancyFormula",SG%,11,6,13,6,adr(formule$)) formule$ = "$cell[11,6]-$cell[12,6]" res% = dll_call6("AddSparseCellDependancyFormula",SG%,12,6,13,6,adr(formule$)) ' bloquer les cellules calculées res% = dll_call6("BlockSparseCells",SG%,1,5,11,6,1) res% = dll_call6("BlockSparseCells",SG%,13,6,13,6,1) ' message "BlockSparseCells: "+str$(res%)
' autoriser USER_EVENT sur les combos et le total à payer res% = dll_call6("SetSparseCellEvents",SG%,1,4,10,4,1) res% = dll_call6("SetSparseCellEvents",SG%,13,6,13,6,1) return lire: nom$ = text$(20) if trim$(nom$)="" message "Sélectionner un nom svp" return end_if res% = dll_call3("GetSparseCellDataFromName",SG%,adr(nom$),adr(donnee)) message "La cellule "+nom$+" contient la valeur de "+str$(donnee) return
' traiter USER_EVENT ici userevent: if bin_and(user_event_wparam,hex("FFFF0000"))=hex("10010000") ident% = bin_and(user_event_wparam,hex("FFFF")) lig% = int(user_event_lparam / 65536) col% = bin_and(user_event_lparam,hex("FFFF")) item_add 99,"Change: ["+str$(lig%)+","+str$(col%)+"]" end_if if bin_and(user_event_wparam,hex("FFFF0000"))=hex("10020000") ident% = bin_and(user_event_wparam,hex("FFFF")) lig% = int(user_event_lparam / 65536) col% = bin_and(user_event_lparam,hex("FFFF")) item_add 99,"Combo sélection: ["+str$(lig%)+","+str$(col%)+"]" end_if return
| |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: KGF_dll - nouvelles versions Dim 2 Aoû 2020 - 21:05 | |
| KGF.dll V9.22 du 02/08/2020Nouveautés: -GetExportedNamesFromDLL: retourner le nombre de fonctions exportéesModules modifiés: KGF.dllLa doc est à jour. Voici une petite démo qui affiche les noms de toutes les fonctions exportées par KGF.dll: - Code:
-
' Liste des fonctions KGF.dll.bas
dim res%, dll$
width 0,300 : height 0,700 list 1 : full_space 1
dll_on "KGF.dll" dll$ = "KGF.dll" res% = dll_call2("GetExportedNamesFromDLL",adr(dll$),handle(1)) message str$(res%)+" fonctions exportées" end
Essayez-le - cela donneune petite idée... | |
| | | Minibug
Nombre de messages : 4570 Age : 58 Localisation : Vienne (86) Date d'inscription : 09/02/2012
| Sujet: Re: KGF_dll - nouvelles versions Dim 2 Aoû 2020 - 22:29 | |
| Combien ???? Oui c'est vrai que KGF est devenu une vrai mine d'or mais quand même... Pour ma part j'en dénombre 1535, ce qui est déjà très impressionnant ! Bravo Klaus, et continu comme ça, tu es un champion ! EDIT : Ben oui, je n'avais pas la dernière version. c'est normal !
Dernière édition par Minibug le Lun 3 Aoû 2020 - 7:24, édité 2 fois | |
| | | Marc
Nombre de messages : 2466 Age : 63 Localisation : TOURS (37) Date d'inscription : 17/03/2014
| Sujet: Re: KGF_dll - nouvelles versions Dim 2 Aoû 2020 - 22:56 | |
| Bonsoir à tous ! 1581 fonctions offertes généreusement par Klaus ! MERCI klaus ! | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: KGF_dll - nouvelles versions Lun 3 Aoû 2020 - 16:37 | |
| KGF.dll V9.22 du 02/08/2020 Nouveautés: - SparseGrid: nouveau type de cellule FloatCombo. - ancien type Combo devient TextCombo. - une cellule TextCombo a la valeur 0 dans une formule de calcul.Modules modifiés: KGF.dll KGF.dllLa doc est à jour. Il y avait une incohérence de logique: avoir des cellules normales de type texte et de type numérique, mais des cellules combo "hybrides", interprétées tant comme texte, tant comme valeur flottante, selon les circonstances. Pire: une combo contenant du texte "plante" le programme si elle est utilisée dans une formule. Ceci est résolu maintenant. On a maintenant deux types de combos: - combo texte - combo flottant Seuls les combos flottants fournissent une valeur significative dans une formule. Le combo texte fournit toujours la valeur 0 (zéro) dans une formule, quelque soit son contenu. En plus, lors du chargement de lignes dans un combo flottant, les lignes ne contenant pas une valeur numérique valide sont simplement ignorées. Dans le programme de démo "maquett de facture", le seul changement consiste à utiliser le type 5 (combo flottant) au lieu du type 4 (combo texte). Cependant, en commentaire, il y a l'ancienne version (avec type 4) avec des explications. Tel quel, la facture fonctionne exactement comme avent. Si par contre, on désactive la ligne avec le code 5 en réactivant la ligne avec le code 4, on constate que la valeur du taux de TVA est prise comme 0 (zéro), quelque sont son contenu. Les autres calculs se déroulent normalement: - Code:
-
' Facture_avec_SparseGrid.bas
label userevent, creer, lire
dim SG%, res%, nom$, nom1$, ind1%, data$, fontname$, attrib$, somme, formule$, i%, ident%, lig%, col%, s$, donnee
' *** boutons des opérations dll_on "KGF.dll"
full_space 0 caption 0,"Facture" memo 98 : hide 98 : bar_both 98 : ' pour contenir les taux possibles de TVA clear 98 item_add 98,"20" item_add 98,"10" item_add 98,"5.5" item_add 98,"2.1" memo 99 : top 99,400 : left 99,10 : bar_both 99 : width 99,300 : height 99,300
on_user_event userevent
gosub creer end
creer: SG% = dll_call1("CreateSparseGrid",17) : ' créer un SparseGrid avec l'identifiant 1 ' message "CreateSparseGrid: "+str$(SG%) alpha 1 : top 1,40 : left 1,25 : caption 1,"Quantité" res% = dll_call4("SetSparseGridColumnWidth",SG%,1,60,0) alpha 2 : top 2,40 : left 2,80 : caption 2,"Libellé" res% = dll_call4("SetSparseGridColumnWidth",SG%,2,200,0) alpha 3 : top 3,40 : left 3,355 : caption 3,"Prix unitaire" res% = dll_call4("SetSparseGridColumnWidth",SG%,3,120,0) alpha 4 : top 4,40 : left 4,450 : caption 4,"Taux TVA" res% = dll_call4("SetSparseGridColumnWidth",SG%,4,80,0) alpha 5 : top 5,40 : left 5,600 : caption 5,"TVA" res% = dll_call4("SetSparseGridColumnWidth",SG%,5,120,0) alpha 6 : top 6,40 : left 6,760 : caption 6,"Prix" res% = dll_call4("SetSparseGridColumnWidth",SG%,6,120,0) alpha 7 : top 7,30+12*30 : left 7,460 : caption 7,"Totaux:" alpha 8 : top 8,30+14*30 : left 8,460 : caption 8,"Acompte: " alpha 9 : top 9,30+16*30 : left 9,460 : caption 9,"A payer: " combo 20 : top 20,570 : left 20,400 : width 20,150 item_add 20,"TotalTVA" item_add 20,"TotalTTC" item_add 20,"Acompte" item_add 20,"APayer" button 21 : top 21,600 : left 21,400 : width 21,150 : caption 21,"Récupérer données" on_click 21,lire for i%=1 to 10 : ' 10 lignes ' *** ligne i% nom$ = "Quantité"+str$(i%*10+1) res% = dll_call6("CreateSparseCell",SG%,adr(nom$),3,handle(0),i%,1) : ' money res% = dll_call5("PositionSparseCell",SG%,i%,1,10,30+30*i%)
nom$ = "Libellé"+str$(i%*10+1) res% = dll_call6("CreateSparseCell",SG%,adr(nom$),0,handle(0),i%,2) : ' text res% = dll_call5("PositionSparseCell",SG%,i%,2,80,30+30*i%)
nom$ = "PrixUnit"+str$(i%*10+1) res% = dll_call6("CreateSparseCell",SG%,adr(nom$),3,handle(0),i%,3) : ' money res% = dll_call5("PositionSparseCell",SG%,i%,3,290,30+30*i%)
nom$ = "TauxTVA"+str$(i%*10+1) ' res% = dll_call6("CreateSparseCell",SG%,adr(nom$),4,handle(0),i%,4) : ' text combo ' Cette ligne n'a plus de sens car l'ancien tpe 4 (Combo) a été redéfini comme TextCombo. ' Or, un contenu texte ne peut avoir de signification dans un calcul. res% = dll_call6("CreateSparseCell",SG%,adr(nom$),5,handle(0),i%,4) : ' float combo ' Ce nouveau tpe de cellule (FloatCombo) remplace l'ancien type Combo dans ce programme. ' Ainsi, le taux de TVA continue à être pris en compte. res% = dll_call5("PositionSparseCell",SG%,i%,4,420,30+30*i%) res% = dll_call5("LoadSparseComboCell",SG%,i%,4,1,handle(98)) : ' charger les taux TVA, sélectionner ligne 1
nom$ = "TVA"+str$(i%*10+1) res% = dll_call6("CreateSparseCell",SG%,adr(nom$),3,handle(0),i%,5) : ' money res% = dll_call5("PositionSparseCell",SG%,i%,5,510,30+30*i%)
nom$ = "Prix"+str$(i%*10+1) res% = dll_call6("CreateSparseCell",SG%,adr(nom$),3,handle(0),i%,6) : ' money res% = dll_call5("PositionSparseCell",SG%,i%,6,660,30+30*i%)
next i% nom$ = "TotalTVA" res% = dll_call6("CreateSparseCell",SG%,adr(nom$),3,handle(0),11,5) : ' money res% = dll_call5("PositionSparseCell",SG%,11,5,510,30+30*12)
nom$ = "TotalTTC" res% = dll_call6("CreateSparseCell",SG%,adr(nom$),3,handle(0),11,6) : ' money res% = dll_call5("PositionSparseCell",SG%,11,6,660,30+30*12)
nom$ = "Acompte" res% = dll_call6("CreateSparseCell",SG%,adr(nom$),3,handle(0),12,6) : ' money res% = dll_call5("PositionSparseCell",SG%,12,6,660,30+30*14)
nom$ = "APayer" res% = dll_call6("CreateSparseCell",SG%,adr(nom$),3,handle(0),13,6) : ' money res% = dll_call5("PositionSparseCell",SG%,13,6,660,30+30*16)
for i%=1 to 11 res% = dll_call5("SetSparseCellColors",SG%,0,hex("FFFF00"),i%,5) res% = dll_call5("SetSparseCellColors",SG%,hex("FFFFFF"),hex("FF8080"),i%,6) next i% res% = dll_call5("SetSparseCellColors",SG%,hex("FFFFFF"),hex("FF8080"),13,6) for i%=1 to 10 formule$ = "$cell["+str$(i%)+",1]*$cell["+str$(i%)+",3]*$cell["+str$(i%)+",4]/100" res% = dll_call6("AddSparseCellDependancyFormula",SG%,i%,1,i%,5,adr(formule$)) res% = dll_call6("AddSparseCellDependancyFormula",SG%,i%,3,i%,5,adr(formule$)) res% = dll_call6("AddSparseCellDependancyFormula",SG%,i%,4,i%,5,adr(formule$)) formule$ = "$cell["+str$(i%)+",5]+$cell["+str$(i%)+",1]*$cell["+str$(i%)+",3]" res% = dll_call6("AddSparseCellDependancyFormula",SG%,i%,5,i%,6,adr(formule$))
formule$ = "$sum[1,5,10,5]" res% = dll_call6("AddSparseCellDependancyFormula",SG%,i%,5,11,5,adr(formule$)) formule$ = "$sum[1,6,10,6]" res% = dll_call6("AddSparseCellDependancyFormula",SG%,i%,6,11,6,adr(formule$)) next i%
formule$ = "$cell[11,6]-$cell[12,6]" res% = dll_call6("AddSparseCellDependancyFormula",SG%,11,6,13,6,adr(formule$)) formule$ = "$cell[11,6]-$cell[12,6]" res% = dll_call6("AddSparseCellDependancyFormula",SG%,12,6,13,6,adr(formule$)) ' bloquer les cellules calculées res% = dll_call6("BlockSparseCells",SG%,1,5,11,6,1) res% = dll_call6("BlockSparseCells",SG%,13,6,13,6,1) ' message "BlockSparseCells: "+str$(res%)
' autoriser USER_EVENT sur les combos et le total à payer res% = dll_call6("SetSparseCellEvents",SG%,1,4,10,4,1) res% = dll_call6("SetSparseCellEvents",SG%,13,6,13,6,1) return lire: nom$ = text$(20) if trim$(nom$)="" message "Sélectionner un nom svp" return end_if res% = dll_call3("GetSparseCellDataFromName",SG%,adr(nom$),adr(donnee)) message "La cellule "+nom$+" contient la valeur de "+str$(donnee) return
' traiter USER_EVENT ici userevent: if bin_and(user_event_wparam,hex("FFFF0000"))=hex("10010000") ident% = bin_and(user_event_wparam,hex("FFFF")) lig% = int(user_event_lparam / 65536) col% = bin_and(user_event_lparam,hex("FFFF")) item_add 99,"Change: ["+str$(lig%)+","+str$(col%)+"]" end_if if bin_and(user_event_wparam,hex("FFFF0000"))=hex("10020000") ident% = bin_and(user_event_wparam,hex("FFFF")) lig% = int(user_event_lparam / 65536) col% = bin_and(user_event_lparam,hex("FFFF")) item_add 99,"Combo sélection: ["+str$(lig%)+","+str$(col%)+"]" end_if return
| |
| | | Marc
Nombre de messages : 2466 Age : 63 Localisation : TOURS (37) Date d'inscription : 17/03/2014
| Sujet: Re: KGF_dll - nouvelles versions Mar 4 Aoû 2020 - 14:12 | |
| Bonjour Klaus et bonjour à tous ! Dans ton source-exemple, les taux de TVA qui possèdent un point comme séparateur décimal ne s’affichent pas dans les combos TauxTVA. Dans le memo 98, si je remplace les points par des virgules alors ça fonctionne. En image : Seuls les taux 20% et 10% sont présents. Il manque les taux de 5.5% et 2.1% Toujours depuis ton source-exemple, la fonction GetSparseCellDataFromName ne fonctionne pas : la valeur de la cellule ciblée n’est pas affichée. Le retour de fonction (res%) est -1. Peut-être dû à la présence des points décimaux ? Bien entendu, j'ai bien téléchargé la dernière version de KGF. Merci Klaus et bon courage pour la suite. EDIT :Dans le ZIP de l’aide (KGF.chm), il y a d’encapsulé un autre zip qui contient une ancienne version de KGF.chm En image : | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: KGF_dll - nouvelles versions Mar 4 Aoû 2020 - 14:33 | |
| Tiens, bizarre: et: Je ne m'explique pas la différence... | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: KGF_dll - nouvelles versions Mar 4 Aoû 2020 - 14:55 | |
| KGF.dll V9.24 du 04/08/2020
Nouveautés: - LoadSparseComboCell: convertir automatiquement "," ou "." en séparateur décimal du système
Modules modifiés: KGF.dll KGF.chm
La doc est à jour.
Le fichier ZIP pour KGF.chm a été recréé proprement. | |
| | | Marc
Nombre de messages : 2466 Age : 63 Localisation : TOURS (37) Date d'inscription : 17/03/2014
| Sujet: Re: KGF_dll - nouvelles versions Mar 4 Aoû 2020 - 15:12 | |
| LoadSparseComboCell : c’est bon ! GetSparseCellDataFromName* : pas bon KGF.chm : c’est bon ! *Tests effectués sous Win10 et Win7 EDIT :A toute fin utile : Un jour tu avais demandé : - Citation :
- Chez moi, le paramètre système "DecimalSeparator" est le point.
Sur tous les ordinateurs présents ici, tous installés en français, aussi bien sur Win10 que sur Win7, le "DecimalSeparator" est la virgule. Cette précision est trouvée dans les paramètres régionaux de l'OS. Si ça peut t'aider... | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: KGF_dll - nouvelles versions Mar 4 Aoû 2020 - 16:09 | |
| J'ai fait une petite correction dans KGF.dll - si tu veux bien recharger, ça devrait marcher maintenant. | |
| | | Marc
Nombre de messages : 2466 Age : 63 Localisation : TOURS (37) Date d'inscription : 17/03/2014
| Sujet: Re: KGF_dll - nouvelles versions Mar 4 Aoû 2020 - 16:14 | |
| Yesss !
C'est parfait !
Merci Klaus ! | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: KGF_dll - nouvelles versions Mar 4 Aoû 2020 - 16:48 | |
| | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: KGF_dll - nouvelles versions Mar 11 Aoû 2020 - 11:44 | |
| KGF.dll V9.25 du 11/08/2020Nouveautés: - nouvelles fonctions: InitGlobalMouseHook, CreateGlobalMouseHook, KillGlobalMouseHookModules modifiés: KGF.dllLa doc suivra prochainement. Voici un programme de démo qui montre l'utilisation très simple de ces fonctions. Notons que pour la fonction CreateGlobalMouseHook, le handle à passer (ici, la liste des handles de tous les objets, y compris la form 0) est le handle de l'objet à surveiller. Ca peut être n'importe quel objet ayant un handle. - Code:
-
' test_InterceptMouseWheelEvents.bas
label user, fini
dim res%, nh%, event%, typ%, wp%, lp%, handles$, nobj%, i%, bloquages$
dll_on "KGF.dll"
memo 1 : bar_both 1 alpha 2 : left 2,300 : top 2,10 : caption 2,"Un alpha pour test..." panel 3 : parent 3,0 : top 3,200 : left 3,300 edit 4 : parent 4,3 : top 4,20 : left 4,10 edit 5 : top 5,60 : left 5,300
form 11 : top 11,200 : left 11,width(0) + 10 memo 12 : parent 12,11 : bar_both 12
for i%=0 to 9 item_add 1,str$(i%) item_add 12,str$(i%) next i% handles$ = str$(handle(0))+","+str$(handle(1))+","+str$(handle(3))+","+str$(handle(4))+","+str$(handle(5)) ' placer un élément dans l variable bloquages$ par objet placé dans handles$ ' 0 = laisser Windows traiter l'évènement molette ' 1 = bloquer l'action de Windows sur l'évènement molette bloquages$ = "1"+","+"0"+","+"1"+","+"1"+","+"1" : ' activer cette ligne pour laisser Windows sur le MEMO 1 ' bloquages$ = "1"+","+"1"+","+"1"+","+"1"+","+"1" : ' activer cette ligne pour bloquer l'action de la molette sur le MEMO 1
' dll_on "test_MouseHook.dll" on_close 0,fini on_user_event user res% = dll_call0("InitGlobalMouseHook") nh% = dll_call2("CreateGlobalMouseHook",adr(handles$),adr(bloquages$)) end
user: wp% = USER_EVENT_WPARAM lp% = USER_EVENT_LPARAM event% = bin_and(wp%,hex("FF000000")) if event%=hex("11000000") typ% = bin_and(wp%,hex("00FF0000"))/65536 nobj% = bin_and(wp%,hex("FFFF")) select typ% case 1: ' molette vers le haut caption 0,"Molette vers le haut: "+str$(lp%)+" objet rang "+str$(nobj%) ' message "Molette vers le haut: "+str$(lp%)+" objet rang "+str$(nobj%) case 2: ' molette vers le bas caption 0,"Molette vers le bas: "+str$(lp%)+" objet rang "+str$(nobj%) ' message "Molette vers le bas: "+str$(lp%)+" objet rang "+str$(nobj%) case 3: ' molette clic caption 0,"Molette clic"+" objet rang "+str$(nobj%) ' message "Molette clic"+" objet rang "+str$(nobj%) end_select end_if return
fini: res% = dll_call0("KillGlobalMouseHook") return
Tel qu'il est présenté, ce programme de démo capte les actions de la molette, quelque soit l'endroit o* se trouve le curseur. EDITJ'ai apporté une modification à CreateGlobalMouseHook. J'ai ajouté un second paramètre donnant a liste des flags de bloquage pour chaque objet placé dans la liste des handles. Toujours sous forme de chaînes de caractères séparées par des ",", on place des "0" pour laisser Windows prendre en charge l'évènement molette, et "1" pour bloquer cette prise en charge. | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: KGF_dll - nouvelles versions Ven 14 Aoû 2020 - 18:42 | |
| La doc est a jour !
J'ai ajouté la doc du GlobalMouseHook (section "Gestion de la souris") et l'objet ListSelector (section "Objets").
La doc est à jour aussi bien sous forme de KGF.chm que la doc en ligne, et le fichier texte dans mon WebDav, dossier "KGF DLL" contenant les syntaxes des fonctions est à jour aussi. | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: KGF_dll - nouvelles versions Dim 16 Aoû 2020 - 2:21 | |
| KGF.dll V9.26 du 16/08/2020
Nouveautés: - changement techique interne concernant les USER_EVENT
Modules modifiés: KGF.dll
La doc est à jour depuis le 14 Août 2020.
Ce changement technique est invisible de l'extérieur. Aucun changement dans les fonctions.
J'ai remplacé tous les appels à l'API SendMessage concernant les messages USER_EVENT par l'API PostMessage. Ceci était nécessaire pour prévenir un évenuel blocage de Windows si jamais le traitement dans le code Panoramic d'un USER_EVENT. Auparavent, j'attendait la fin du traitement du USER_EVENT en Panoramic pour continuer le traitement dans la DLL. Ceci était un nonsens et je ne l'ai compris que récemment, grâce à l'intervention d'un spécialiste Delphi qui m'a mis sur le bon chemin. Maintenant, le message USER_EVENT est placé dans la file d'attente des messages Windows pour le programme en question, et je continue directement le travil dans la DLL.
Je pense que vous ne devriez constater aucune différence (hormis une réactivité améliorée potentiellement). Mais si par malheur le traitement du USER_EVENT en Panoramic était plus "long" (comme en attendant par exemple une intervention utilisateur...), il n'y aura plus de blocage. | |
| | | Minibug
Nombre de messages : 4570 Age : 58 Localisation : Vienne (86) Date d'inscription : 09/02/2012
| Sujet: Re: KGF_dll - nouvelles versions Dim 16 Aoû 2020 - 9:13 | |
| Bonjour Klaus ! Merci pour ces précisions. Il m'est arrivé d'avoir des plantages intempestifs mais je ne sais pas si cela venait de là ou pas... Pour le moment je travaille sur les variables afin d'utiliser au maximum les variables locales dans les SUB. Je me rends compte que les variables déclarées en début de programme et utilisées ensuite dans des SUB posent parfois des problèmes. Et cela se comprends si elles sont utilisées à différents endroits du programmes comme pour les boucles FOR a%... J'essaie d’aseptiser le plus possible le code. En attendant je vais télécharger cette dernière version de KGF et retourner au codage de GPP. Merci Klaus. | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: KGF_dll - nouvelles versions Dim 16 Aoû 2020 - 11:31 | |
| - Citation :
- Je me rends compte que les variables déclarées en début de programme et utilisées ensuite dans des SUB posent parfois des problèmes.
C'est une remarque intéressante. Les varables globales sont utilisées dans 3 circonstances: - dans le cours du programme principal - dans les SUB et les fonctions Panoramic - dans les routines évènement Ce sont ces dernières qui posent problème. Elles peuvent en fit changer le contenu de variables globales qui sont, au moment de l'évènement, en cours d'utilisation par le programme principal et par une SUB. Et ces derniers n'en sauront rien, et ça conduit évidemment à des anomalies, même à des plantages, comme pr exemple la modification d'une variable i% servant de compteur de boucle dans une boucle FOR dans le programme principal. Plantage assuré. Il y a deux contraintes à respecter: 1. Il faut s'assurer qu'à travers le programme entier, une variable ne serve qu'à un seul et unuque but et ne soit mas utilisée, à des endroits différents, pour des usages différents 2. Il faut s'assurer qu'en cas de survenue d'un évènement (ON_CLICK, ON_CHANGE, ON_USER_EVENT, ...), aucune des variables nécessaires pour le déroulement logique du flux principal du programme ne soit modifiée par la routine évènement. A un moindre degré, la remarque (2) s'applique également aux routines GOSUB, aux procédures SUB et aux fonctions. Pourquoi moindre ? Parce que leur exécution est "synchrone" avec le programme principal, et le flux de programmation est parfaitement prévisible, même si une SUB peut en appeler une autre etc. Par contre, les routines évènement peuvent frapper n'importe quand, en cours d'exécution du programme principal, d'une SUB, d'une fonction ou d'un sourpogarmme GOSUB, et MEME lors de l'exécution d'un autre évènement ! Eh oui, le traitement d'un évènement ON_CLICK peut être interrompu par un USER_EVENT qui lui-même peut être interrompu par on ON_CHANGE etc ! Pour cette raison, si un traitement d'un évènement est un peu plus "long", il est de bon usage de désactiver cet évèmenent par la fonction OFF_xxx correspondante au début de la routine évènement et de le restaurer par ON_xxx avant de sortir. Mais ceci ne remplace pas une gestion rigoureuse des noms de variables. Techniquement, Panoramic ne connaît QUE des variables globales ! Une variable locale d'une SUB est en réalité une variable globale dont le nom porte un préfixe dérivé du nom de la SUB - c'est l'effet de la commande DIM_LOCAL. Chaque variable est visible partout, à tout moment. Et surtout modifiable... Il faut donc déterminer une convention de nommage de variables afin d'éviter les conflits. Pour les variables définies par DIM_LOCL, pas de problème - ce nommage est réalisé automatiquement. Ceci a pour effet qu'une variable DIM S$ et une autre DIM_LOCAL S$ sont différentes, et, dans la SUB, la définition locale "prime" sur la définition globale. Il en va autrement pour les variables globales utilisées dans un sous-programme GOSUB, dans une SUB ou dans une fonction. Là, il convient d'utiliser des noms spécifiques, parlants, afin d'assurer qu'une variable ne soit pas utilisée à tort et à travers. Bon, trève de bavardages. Je me suis encore laissé entraîner... Mais tu vois le principe ! | |
| | | Minibug
Nombre de messages : 4570 Age : 58 Localisation : Vienne (86) Date d'inscription : 09/02/2012
| Sujet: Re: KGF_dll - nouvelles versions Dim 16 Aoû 2020 - 12:44 | |
| Merci Klaus. C'est très bien expliqué. presque un cours complet ! J'ai voulu améliorer certaines choses ce matin mais c'est pire... Je vais reprendre mes sauvegardes précédentes et remettre tout ça à plat. Bon Dimanche Klaus et aussi à tous les Panoramiciens ! | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Lun 17 Aoû 2020 - 18:10 | |
| Bonjour les amis ! Je me suis mis à jour mais je n'ai toujours pas retrouvé l'inspiration... | |
| | | Contenu sponsorisé
| Sujet: Re: KGF_dll - nouvelles versions | |
| |
| | | | KGF_dll - nouvelles versions | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |