Page 1 sur 1

Listicongadget- case à cocher

Publié : lun. 18/avr./2022 14:33
par michelmarchand
Bonjour, dans une Listicongadget
Comment décocher un case à cocher par programmation
Car setgadgetstate(#Listi ) et
Setgadgetitemstate( #Listi, pos, -1 )
Ne fonctionne pas.
Quand j’ajoute une ligne dans la Listicongadget
La case est cochée
Je valide la ligne, en crée une nouvelle mais la précédente
N’est pas décoché
Merci pour votre aide

Re: Listicongadget- case à cocher

Publié : lun. 18/avr./2022 18:16
par Ollivier
C'est comme ça :

Code : Tout sélectionner

SetGadgetItemState(TonGadget, TonElement, #PB_ListIcon_Checked)
Et, bien sûr, ça se modifie quand l'élément existe, pas quand la listIcon est vide.

Et, pour récupérer l'état d'une case à cocher en listIcon :

Code : Tout sélectionner

Etat = Bool(GetGadgetItemState(TonGadget, TonElement) & #PB_ListIcon_Checked)
(Et c'est dans la section débutant qu'il faut poser la question, là j'ai mis plein de merde sur mon smartphone parce que t'as fait sonner la boîte mail et donc j'ai répondu sans gant)

Re: Listicongadget- case à cocher

Publié : lun. 18/avr./2022 21:22
par Ollivier
À tête reposée, cette procédure récupère ou modifie l'état d'une checkbox.

G = Numéro de gadget
E = Numéro d'élément
C = Commande de la case à cocher
0: pas de modification
1: mise à zéro
2: mise à un
4: va-et-vient
Valeur de retour = Etat de la case à cocher (1 ou 0)

Code : Tout sélectionner

Procedure libox(G, E, C = 0)
 Chk = #PB_ListIcon_Checked
 S = GetGadgetItemState(G, E)
  D = Bool(S & Chk)
  If C & 7
   D = (D ! Bool(C & 4) ) | Bool(C & 2) & Bool(Not(C & 1) )
   SetGadgetItemState(G, E, (S & ~Chk) | (D * Chk) )
  EndIf
  ProcedureReturn D
EndProcedure

Re: Listicongadget- case à cocher

Publié : lun. 18/avr./2022 21:59
par Ollivier
J'ai mis les deux procédures (check box et sélection, gérés indépendamment) en suggestion pour que ça soit natif dans une prochaine mise à jour :

https://www.purebasic.fr/english/viewtopic.php?p=583318

Pour simplifier et être plus fonctionnel :

Code : Tout sélectionner

Procedure Mask(S, C, M)
 Select C
   Case 0: S & ~M
   Case 1: S | M
   Case 2: S = Bool(S & M) ; non exclusive result (only a 1-bit set returns a logical one else zero)
   Case 3: S ! M
   Case 4: S = Not((S & M) - M) ; exclusive result (all the bits of the mask must be set to cause a logical one else zero)
 EndSelect
 ProcedureReturn S
EndProcedure
Exemple concret :

Code : Tout sélectionner

WinFlag = Mask(WinFlag, 1, #PB_Window_SizeGadget) ; active l'état de redimensionnement d'une option de fenêtre
WinFlag = Mask(WinFlag, 0, #PB_Window_SizeGadget) ; désactive l'état de redimensionnement d'une option de fenêtre
WinFlag = Mask(WinFlag, 3, #PB_Window_SizeGadget) ; change logiquement l'état de redimensionnement d'une option de fenêtre
Debug Mask(WinFlag, 4, #PB_Window_SizeGadget) ; retourne l'état exclusif de redimensionnement d'une option de fenêtre
Debug Mask(WinFlag, 2, #PB_Window_SizeGadget) ; retourne l'état non exclusif de redimensionnement d'une option de fenêtre

Re: Listicongadget- case à cocher

Publié : mer. 20/avr./2022 19:02
par michelmarchand
Bonsoir et Merci Olivier
je vient de tester ta fonction
elle fonctionne pour l’effacement de la case à cocher
mais ne coche pas lors de l'ajout d'une nouvelle ligne.
Merci d'avance

;G = Numéro de gadget
;E = Numéro d'élément
;C = Commande de la Case à cocher
;0: pas de modification
;1: mise à zéro
;2: mise à un
;4: va-et-vient
;Valeur de retour = Etat de la Case à cocher (1 ou 0)

libox( 1, GetGadgetState( 1 ), 1 )
If GetGadgetState( 1 ) = -1
AddGadgetItem( 1,-1,"new" )
x = CountGadgetItems( 1 )
libox( 1, x, 2 )
EndIf

Re: Listicongadget- case à cocher

Publié : jeu. 21/avr./2022 1:48
par Ollivier
La 1ère ligne est repérée par le numéro zéro.

Code : Tout sélectionner

0: ligne 1
1: ligne 2
2: ligne 3
...

...
x: ligne x+1
Donc si tu te repères avec CountGadgetList() il faut décrémenter (ajouter -1)

Code : Tout sélectionner

libox( 1, GetGadgetState( 1 ), 1 )
If GetGadgetState( 1 ) = -1
AddGadgetItem( 1,-1,"new" )
x = CountGadgetItems( 1 ) - 1 ; <<< ------ ICI LE " -1 "
libox( 1, x, 2 )
EndIf
Et tu verras : ma procédure ne bugue pas. Si tu as d'autres questions, n'hésite pas.

Re: Listicongadget- case à cocher

Publié : jeu. 21/avr./2022 5:25
par michelmarchand
Bonjour olivier
opération réussi
Merci

Structure

Publié : dim. 08/mai/2022 16:08
par michelmarchand
Bonjour Olivier
existe-t'il une solution pour lister le contenu d'une structure,
voilà: je suis sur une recherche multicritère et je voudrais lister les variables contenu dans la structure et créer les colonnes d'une listicon
et charger les éléments enregistrés

ex : j'ai une Structure Classeur

Code : Tout sélectionner

 NumEnrg.i
  CompteTiers.s
  TypePiece.s
  NumeroPiece.s
  DateEnrg.s
  Debit.s
  Credit.s
  Acompte.s
  DateEch.s
  FraisDiv.s
  TauxTva.s
  ModeRegl.s
;  List LigneDoc.Ligne()
EndStructure

Mydb()\Classeur() (et d'autre tables)
  
additem( combo, -1, (là les éléments de la structure) )
et la recherche ( j'aimerai simplifier le code ci-dessous car j'ai 3 combos, 3 string pour la valeur à rechercher )
donc 3 colonnes à créer

Code : Tout sélectionner

If GetGadgetText( Combo_0 ) = "Classeur"
              If GetGadgetText( String_0 ) <> ""
                If GetGadgetText( Combo_1 ) = "CompteTiers"
                   AddGadgetColumn( ListIcon_0, 0, "CompteTiers", 100 )
                   AddGadgetColumn( ListIcon_0, 1, "TypePiece", 100 )
                   AddGadgetColumn( ListIcon_0, 2, "NumeroPiece", 100 )
                  ForEach Mydb()\Classeur()
                    If GetGadgetText( String_0 ) = MyDb()\Classeur()\CompteTiers
                       AddGadgetItem( ListIcon_0, -1 , MyDb()\Classeur()\CompteTiers+Chr(10)+MyDb()\Classeur()\TypePiece+Chr(10)+MyDb()\Classeur()\NumeroPiece+Chr(10)+MyDb()\Classeur()\DateEnrg )
                    EndIf
                  Next
                EndIf
              EndIf
            EndIf 
j'espère que cela sera clair pour toi .
merci d'avance

---edit Ar-S---
Merci de penser à mettre le code dans les balises codes à cet effet. [ code ][ /code ]
C'est corrigé

Re: Listicongadget- case à cocher

Publié : lun. 09/mai/2022 12:42
par michelmarchand
Merci Désolé

Re: Listicongadget- case à cocher

Publié : mar. 10/mai/2022 14:38
par Ollivier
C'est une bonne question... Je dirais "oui", à coup sûr même, mais il y a un prix : ça contraint à lire le fichier source comme un fichier texte, et retrouver la structure voulue.

Donc le plus judicieux est de lire ce fichier pour exporter le texte de la structure dans un tableau, une zone data ou un fichier texte, afin de le crypter si besoin.

Je vais m'attarder sur cette question quand j'ai un peu de temps pour produire un code...

Re: Listicongadget- case à cocher

Publié : mar. 10/mai/2022 17:53
par Ar-S
Pourrais tu mettre un code fonctionnel pour exprimer ton besoin ?
As tu explorer les Map() ?

Re: Listicongadget- case à cocher

Publié : mer. 11/mai/2022 8:13
par TazNormand
Salut

Pour rappel, PureBasic intègre la bibliothèque DataBase pour la gestion de base de données.

peut-être faudrait il que tu te penches sur le stockage de tes données en BdD si tu as des requêtes de recherches un peu lourdes.

Ne connaissant pas ton projet, difficile de justifier si c'est un bon choix, mais par expérience, plus il y a de données, plus simple est la gestion par des requêtes SQL.