Aide sur ListiconGadget
Aide sur ListiconGadget
Bonjour,
J'aimerai pouvoir créer une zone de saisie flottante dans une listicongadget
ex:
je clic gauche sur ligne et colonne spécifique cela m'affiche un stringGadget
pour modifier ou saisir des données qui seront mise à jour dans la listicongadget . ( quelque chose de simple si possible )
Quelq'un a t-il une idée
Merci d'avance
J'aimerai pouvoir créer une zone de saisie flottante dans une listicongadget
ex:
je clic gauche sur ligne et colonne spécifique cela m'affiche un stringGadget
pour modifier ou saisir des données qui seront mise à jour dans la listicongadget . ( quelque chose de simple si possible )
Quelq'un a t-il une idée
Merci d'avance
Je sais pas si c'est simple mais voici un code basé sur un excellent code de El Choni d'il y a bien 2 ans.
J'ai "éclairci" le code.
Le principe, c'est une petite callback pour intercepter 2 messages, le double clic gauche de la souris et le traitement d'un message de couleur.
J'ai passé 2 heures pour essayer de faire sans callback car PB permet de récupérer le double clic mais c'est après que ça coince, pas moyen de récupérer les bonne valeurs du message.
Donc avec callback.
C'est très simple, un double clic sur un élément et tu n'as qu'à écrire directement dans la cellule, c'est la touche Entrée qui met fin à l'écriture. Après le double clic, la cellule est sur fond noir texte blanc, tu peux changer ça comme ceci :
modifie les valeurs des constantes
J'ai créé une Brush qu'il faut détruire avec l'API deleteObject, c'est dans la boucle normale, en fin de programme
C'est pas trop compliqué à utiliser, tu copies la callback et les constantes que tu as besoin et après la création de la listicon, tu mets cette ligne en changeant bien sur l'identifiant de la listicon
Si tu utilise la librairie MoreListiconGadget, ne mets pas la ligne
car la librairie le fait déjà.
Le code
J'ai "éclairci" le code.
Le principe, c'est une petite callback pour intercepter 2 messages, le double clic gauche de la souris et le traitement d'un message de couleur.
J'ai passé 2 heures pour essayer de faire sans callback car PB permet de récupérer le double clic mais c'est après que ça coince, pas moyen de récupérer les bonne valeurs du message.
Donc avec callback.
C'est très simple, un double clic sur un élément et tu n'as qu'à écrire directement dans la cellule, c'est la touche Entrée qui met fin à l'écriture. Après le double clic, la cellule est sur fond noir texte blanc, tu peux changer ça comme ceci :
modifie les valeurs des constantes
Code : Tout sélectionner
#CouleurFondCellule
#CouleurTextCellule
C'est pas trop compliqué à utiliser, tu copies la callback et les constantes que tu as besoin et après la création de la listicon, tu mets cette ligne en changeant bien sur l'identifiant de la listicon
Code : Tout sélectionner
OlCallback = SetWindowLong_(GadgetID(#ListIconGadget1), #GWL_WNDPROC, @Mycallback())
Code : Tout sélectionner
SendMessage_(GadgetID(#ListIconGadget1), #CCM_SETVERSION, 5, 0)
Le code
Code : Tout sélectionner
Enumeration
#MainWindow
#ListIconGadget1
#StringGadget
EndEnumeration
; Structure LVITEM
; Mask.l
; iItem.l
; iSubItem.l
; State.l
; stateMask.l
; pszText.l
; cchTextMax.l
; iImage.l
; lParam.l
; iIndent.l
; iGroupId.l
; cColumns.l
; puColumns.l
; EndStructure
;
#CCM_SETVERSION = 8199
#LVM_SUBITEMHITTEST = #LVM_FIRST + 57
#LVM_GETSUBITEMRECT = #LVM_FIRST + 56
#KeyDown = 0
#KeyUp = 2
Global OlCallback.l, BrushFondCellule
#CouleurFondCellule = 0
#CouleurTextCellule = #white
BrushFondCellule = CreateSolidBrush_(#CouleurFondCellule)
Procedure Mycallback(Window, Message, wParam, lParam)
resultat = CallWindowProc_(OlCallback, Window, Message, wParam, lParam)
Select Message
Case #WM_LBUTTONDBLCLK
var.LVHITTESTINFO
var\pt\x = lParam & $FFFF
var\pt\y = lParam >> 16
SendMessage_(Window, #LVM_SUBITEMHITTEST, 0, var)
rc.RECT
rc\top = var\iSubItem
rc\left = #LVIR_BOUNDS
SendMessage_(Window, #LVM_GETSUBITEMRECT, var\iItem, rc)
UseGadgetList(Window)
ligne = var\iItem
colonne = var\iSubItem
Text$ = GetGadgetItemText(#ListIconGadget1, ligne, colonne )
If colonne = 0
rc\right = rc\left + SendMessage_(Window, #LVM_GETCOLUMNWIDTH, 0, 0)
EndIf
StringGadget(#StringGadget, rc\left + 1, rc\top, rc\right - rc\left - 1, rc\bottom - rc\top - 1, Text$, #PB_String_BorderLess)
ActivateGadget(#StringGadget)
Repeat
Select WaitWindowEvent()
Case #WM_KEYDOWN
Select EventwParam()
Case #VK_RETURN
Text$ = GetGadgetText(#StringGadget)
FreeGadget(#StringGadget)
SetGadgetItemText(#ListIconGadget1, Ligne, Text$, Colonne)
quit2 + 1
EndSelect
EndSelect
Until quit2
Case #WM_CTLCOLOREDIT
If GetFocus_() = lParam
SetBkMode_(wParam, #TRANSPARENT)
SetTextColor_(wParam, #CouleurTextCellule)
resultat = BrushFondCellule
EndIf
EndSelect
ProcedureReturn resultat
EndProcedure
If OpenWindow(#MainWindow, 0, 0, 480, 300, #PB_Window_ScreenCentered | #PB_Window_SystemMenu, "Cellules et stringGadget")
If CreateGadgetList(WindowID()) And ListIconGadget(#ListIconGadget1, 40, 95, 398, 180, "Col 1", 198)
SendMessage_(GadgetID(#ListIconGadget1), #CCM_SETVERSION, 5, 0)
OlCallback = SetWindowLong_(GadgetID(#ListIconGadget1), #GWL_WNDPROC, @Mycallback())
AddGadgetColumn(#ListIconGadget1, 1, "Col 2", 190 / 2)
AddGadgetColumn(#ListIconGadget1, 2, "Col 3", 190 / 2)
For i.b = 1 To 10
AddGadgetItem(#ListIconGadget1, -1, "Element " + Str(i) + Chr(10) + "Sous-élément" + Str(i) + Chr(10) + "Sous-élément" + Str(i) + Str(i))
Next i
Repeat
Select WaitWindowEvent()
Case #PB_EventCloseWindow
DeleteObject_(BrushFondCellule)
Quit + 1
EndSelect
Until Quit
EndIf
EndIf
End
Dernière modification par Anonyme2 le jeu. 21/avr./2005 4:13, modifié 1 fois.
-
- Messages : 4312
- Inscription : mer. 28/janv./2004 20:58
- Localisation : Clermont ferrand OU Olsztyn
- Contact :
Salut,
j'ai déjà rajouté ca :
ce qui serait bien : 1er click souris positionnement, surbrillance .
2ème click souris Saisie .
Merci de votre aide, se serait bien de dévellopper un outil complet pour
la saise dans une listicongadget .
Bonne Nuit
Michel
j'ai déjà rajouté ca :
Code : Tout sélectionner
Repeat
Select WaitWindowEvent()
Case #WM_KEYDOWN
Select EventwParam()
Case #VK_RETURN
Text$ = GetGadgetText(#StringGadget)
FreeGadget(#StringGadget)
SetGadgetItemText(#ListIconGadget1, Ligne, Text$, Colonne)
quit2 + 1
__________________________________________
Case #VK_ESCAPE
FreeGadget(#StringGadget)
Break
___________________________________________
EndSelect
EndSelect
Until quit2
2ème click souris Saisie .
Merci de votre aide, se serait bien de dévellopper un outil complet pour
la saise dans une listicongadget .
Bonne Nuit
Michel
-
- Messages : 4312
- Inscription : mer. 28/janv./2004 20:58
- Localisation : Clermont ferrand OU Olsztyn
- Contact :
Je ne sais pas pourquoi ça plante chez toi car tous mes essais fonctionnent avec et sans les thèmes XP.Le Soldat Inconnu a écrit :pas au point(j'ai planté le bazar) mais ça a le mérite de montrer le principe
Peut -être parce que le addgadgetcolumnn de la 3eme colonne a le même numéro que la 2eme colonne , j'ai corrigé dans le code posté.
Il faudra la callback pour la couleur du stringgadget.Le Soldat Inconnu a écrit :Oui, on doit pouvoir faire plus simple et plus propeet sans callback
J'ai intercepté dans la boucle standart le double clic sur la listicon mais EventLparam() ne retournait pas les valeurs correctes du rectangle de la cellule (j'ai fait des essais en clientscreen etc mais je n'ai jamais eu les bonnes valeurs, peut-être une erreur dans mon code, donc je ne suis pas arrivé à obtenir le bon numéro de ligne)
-
- Messages : 4312
- Inscription : mer. 28/janv./2004 20:58
- Localisation : Clermont ferrand OU Olsztyn
- Contact :
Ah ? je ferais un essai cet après midi
Pour la version sans CallBack, il n'y a plus de couleur, bien sur
j'ai cru planté le bazar car je n'avais pas cliqué sur Enter après une édition
et j'ai déplacé la liste avec les scrollbars.
Mais j'ai une idée pour remedier à ce problème
Pour la version sans CallBack, il n'y a plus de couleur, bien sur

j'ai cru planté le bazar car je n'avais pas cliqué sur Enter après une édition
et j'ai déplacé la liste avec les scrollbars.
Mais j'ai une idée pour remedier à ce problème

Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?
[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Salut,
@ Cagou-77 :
Denis et LSI sont partis sur la réalisation d'une ListIcon Editable, ce qui manque encore à PB et sera très bienvenue.
Personnellement je me sers de la méthode suivante (initiée par Régis également à laquelle j'ai rajouté l'action sur plusieurs colonnes par l'intermédiaire d'une ComboBoxGadget)
Ainsi en sélectionnant la colonne sur laquelle on a besoin d'agir avec la combobox, il n'y a plus qu'à faire un clic droit sur l'élément de la colonne choisie qu'il faut modifier. Il y a sûrement plus simple.
Voilà, si ça peut servir
@+ Jacobus
@ Cagou-77 :
Comme au début tu voulais une fenêtre flottante, il me semblait que l'InputRequester était approprié pour agir sur ta ListIcon.J'aimerai pouvoir créer une zone de saisie flottante dans une listicongadget
Denis et LSI sont partis sur la réalisation d'une ListIcon Editable, ce qui manque encore à PB et sera très bienvenue.

Personnellement je me sers de la méthode suivante (initiée par Régis également à laquelle j'ai rajouté l'action sur plusieurs colonnes par l'intermédiaire d'une ComboBoxGadget)
Code : Tout sélectionner
;Cette partie du code représente la création d'une combobox listant chaque colonne de la ListIcon dans la fenêtre principale où se trouve aussi la listicon.
;Ne pas tenir compte des valeurs de positionnement de gadget (extrait d'un de mes programmes)
;Les noms des colonnes...c'est pour l'exemple
;SetGadgetColor() et SetComboBoxColor() sont des fonctions de la Lib de Denis
TextGadget(#text_modif,470,85,130,15,"Modifier",#PB_Text_Center)
;SetGadgetColor(#text_modif, #black, RGB($D0,$F0,$FF))
ComboBoxGadget(#SelectColonne, 470, 100, 130, 120,#PB_ComboBox_Editable); ComboBox éditable pour colorisation
;SetComboBoxColor(#SelectColonne, RGB($B0,$EC,$F0), #black,#black)
AddGadgetItem(#SelectColonne, -1, "Nom") ; première colonne valant 0
AddGadgetItem(#SelectColonne, -1, "Prénom"); deuxième colonne valant 1
AddGadgetItem(#SelectColonne, -1, "Âge") ; etc...
AddGadgetItem(#SelectColonne, -1, "Sexe")
AddGadgetItem(#SelectColonne, -1, "Planète")
AddGadgetItem(#SelectColonne, -1, "Langue")
AddGadgetItem(#SelectColonne, -1, "Intelligence")
;******************************************************
;Dans la boucle Repeat,
Case #ListIcon; constante de la ListIconGadget()
Resultat$ = GetGadgetText(#SelectColonne); On récupère la colonne voulue dans une variable
If Resultat$="Nom": Colonne=0 ; si la variable vaut "Nom" alors c'est la colonne 0 qui est sélectionnée
ElseIf Resultat$="Prénom" : Colonne=1 ; si la variable vaut "Prénom" alors c'est la colonne 1 qui est sélectionnée
ElseIf Resultat$="Âge" : Colonne=2 ; etc...
ElseIf Resultat$="Sexe" : Colonne=3
ElseIf Resultat$="Planète" : Colonne=4
ElseIf Resultat$="Langue" : Colonne=5
ElseIf Resultat$="Intelligence" : Colonne=6
EndIf
Pos = GetGadgetState(#ListIcon)
If Pos >= 0
If EventType() = #PB_EventType_RightClick ; au choix
Txt.s = InputRequester("MODIFICATION D'UN ELEMENT DE LA LISTICON", "Entrez vos modifications :", GetGadgetItemText(#ListIcon, Pos, Colonne))
SetGadgetItemText(#ListIcon, Pos, Txt, Colonne)
EndIf
EndIf
Voilà, si ça peut servir
@+ Jacobus
Quand tous les glands seront tombés, les feuilles dispersées, la vigueur retombée... Dans la morne solitude, ancré au coeur de ses racines, c'est de sa force maturité qu'il renaîtra en pleine magnificence...Jacobus.
Voilas ma version :
Code : Tout sélectionner
Enumeration
#MainWindow
#ListIconGadget1
#StringGadget
EndEnumeration
#LVM_SUBITEMHITTEST = #LVM_FIRST + 57
#LVM_GETSUBITEMRECT = #LVM_FIRST + 56
If OpenWindow(#MainWindow, 0, 0, 480, 300, #PB_Window_ScreenCentered | #PB_Window_SystemMenu, "Cellules et stringGadget")
If CreateGadgetList(WindowID()) And ListIconGadget(#ListIconGadget1, 40, 95, 398, 180, "Col 1", 198)
AddGadgetColumn(#ListIconGadget1, 1, "Col 2", 190 / 2)
AddGadgetColumn(#ListIconGadget1, 2, "Col 3", 190 / 2)
For i.b = 1 To 10
AddGadgetItem(#ListIconGadget1, -1, "Element " + Str(i) + Chr(10) + "Sous-élément" + Str(i) + Chr(10) + "Sous-élément" + Str(i) + Str(i))
Next i
Repeat
Select WindowEvent()
Case #PB_EventCloseWindow
Quit + 1
Case #WM_LBUTTONDBLCLK
Debug "t"
Case #PB_Event_Gadget
Select EventGadgetID()
Case #ListIconGadget1
Select EventType()
Case #PB_EventType_LeftDoubleClick
;Debug "ok"
var.LVHITTESTINFO
var\pt\x = WindowMouseX() - GadgetX(#ListIconGadget1) + GetSystemMetrics_(#SM_CXEDGE)
var\pt\y = WindowMouseY() - GadgetY(#ListIconGadget1) + GetSystemMetrics_(#SM_CYEDGE)
;Debug var\pt\x
;Debug var\pt\y
SendMessage_(GadgetID(#ListIconGadget1), #LVM_SUBITEMHITTEST, 0, var)
rc.RECT
rc\top = var\iSubItem
rc\left = #LVIR_BOUNDS
Debug SendMessage_(GadgetID(#ListIconGadget1), #LVM_GETSUBITEMRECT, var\iItem, rc)
UseGadgetList(WindowID())
ligne = var\iItem
colonne = var\iSubItem
Text$ = GetGadgetItemText(#ListIconGadget1, ligne, colonne )
If colonne = 0
rc\right = rc\left + SendMessage_(GadgetID(#ListIconGadget1), #LVM_GETCOLUMNWIDTH, 0, 0)
EndIf
rc\Top + GadgetY(#ListIconGadget1) + GetSystemMetrics_(#SM_CYEDGE)
rc\bottom + GadgetY(#ListIconGadget1) + GetSystemMetrics_(#SM_CYEDGE)
rc\right + GadgetX(#ListIconGadget1) + GetSystemMetrics_(#SM_CXEDGE)
rc\left + GadgetX(#ListIconGadget1) + GetSystemMetrics_(#SM_CXEDGE)
StringGadget(#StringGadget, rc\left + 1, rc\top, rc\right - rc\left - 1, rc\bottom - rc\top - 1, Text$, #PB_String_BorderLess)
ActivateGadget(#StringGadget)
SendMessage_(GadgetID(#StringGadget),#EM_SETSEL,0,99999)
quit2 = 0
Repeat
Select WindowEvent()
Case #WM_KEYDOWN
Select EventwParam()
Case #VK_RETURN
Text$ = GetGadgetText(#StringGadget)
FreeGadget(#StringGadget)
SetGadgetItemText(#ListIconGadget1, Ligne, Text$, Colonne)
quit2 + 1
Case #VK_ESCAPE
Quit2 + 1
EndSelect
EndSelect
If GetFocus_() <> GadgetID(#StringGadget)
Text$ = GetGadgetText(#StringGadget)
FreeGadget(#StringGadget)
SetGadgetItemText(#ListIconGadget1, Ligne, Text$, Colonne)
quit2 + 1
EndIf
Until quit2
EndSelect
EndSelect
EndSelect
Until Quit
EndIf
EndIf
End
-
- Messages : 4312
- Inscription : mer. 28/janv./2004 20:58
- Localisation : Clermont ferrand OU Olsztyn
- Contact :
voila la version sans callback 

Code : Tout sélectionner
; Auteur : Le Soldat Inconnu
; Version de PB : 3.93
;
; Explication du programme :
#LVM_SUBITEMHITTEST = #LVM_FIRST + 57
#LVM_GETSUBITEMRECT = #LVM_FIRST + 56
; Création de la fenêtre principale
OpenWindow(0, 0, 0, 300, 300, #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget, "Test")
CreateGadgetList(WindowID())
; ListIcon
ListIconGadget(0, 0, 0, 300, 300, "Colonne 1", 150, #PB_ListIcon_GridLines | #PB_ListIcon_FullRowSelect)
AddGadgetColumn(0, 1, "Colonne 2", 150)
AddGadgetColumn(0, 2, "Colonne 3", 150)
For n = 0 To 20
AddGadgetItem(0, -1, "Elément " + Str(n) + " - 0" + Chr(10) + "Elément " + Str(n) + " - 1" + Chr(10) + "Elément " + Str(n) + " - 2")
Next
; Fenêtre d'édition de la ListIconGadget
OpenWindow(1, 0, 0, 100, 20, #PB_Window_BorderLess | #PB_Window_Invisible, "Edition", WindowID())
CreateGadgetList(WindowID())
StringGadget(2, 0, 0, 100, 20, "", #PB_String_MultiLine)
AddKeyboardShortcut(1, #PB_Shortcut_Return, 0) ; Touche de raccourci
AddKeyboardShortcut(1, #PB_Shortcut_Escape, 1)
UseWindow(0)
UseGadgetList(WindowID())
Repeat
Event = WaitWindowEvent()
Select Event
Case #PB_EventGadget
Select EventGadgetID()
Case 0 ; ListIcon
Select EventType()
Case #PB_EventType_LeftDoubleClick
; Sur quel élément on a cliqué
GetCursorPos_( @MouseClic.LVHITTESTINFO\pt) ; Coordonnée de la souris
ScreenToClient_(GadgetID(0), @MouseClic.LVHITTESTINFO\pt)
SendMessage_(GadgetID(0), #LVM_SUBITEMHITTEST, 0, MouseClic)
Debug MouseClic\iItem
Debug MouseClic\iSubItem
; Position et taille de l'élément
Zone.RECT\Top = MouseClic\iSubItem
Zone\Left = #LVIR_BOUNDS
SendMessage_(GadgetID(0), #LVM_GETSUBITEMRECT, MouseClic\iItem, Zone)
If MouseClic\iSubItem = 0 ; Si on est sur la colonne 0
; Il faut ajuster la taille en fonction de la largeur de la colonne
Zone\Right = Zone\Left + SendMessage_(GadgetID(0), #LVM_GETCOLUMNWIDTH, 0, 0)
EndIf
Debug Str(Zone\Left) + ", " + Str(Zone\Top)
; On déplace la fenêtre d'éditon et on la redimensionne
GetWindowRect_(GadgetID(0), WinPos.RECT)
GetClientRect_(GadgetID(0), ClientPos.RECT)
UseWindow(1)
Largeur = Zone\Right - Zone\Left
Hauteur = Zone\Bottom - Zone\Top
If Hauteur < 18
Hauteur = 18
EndIf
MoveWindow(Zone\Left + WinPos\Left, Zone\Top + WinPos\Top)
ResizeWindow(Largeur, Hauteur)
ResizeGadget(2, 0, 0, Largeur, Hauteur)
; On récupère la texte
SetGadgetText(2, GetGadgetItemText(0, MouseClic\iItem, MouseClic\iSubItem))
; On affiche
EnableWindow_(WindowID(0), 0) ; On désactive la fenêtre principale
HideWindow(1, 0) ; On montre le StringGadget
ActivateGadget(2) ; et on lui donne le focus
; On gère les actions
Quitter = 0
Repeat
Event = WaitWindowEvent()
If Event = #PB_EventMenu
Select EventMenuID()
Case 0 ; Entrer
Quitter = 1
SetGadgetItemText(0, MouseClic\iItem, GetGadgetText(2), MouseClic\iSubItem) ; On récupère le nouveau texte
Case 1 ; Echap
Quitter = 1
EndSelect
EndIf
Until Quitter Or Event = #PB_EventCloseWindow
HideWindow(1, 1)
EnableWindow_(WindowID(0), 1) ; On active la fenêtre principale
EndSelect
EndSelect
EndSelect
Until Event = #PB_EventCloseWindow
End
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?
[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
-
- Messages : 4312
- Inscription : mer. 28/janv./2004 20:58
- Localisation : Clermont ferrand OU Olsztyn
- Contact :