Bonjour,
Y a t-il un moyen en Pb de savoir que l'utilisateur a cliqué sur le nom d'une colonne ListIconGadget (Je dis bien une COLONNE et non pas une ligne).
Merci
Clic sur le nom d'une col ListIconGadget
Clic sur le nom d'une col ListIconGadget
Win7 (x64) 64 bits Pb 5.72
Re: Clic sur le nom d'une col ListIconGadget
Bonjour omega,
Je répond vite fait, oui c'est possible.
Je te fais une copie de ce que j'utilise pour trier Ascendant/Descendant une ListIcon en cliquant sur le titre d'une colonne.Il faut remplacer sort(#GadgetList,lastcol) par ta propre procédure.
Il faut remplacer la constante #GadgetList par l'identifiant de ta ListIcon
SetWindowCallback(@windowCallback(),#WinApp) est a mettre après If OpenWindow(#WinApp,...
cage
Je répond vite fait, oui c'est possible.
Je te fais une copie de ce que j'utilise pour trier Ascendant/Descendant une ListIcon en cliquant sur le titre d'une colonne.
Code : Tout sélectionner
Procedure initSysTray()
If FindWindow_("Progman", #NUL) <> 0
AddSysTrayIcon(#WinApp, WindowID(#WinApp), IconApp1)
SysTrayIconToolTip(#WinApp, #MyApp$)
EndIf
EndProcedure
Global *msg.NMHDR
Global *pnmv.NM_LISTVIEW
Procedure windowCallback(win, msg, wParam, lParam)
Protected Result = #PB_ProcessPureBasicEvents
Select Msg
Case #WM_NOTIFY
*msg.NMHDR = lParam
If IsGadget(#GadgetList)
If *msg\hwndFrom = GadgetID(#GadgetList) And *msg\code = #LVN_COLUMNCLICK
*pnmv.NM_LISTVIEW = lParam
If lastcol<>*pnmv\iSubItem And updown=0
updown = 1
ElseIf lastcol<>*pnmv\iSubItem And updown=1
updown = 0
EndIf
lastcol = *pnmv\iSubItem ; numéro de col 0->3
Debug "lastcol="+Str(lastcol)
sort(#GadgetList,lastcol)
EndIf
EndIf
Case TB_Message ; explorer crash
initSysTray()
EndSelect
ProcedureReturn Result
EndProcedure
SetWindowCallback(@windowCallback(),#WinApp)
Il faut remplacer la constante #GadgetList par l'identifiant de ta ListIcon
SetWindowCallback(@windowCallback(),#WinApp) est a mettre après If OpenWindow(#WinApp,...
cage
■ Win10 Pro 64-bit (Intel Celeron CPU N2920 @ 1.86GHz, 4,0GB RAM, Intel HD Graphics) & PB 6.12 LTS
■ Vivre et laisser vivre.
■ PureBasic pour le fun
■ Gérard sur le forum Anglais
■ Mes sites: http://pbcage.free.fr - http://yh.toolbox.free.fr
■ Vivre et laisser vivre.
■ PureBasic pour le fun
■ Gérard sur le forum Anglais
■ Mes sites: http://pbcage.free.fr - http://yh.toolbox.free.fr
Re: Clic sur le nom d'une col ListIconGadget
En stock, et devrait être multiplateforme.
M.
Code : Tout sélectionner
EnableExplicit
Structure CallbackEntry
WindowID.I
ListIconID.I
DefaultCallback.I
EndStructure
NewList CallbackEntry.CallbackEntry()
CompilerSelect #PB_Compiler_OS
CompilerCase #PB_OS_Linux ; ------------------------------------------------
ProcedureC ColumnHeaderClickCallback(*Column, ListIconData.I)
Shared CallbackEntry()
ForEach CallbackEntry()
If ListIconData >> 16 = CallbackEntry()\ListIconID
Break
EndIf
Next
PostEvent(#PB_Event_Gadget, CallbackEntry()\WindowID,
CallbackEntry()\ListIconID, #PB_EventType_LeftClick,
(ListIconData & $FFFF) + 1)
EndProcedure
Procedure SetGadgetCallback(WindowID.I, ListIconID.I)
Shared CallbackEntry()
Protected Column.I
Protected ColumnCount.I
Protected ColumnIndex.I
Protected *ListStore.GtkListStore
AddElement(CallbackEntry())
CallbackEntry()\WindowID = WindowID
CallbackEntry()\ListIconID = ListIconID
gtk_tree_view_set_headers_clickable_(GadgetID(ListIconID), #True)
*ListStore = gtk_tree_view_get_model_(GadgetID(ListIconID))
ColumnCount = (*ListStore\n_columns - 3) / 3
For ColumnIndex = 0 To ColumnCount - 1
Column = gtk_tree_view_get_column_(GadgetID(CallbackEntry()\ListIconID),
ColumnIndex)
If Column
g_signal_connect_data_(Column, "clicked",
@ColumnHeaderClickCallback(), ListIconID << 16 | ColumnIndex, 0, 0)
EndIf
Next ColumnIndex
EndProcedure
CompilerCase #PB_OS_MacOS ; ------------------------------------------------
ImportC ""
sel_registerName(MethodName.S)
class_addMethod(Class.I, Selector.I, Implementation.I, Types.S)
EndImport
Procedure.S ConvertToUTF8(String.S)
Protected UTF8String.S = Space(StringByteLength(String))
PokeS(@UTF8String, String, -1, #PB_UTF8)
ProcedureReturn UTF8String
EndProcedure
ProcedureC ColumnHeaderClickCallback(Object.I, Selector.I, TableView.I,
TableColumn.I)
Shared CallbackEntry()
Protected ClickedHeaderColumn.I
ForEach CallbackEntry()
If TableView = GadgetID(CallbackEntry()\ListIconID)
Break
EndIf
Next
ClickedHeaderColumn = Val(PeekS(CocoaMessage(0,
CocoaMessage(0, TableColumn, "identifier"),
"UTF8String"), -1, #PB_UTF8))
PostEvent(#PB_Event_Gadget, CallbackEntry()\WindowID,
CallbackEntry()\ListIconID, #PB_EventType_LeftClick,
ClickedHeaderColumn + 1)
EndProcedure
Procedure SetGadgetCallback(WindowID.I, ListIconID.I)
Shared CallbackEntry()
Protected AppDelegate.I
Protected DelegateClass.I
Protected Selector.I = sel_registerName(ConvertToUTF8("tableView:didClickTableColumn:"))
Protected Types.S = ConvertToUTF8("v@:@@")
AddElement(CallbackEntry())
CallbackEntry()\WindowID = WindowID
CallbackEntry()\ListIconID = ListIconID
AppDelegate = CocoaMessage(0,
CocoaMessage(0, 0, "NSApplication sharedApplication"), "delegate")
DelegateClass = CocoaMessage(0, AppDelegate, "class")
class_addMethod(DelegateClass, Selector, @ColumnHeaderClickCallback(),
Types)
CocoaMessage(0, GadgetID(CallbackEntry()\ListIconID),
"setDelegate:", AppDelegate)
EndProcedure
CompilerCase #PB_OS_Windows ; ----------------------------------------------
Procedure ColumnHeaderClickCallback(WindowHandle.I, Msg.I, WParam.I,
LParam.I)
Shared CallbackEntry()
Protected Result.I
Protected *Header.HD_NOTIFY
ForEach CallbackEntry()
If WindowHandle = GadgetID(CallbackEntry()\ListIconID)
Break
EndIf
Next
Result = CallWindowProc_(CallbackEntry()\DefaultCallback, WindowHandle,
Msg, WParam, LParam)
If Msg = #WM_NOTIFY
*Header = LParam
If *Header\hdr\code = #HDN_ITEMCLICK
PostEvent(#PB_Event_Gadget, CallbackEntry()\WindowID,
CallbackEntry()\ListIconID, #PB_EventType_LeftClick,
*Header\iItem + 1)
EndIf
EndIf
ProcedureReturn Result
EndProcedure
Procedure SetGadgetCallback(WindowID.I, ListIconID.I)
Shared CallbackEntry()
AddElement(CallbackEntry())
CallbackEntry()\WindowID = WindowID
CallbackEntry()\ListIconID = ListIconID
CallbackEntry()\DefaultCallback = SetWindowLongPtr_(GadgetID(CallbackEntry()\ListIconID),
#GWL_WNDPROC, @ColumnHeaderClickCallback())
EndProcedure ; -----------------------------------------------------------
CompilerEndSelect
OpenWindow(0, 200, 100, 450, 150, "Detect left click on header cell")
ListIconGadget(0, 10, 10, WindowWidth(0) - 20, WindowHeight(0) - 20, "Name",
110, #PB_ListIcon_FullRowSelect)
AddGadgetColumn(0, 1, "Address", 300)
AddGadgetItem(0, -1, "Harry Rannit" + #LF$ +
"12 Parliament Way, Battle Street, By the Bay")
AddGadgetItem(0, -1, "Ginger Brokeit"+ #LF$ +
"130 PureBasic Road, BigTown, CodeCity")
AddGadgetItem(0, -1, "Didi Foundit"+ #LF$ +
"321 Logo Drive, Mouse House, Downtown")
SetGadgetCallback(0, 0)
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
Break
Case #PB_Event_Gadget
If EventGadget() = 0 And EventType() = #PB_EventType_LeftClick
If EventData()
Debug "Left click on header of column " + Str(EventData() - 1)
Else
Debug "Left click on row " + Str(GetGadgetState(0))
EndIf
EndIf
EndSelect
ForEver
Re: Clic sur le nom d'une col ListIconGadget
Une version courte (dérivée d'un code du stock rsbasic)
Utilisation d'une API, donc PB enregistré.
Si tu veux juste le numéro de colonne: *Header\iItem

Utilisation d'une API, donc PB enregistré.
Code : Tout sélectionner
; Basé sur https://www.rsbasic.de/winapi-library/
; https://www.rsbasic.de/aktualisierung/winapi_library_2011/Codes/ListIconGadget/Header%20auf%20Mausklick%20abfragen.pb
EnableExplicit
Global MyOldList
Procedure ListCB(hWnd, Message, wParam, lParam)
Protected *Header.HD_NOTIFY
Protected Result=CallWindowProc_(MyOldList, hWnd, Message, wParam, lParam)
If Message = #WM_NOTIFY
*Header = lParam
If *Header\hdr\code = #HDN_ITEMCLICK
Debug GetGadgetItemText(1, -1, *Header\iItem)
EndIf
EndIf
ProcedureReturn Result
EndProcedure
OpenWindow(0, 0, 0, 500, 250, "Window", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
ListIconGadget(1, 10, 10, 480, 230, "AAA", 100, 0)
AddGadgetColumn(1, 1, "BBB", 100)
AddGadgetColumn(1, 2, "CCC", 100)
MyOldList = SetWindowLongPtr_(GadgetID(1), #GWL_WNDPROC, @ListCB())
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow

Re: Clic sur le nom d'une col ListIconGadget
Merci à tous!
ça marche mais je ne sais plus quoi choisir comme code il me semble que le dernier code me va parfaitement car il est court et plus simple. Merci encore à vous tous et bonne continuation
*
ça marche mais je ne sais plus quoi choisir comme code il me semble que le dernier code me va parfaitement car il est court et plus simple. Merci encore à vous tous et bonne continuation
*
Win7 (x64) 64 bits Pb 5.72