Listicongadget- case à cocher

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
michelmarchand
Messages : 20
Inscription : lun. 18/avr./2022 14:23

Listicongadget- case à cocher

Message 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
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Listicongadget- case à cocher

Message 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)
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Listicongadget- case à cocher

Message 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
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Listicongadget- case à cocher

Message 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
michelmarchand
Messages : 20
Inscription : lun. 18/avr./2022 14:23

Re: Listicongadget- case à cocher

Message 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
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Listicongadget- case à cocher

Message 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.
michelmarchand
Messages : 20
Inscription : lun. 18/avr./2022 14:23

Re: Listicongadget- case à cocher

Message par michelmarchand »

Bonjour olivier
opération réussi
Merci
michelmarchand
Messages : 20
Inscription : lun. 18/avr./2022 14:23

Structure

Message 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é
michelmarchand
Messages : 20
Inscription : lun. 18/avr./2022 14:23

Re: Listicongadget- case à cocher

Message par michelmarchand »

Merci Désolé
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Listicongadget- case à cocher

Message 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...
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Listicongadget- case à cocher

Message par Ar-S »

Pourrais tu mettre un code fonctionnel pour exprimer ton besoin ?
As tu explorer les Map() ?
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
TazNormand
Messages : 1297
Inscription : ven. 27/oct./2006 12:19
Localisation : Calvados (14)

Re: Listicongadget- case à cocher

Message 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.
Image
Image
Répondre