ListIconGadget : Editable ?

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Shinao
Messages : 137
Inscription : dim. 21/sept./2008 13:00

ListIconGadget : Editable ?

Message par Shinao »

Bonjour/Bonsoir,

J'ai agencé mon ListIconGadget, pensant que celui serait editable en double cliquant sur une case, hors ce n'est pas le cas.
Il y a t-il une possibilité pour ce faire ? Ou un gadget équivalent qui vous a parmis d'avoir un même rendu ?


PS : En recherchant j'ai vu quelques code mais la plupart datait de quasi une dizaine d'année...


Merci d'avance
Avatar de l’utilisateur
Noos88
Messages : 59
Inscription : lun. 14/juin/2010 19:16
Localisation : Belrupt (Vosges)

Re: ListIconGadget : Editable ?

Message par Noos88 »

Bonjour,
Oui c'est possible regarde cette solution:

Code : Tout sélectionner

; English forum:
; Author: El Choni (updated for PB3.92+ by Andre, updated for PB4.00 by blbltheworm)
; Date: 09. May 2003
; OS: Windows
; Demo: No

Procedure LoWord(value) 
  ProcedureReturn value & $FFFF 
EndProcedure 

Procedure HiWord(value) 
  ProcedureReturn value >> 16 & $FFFF 
EndProcedure 

#NM_CUSTOMDRAW = #NM_FIRST-12 

#CDDS_ITEM = $10000 
#CDDS_SUBITEM = $20000 
#CDDS_PREPAINT = $1 
#CDDS_ITEMPREPAINT = #CDDS_ITEM|#CDDS_PREPAINT 
#CDDS_SUBITEMPREPAINT = #CDDS_SUBITEM|#CDDS_ITEMPREPAINT 
#CDRF_DODEFAULT = $0 
#CDRF_NEWFONT = $2 
#CDRF_NOTIFYITEMDRAW = $20 
#CDRF_NOTIFYSUBITEMDRAW = $20 

#LVM_SUBITEMHITTEST = #LVM_FIRST+57 
#LVM_GETSUBITEMRECT = #LVM_FIRST+56 

Global ListGadget, OldLViewProc, OldEditProc, hEdit, rct.RECT, CellSelectOn, CurItem, CurSubItem, CurSelItem, CurSelSubItem 

Declare EditProc(hwnd, uMsg, wParam, lParam) 
Declare LViewProc(hwnd, uMsg, wParam, lParam) 
Declare WndProc(hwnd, uMsg, wParam, lParam) 
Declare KillFocus() 
Declare DrawRectangle(hwnd, *rc.RECT) 

#CCM_SETVERSION = #CCM_FIRST+7 

Global FontReg, FontBold 
FontReg = LoadFont(1, "Tahoma", 9) 
FontBold = LoadFont(2, "Tahoma", 9, #PB_Font_Bold) 

If OpenWindow(0, 0, 0, 400, 260, "Color List View Rows", #PB_Window_ScreenCentered|#PB_Window_SystemMenu)=0:End:EndIf  

ListGadget = ListIconGadget(1, 10, 10, 380, 240, "", 70, #PB_ListIcon_GridLines|#LVS_NOSORTHEADER) 

SendMessage_(ListGadget, #CCM_SETVERSION, 5, 0) 

AddGadgetColumn(1, 1, "Sun", 35) 
AddGadgetColumn(1, 2, "Mon", 35) 
AddGadgetColumn(1, 3, "Tue", 35) 
AddGadgetColumn(1, 4, "Wed", 35) 
AddGadgetColumn(1, 5, "Thu", 35) 
AddGadgetColumn(1, 6, "Fri", 35) 
AddGadgetColumn(1, 7, "Sat", 35) 

For i=18 To 34 
  hour12 = i 
  If hour12>25 
    hour12-24 
    Hour$ = " pm" 
  Else 
    Hour$ = " am" 
  EndIf 
  If hour12&1 
    Hour$=Str(hour12/2)+":30"+Hour$;LSet(Str(hour12/2)+":30"+Hour$, 9, " ") 
  Else 
    Hour$=Str(hour12/2)+":00"+Hour$;LSet(Str(hour12/2)+":00"+Hour$, 9, " ") 
  EndIf 
  AddGadgetItem(1, -1, Hour$+Chr(10)+Str(hour12/2)+"1"+Chr(10)+Str(hour12/2)+"2"+Chr(10)+Str(hour12/2)+"3"+Chr(10)+Str(hour12/2)+"4"+Chr(10)+Str(hour12/2)+"5"+Chr(10)+Str(hour12/2)+"6"+Chr(10)+Str(hour12/2)+"7") 
Next i 

SendMessage_(ListGadget, #LVM_SETBKCOLOR, 0, RGB(255, 255, 223)) 
 
OldLViewProc = SetWindowLong_(ListGadget, #GWL_WNDPROC, @LViewProc()) 
SetWindowCallback(@WndProc()) 

For i=0 To 7 
  SendMessage_(ListGadget, #LVM_SETCOLUMNWIDTH, i, #LVSCW_AUTOSIZE_USEHEADER) 
Next i 

Repeat 
Until WaitWindowEvent()=#PB_Event_CloseWindow 

End 

Procedure KillFocus() 
  If hEdit 
    SetGadgetItemText(1, CurItem, GetGadgetText(2), CurSubItem) 
    FreeGadget(2) 
    hEdit = 0 
  EndIf 
EndProcedure 

Procedure DrawRectangle(hwnd, *rc.RECT) 
  hDC = GetDC_(hwnd) 
  OldPen = SelectObject_(hDC, GetStockObject_(#BLACK_PEN)) 
  OldBrush = SelectObject_(hDC, GetStockObject_(#NULL_BRUSH)) 
  Rectangle_(hDC, *rc\left, *rc\top, *rc\right, *rc\bottom) 
  SelectObject_(hDC, OldBrush) 
  SelectObject_(hDC, OldPen) 
  ReleaseDC_(hwnd, hDC) 
EndProcedure 

Procedure EditProc(hwnd, uMsg, wParam, lParam) 
  result = 0 
  Select uMsg 
    Case #WM_KEYDOWN 
      result = CallWindowProc_(OldEditProc, hwnd, uMsg, wParam, lParam) 
      If wParam=#VK_RETURN 
        KillFocus() 
      EndIf 
    Default 
      result = CallWindowProc_(OldEditProc, hwnd, uMsg, wParam, lParam) 
  EndSelect 
  ProcedureReturn result 
EndProcedure 

Procedure LViewProc(hwnd, uMsg, wParam, lParam) 
  result = 0 
  Select uMsg 
    Case #WM_LBUTTONDBLCLK 
      If hwnd<>hEdit 
        KillFocus() 
        pInfo.LVHITTESTINFO 
        pInfo\pt\x = LoWord(lParam) 
        pInfo\pt\y = HiWord(lParam) 
        SendMessage_(hwnd, #LVM_SUBITEMHITTEST, 0, pInfo) 
        rc.RECT 
        rc\top = pInfo\iSubItem 
        rc\left = #LVIR_BOUNDS 
        SendMessage_(hwnd, #LVM_GETSUBITEMRECT, pInfo\iItem, rc) 
        If hEdit=0 
          UseGadgetList(hwnd) 
          CurItem = pInfo\iItem 
          CurSubItem = pInfo\iSubItem 
          Text$ = GetGadgetItemText(1, CurItem, CurSubItem) 
          If CurSubItem=0 
            rc\right = rc\left+SendMessage_(hwnd, #LVM_GETCOLUMNWIDTH, 0, 0) 
          EndIf 
          hEdit = StringGadget(2, rc\left+1, rc\top, rc\right-rc\left-1, rc\bottom-rc\top-1, Text$, #PB_String_BorderLess) 
          If CurSubItem=0 
            SendMessage_(hEdit, #WM_SETFONT, FontBold, #True) 
          Else 
            SendMessage_(hEdit, #WM_SETFONT, FontReg, #True) 
          EndIf 
          OldEditProc = SetWindowLong_(hEdit, #GWL_WNDPROC, @EditProc()) 
          SetFocus_(hEdit) 
        EndIf 
      Else 
        result = CallWindowProc_(OldLViewProc, hwnd, uMsg, wParam, lParam) 
      EndIf 
    Case #WM_LBUTTONDOWN 
      If hwnd<>hEdit 
        KillFocus() 
        pInfo.LVHITTESTINFO 
        pInfo\pt\x = LoWord(lParam) 
        pInfo\pt\y = HiWord(lParam) 
        SendMessage_(hwnd, #LVM_SUBITEMHITTEST, 0, pInfo) 
        rc.RECT 
        rc\top = pInfo\iSubItem 
        rc\left = #LVIR_BOUNDS 
        SendMessage_(hwnd, #LVM_GETSUBITEMRECT, pInfo\iItem, rc) 
        rc\left+1 
        rc\bottom-1 
        If CellSelectOn 
          InvalidateRect_(hwnd, rct, #True) 
        EndIf 
        CellSelectOn = 1 
        CurSelItem = pInfo\iItem 
        CurSelSubItem = pInfo\iSubItem 
        If CurSelSubItem=0 
          rc\right = rc\left+SendMessage_(hwnd, #LVM_GETCOLUMNWIDTH, 0, 0) 
        EndIf 
        DrawRectangle(hwnd, rc) 
        CopyMemory(rc, rct, SizeOf(RECT)) 
      Else 
        SetFocus_(hEdit) 
        result = CallWindowProc_(OldLViewProc, hwnd, uMsg, wParam, lParam) 
      EndIf 
    Case #WM_CTLCOLOREDIT 
      If GetFocus_()=lParam 
        SetBkMode_(wParam, #TRANSPARENT) 
        If CurItem&1=0 
          TextBkColor = RGB(255, 255, 223) 
          If CurSubItem=3 
            TextColor = RGB(255, 0, 0) 
          EndIf 
        Else 
          TextBkColor = RGB(208, 208, 176) 
          If CurSubItem=3 
            TextColor = RGB(0, 0, 255) 
          EndIf 
        EndIf 
        SetTextColor_(wParam, TextColor) 
        result = CreateSolidBrush_(TextBkColor) 
      Else 
        result = CallWindowProc_(OldLViewProc, hwnd, uMsg, wParam, lParam) 
      EndIf 
    Case #WM_VSCROLL 
      result = CallWindowProc_(OldLViewProc, hwnd, uMsg, wParam, lParam) 
      rc.RECT 
      TopVisibleItem = SendMessage_(hwnd, #LVM_GETTOPINDEX, 0, 0) 
      If CellSelectOn 
        rc\top = CurSelSubItem 
        rc\left = #LVIR_BOUNDS 
        SendMessage_(hwnd, #LVM_GETSUBITEMRECT, CurSelItem, rc) 
        rct\top = rc\top 
        rct\bottom = rc\bottom-1 
        If TopVisibleItem<=CurSelItem 
          DrawRectangle(hwnd, rct) 
        EndIf 
      EndIf 
      If hEdit 
        If TopVisibleItem<=CurItem 
          ResizeGadget(2,#PB_Ignore, rc\top,#PB_Ignore,#PB_Ignore) 
          HideGadget(2, #False) 
          RedrawWindow_(hEdit, 0, 0, #RDW_INTERNALPAINT|#RDW_ERASE|#RDW_INVALIDATE) 
        Else 
          HideGadget(2, #True) 
        EndIf 
        SetFocus_(hEdit) 
      EndIf 
    Case #WM_HSCROLL 
      result = CallWindowProc_(OldLViewProc, hwnd, uMsg, wParam, lParam) 
      rc.RECT 
      TopVisibleItem = SendMessage_(hwnd, #LVM_GETTOPINDEX, 0, 0) 
      If CellSelectOn 
        rc\top = CurSelSubItem 
        rc\left = #LVIR_BOUNDS 
        SendMessage_(hwnd, #LVM_GETSUBITEMRECT, CurSelItem, rc) 
        rct\left = rc\left+1 
        rct\right = rc\right 
        If TopVisibleItem<=CurSelItem 
          DrawRectangle(hwnd, rct) 
        EndIf 
      EndIf 
      If hEdit 
        If TopVisibleItem<=CurItem 
          ResizeGadget(2, rc\left,#PB_Ignore,#PB_Ignore,#PB_Ignore) 
          HideGadget(2, #False) 
          RedrawWindow_(hEdit, 0, 0, #RDW_INTERNALPAINT|#RDW_ERASE|#RDW_INVALIDATE) 
        Else 
          HideGadget(2, #True) 
        EndIf 
        SetFocus_(hEdit) 
      EndIf 
    Default 
      result = CallWindowProc_(OldLViewProc, hwnd, uMsg, wParam, lParam) 
  EndSelect 
  ProcedureReturn result 
EndProcedure 

Procedure WndProc(hwnd, uMsg, wParam, lParam) 
  result = #PB_ProcessPureBasicEvents 
  Select uMsg 
    Case #WM_NOTIFY 
      *pnmh.NMHDR = lParam 
      Select *pnmh\code 
        Case #NM_CUSTOMDRAW 
          *LVCDHeader.NMLVCUSTOMDRAW = lParam 
          If *LVCDHeader\nmcd\hdr\hWndFrom=ListGadget 
            Select *LVCDHeader\nmcd\dwDrawStage 
              Case #CDDS_PREPAINT 
                result = #CDRF_NOTIFYITEMDRAW 
              Case #CDDS_ITEMPREPAINT 
                result = #CDRF_NOTIFYSUBITEMDRAW 
              Case #CDDS_SUBITEMPREPAINT 
                Row = *LVCDHeader\nmcd\dwItemSpec 
                Col = *LVCDHeader\iSubItem 
                If Col=0 
                  SelectObject_(*LVCDHeader\nmcd\hDC, FontBold) 
                Else 
                  SelectObject_(*LVCDHeader\nmcd\hDC, FontReg) 
                EndIf 
                If Row&1=0 
                  *LVCDHeader\clrTextBk = RGB(255, 255, 223) 
                  If Col=3 
                    *LVCDHeader\clrText = RGB(255, 0, 0) 
                  Else 
                    *LVCDHeader\clrText = RGB(0, 0, 0) 
                  EndIf 
                Else 
                  *LVCDHeader\clrTextBk = RGB(208, 208, 176) 
                  If Col=3 
                    *LVCDHeader\clrText = RGB(0, 0, 255) 
                  Else 
                    *LVCDHeader\clrText = RGB(0, 0, 0) 
                  EndIf 
                EndIf 
                result = #CDRF_NEWFONT 
            EndSelect 
          EndIf 
      EndSelect 
  EndSelect 
  ProcedureReturn result 
EndProcedure
dayvid
Messages : 1242
Inscription : mer. 11/nov./2009 18:17
Localisation : Poitiers (Vienne)

Re: ListIconGadget : Editable ?

Message par dayvid »

J'ai crée ceci il me semble que cela peut être pas mal :)
Note qu'il faille la libs PureCOLOR pour fonctionner !

Code : Tout sélectionner

; Exemple réaliser par monsieur dieppedalle david le 23 mars 2011
; Petite mise a jour le 10 octobre 2011

#Fenetre = 1
#ListIcon = 2
#BarreStatue = 3

Global CouleurFondCaseSelectionner = RGB(51, 153, 255)
Global CouleurTexteCaseSelectionner = RGB(255, 255, 255)
Global SauvegardeCase
Global SauvegardeColonne
Global SauvegardeCouleurCase
Global SauvegardeCouleurTexteCase
Global TexteCellule$
Global ListViewClickLigne
Global ListViewClickColonne

; pas de moi mais modifier par moi
Procedure.l WindowCallBack(WindowID.l, Message.l, wParam.l, lParam.l) 
  ReturnValue.l = #PB_ProcessPureBasicEvents
  ;
  If Message = #WM_NOTIFY
    *msg.NMHDR = lParam
    If *msg\hwndFrom = GadgetID(#ListIcon) And *msg \ code = #NM_CLICK
      *ListViewIA.NMITEMACTIVATE = lParam 
      ListViewClickLigne = *ListViewIA \ iItem 
      ListViewClickColonne = *ListViewIA \ iSubItem
      
      SauvegardeCouleurCase = PureCOLOR_GetCellColor(#ListIcon, ListViewClickLigne, ListViewClickColonne, 2)
      SauvegardeCouleurTexteCase = PureCOLOR_GetCellColor(#ListIcon, ListViewClickLigne, ListViewClickColonne, 1)
      TexteCellule$ = GetGadgetItemText(#ListIcon, ListViewClickLigne, ListViewClickColonne)
      
      If ListViewClickLigne <> -1 And ListViewClickColonne <> - 1
        StatusBarText(#BarreStatue, 0, " Cliquer gauche sur:  Ligne " + Str(ListViewClickLigne + 1) + ", Colonne " + Str(ListViewClickColonne + 1) + ", Texte: " + Chr(34) + TexteCellule$ + Chr(34))
      Else
        StatusBarText(#BarreStatue, 0, "Cliquez sur une cellule")
      EndIf
      
      PureCOLOR_SetCellColor(#ListIcon, ListViewClickLigne, ListViewClickColonne, CouleurTexteCaseSelectionner, CouleurFondCaseSelectionner)
      PureCOLOR_SetCellColor(#ListIcon, SauvegardeCase, SauvegardeColonne, SauvegardeCouleurTexteCase, SauvegardeCouleurCase)
      
      SauvegardeCase =  ListViewClickLigne
      SauvegardeColonne = ListViewClickColonne
      
      SetActiveGadget(999)
      
      ReturnValue = #False
      
    ElseIf *msg\hwndFrom = GadgetID(#ListIcon) And *msg \ code = -5
      *ListViewIA.NMITEMACTIVATE = lParam 
      ListViewClickLigne = *ListViewIA \ iItem 
      ListViewClickColonne = *ListViewIA \ iSubItem
      
      SauvegardeCouleurCase = PureCOLOR_GetCellColor(#ListIcon, ListViewClickLigne, ListViewClickColonne, 2)
      SauvegardeCouleurTexteCase = PureCOLOR_GetCellColor(#ListIcon, ListViewClickLigne, ListViewClickColonne, 1)
      TexteCellule$ = GetGadgetItemText(#ListIcon, ListViewClickLigne, ListViewClickColonne)
      
      If ListViewClickLigne <> -1 And ListViewClickColonne <> - 1
        StatusBarText(#BarreStatue, 0, " Cliquer droit sur:  Ligne " + Str(ListViewClickLigne + 1) + ", Colonne " + Str(ListViewClickColonne + 1) + ", Texte: " + Chr(34) + TexteCellule$ + Chr(34))
      Else
        StatusBarText(#BarreStatue, 0, "Cliquez sur une cellule")
      EndIf
      
      PureCOLOR_SetCellColor(#ListIcon, ListViewClickLigne, ListViewClickColonne, CouleurTexteCaseSelectionner, CouleurFondCaseSelectionner)
      PureCOLOR_SetCellColor(#ListIcon, SauvegardeCase, SauvegardeColonne, SauvegardeCouleurTexteCase, SauvegardeCouleurCase)
      
      SauvegardeCase =  ListViewClickLigne
      SauvegardeColonne = ListViewClickColonne
      
      SetActiveGadget(999)
      
      ReturnValue = #False
      
    EndIf
  EndIf
  ProcedureReturn ReturnValue
EndProcedure

; pas de moi mais modifier par moi
Procedure ListIconNombreColonne(Gadget)  
  col.LV_COLUMN\mask = #LVCF_WIDTH  
  Repeat  
    NombreColonne + 1
    X = SendMessage_(GadgetID(Gadget), #LVM_GETCOLUMN, NombreColonne, @col)  
  Until X = 0  
  ProcedureReturn NombreColonne  
EndProcedure  

OpenWindow(#Fenetre, 100, 300, 600, 450, "Intéragire avec les cellules", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
TextGadget(999, 0, 0, 0, 0, "")
CreateStatusBar(#BarreStatue, WindowID(#Fenetre))
AddStatusBarField(400)
AddStatusBarField(90)
AddStatusBarField(120)
StatusBarText(#BarreStatue, 0, "Cliquez sur une cellule")
SetWindowCallback(@WindowCallBack())
ListIconGadget(#ListIcon, 1, 1, 598, 425, "0", 100, #PB_ListIcon_GridLines | #PB_ListIcon_FullRowSelect)
;
SetGadgetItemText(#ListIcon, -1, "Colonne 1", 0)
SetGadgetItemAttribute(#ListIcon, 0, #PB_ListIcon_ColumnWidth, 65 , 0)

For b = 2 To 6          ; ajouter 3 Colonnes supplémentaires
  AddGadgetColumn(#ListIcon, b, "Colonne " + Str(b), 65)
Next
For b = 1 To 20         ; ajouter 4 éléments à chaque ligne des listes avec icônes
  AddGadgetItem(#ListIcon, b - 1, "Elément " + Str(b) + Chr(10) + "Elément " + Str(b) + Chr(10) + "Elément " + Str(b) + Chr(10) + "Elément " + Str(b) + Chr(10) + "Elément " + Str(b) + Chr(10) + "Elément " + Str(b) + Chr(10) + "Elément " + Str(b) + Chr(10) + "Elément 8")
Next

StatusBarText(#BarreStatue, 1, " Ligne: " + Str(CountGadgetItems(#ListIcon)))
StatusBarText(#BarreStatue, 2, " Colonne: " + Str(ListIconNombreColonne(#ListIcon)))

Repeat ; Start of the event loop
  
  Event = WaitWindowEvent(1) ; This line waits until an event is received from Windows
  WindowID = EventWindow() ; The Window where the event is generated, can be used in the gadget procedures
  GadgetID = EventGadget() ; Is it a gadget event?
  EventType = EventType() ; The event type
  
  If Event = #PB_Event_Gadget
    
    If GadgetID = #ListIcon
      
      If EventType = #PB_EventType_LeftDoubleClick
        If SauvegardeCase <> -1 And SauvegardeColonne <> - 1
          Texte$ = InputRequester("Editer le Texte de la cellule", "Veuillez entrez le nouveaux texte de la cellule", GetGadgetItemText(#ListIcon, SauvegardeCase, SauvegardeColonne))
          If Texte$ > ""
            SetGadgetItemText(#ListIcon, SauvegardeCase, Texte$, SauvegardeColonne)
            TexteCellule$ = GetGadgetItemText(#ListIcon, SauvegardeCase, SauvegardeColonne)
            StatusBarText(#BarreStatue, 0, " Cliquer sur:  Ligne " + Str(SauvegardeCase + 1) + ", Colonne " + Str(SauvegardeColonne + 1) + ", Texte: " + Chr(34) + TexteCellule$ + Chr(34))
          Else
            StatusBarText(#BarreStatue, 0, "Cliquez sur une cellule")
          EndIf
        EndIf
        
      EndIf
      
    EndIf
    
  EndIf
  
Until Event = #PB_Event_CloseWindow ; End of the event loop

La vie, C'est comme, Une boitte, De startis, On en voie, De toutes, Les couleurs !

Mon forum http://purebasic.forumphp3.com/index.php
Avatar de l’utilisateur
falsam
Messages : 7317
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: ListIconGadget : Editable ?

Message par falsam »

En natif, les ListIcongadget ne sont pas éditables. Tu peux utiliser un include que tu peux télécharger sur ce lien (EditListIcont.zip) qui va te permette de résoudre ce problème.

Deux fonctions :
SetListIconEditable(Gadget) : Le ListIcongadget devient éditable. Tu peux cliquer sur une cellule.
EditCell(gadget, Row, Col) : Focus en édition sur une cellule.

Un exemple de code çi-dessous.

Code : Tout sélectionner

XIncludeFile "EditListIcon.pbi" 
DisableExplicit 

LoadFont(1, "Arial", 10) 

If OpenWindow(0, 100, 100, 600, 600, "ListIcon Example", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) 
  
    ListIconGadget(1, 5, 5, 490, 390, "", 0, #PB_ListIcon_GridLines|#PB_ListIcon_FullRowSelect) 
    SetGadgetFont(1, FontID(1)) 
    For i = 0 To 2 
      AddGadgetColumn(1, i, "Col " + Str(i), 100) 
    Next 
    For row = 1 To 10
      AddGadgetItem(1, -1, "") 
      For col = 2 To 10 
        SetGadgetItemText(1, row-1, "row " + Str(row-1) + ", col " + Str(col), col) 
      Next 
    Next 
    
    SetListIconEditable(1) ;ListIconGadget devient éditable
    EditCell(1, 5, 1) ;Focus sur la 6ligne colonne 2
    
    Repeat 
      Event = WaitWindowEvent() 
    Until Event = #PB_Event_CloseWindow 
  
EndIf
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
dayvid
Messages : 1242
Inscription : mer. 11/nov./2009 18:17
Localisation : Poitiers (Vienne)

Re: ListIconGadget : Editable ?

Message par dayvid »

On dirais qu'il y a des bugs quand tu édite certaine cellules :|
Elle se décales et reviennent à leur place une fois fini, c'est normale ça ? :?
La vie, C'est comme, Une boitte, De startis, On en voie, De toutes, Les couleurs !

Mon forum http://purebasic.forumphp3.com/index.php
Avatar de l’utilisateur
falsam
Messages : 7317
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: ListIconGadget : Editable ?

Message par falsam »

dayvid a écrit :On dirais qu'il y a des bugs quand tu édite certaine cellules
Merci de me l'avoir signaler. Correction effectuée.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
dayvid
Messages : 1242
Inscription : mer. 11/nov./2009 18:17
Localisation : Poitiers (Vienne)

Re: ListIconGadget : Editable ?

Message par dayvid »

Super Falsam :)

Je souhaiterais cependant te faire part de certaine chose à améliorer si tu veux bien :)

1 - Quand tu double clique sur une cellule, le StrinGadget devrais à mon sens prendre la largeur de la colonne et ne jamais la dépasser !

2 - L'or de l'édition de la cellule, si le texte est plus long que celle-ci, celui-ci glissera vers la gauche et ne serra visible que la partie éditer (tu me suis ?)

3 - Quand tu double clique sur une cellule, il ne devrais pas y avoir de décalage entre le StrinGadget et la cellule !
On voie un petit décalage du texte, ça ne fais pas propre je trouve :)

Âpres les critique:

Très bon job :) :wink:
La vie, C'est comme, Une boitte, De startis, On en voie, De toutes, Les couleurs !

Mon forum http://purebasic.forumphp3.com/index.php
Avatar de l’utilisateur
falsam
Messages : 7317
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: ListIconGadget : Editable ?

Message par falsam »

dayvid a écrit :Très bon job :) :wink:
Regarde bien le créateur de cet include ....... c'est pas moi :p

Le fil de discutions que j'ai retrouvé sur le forum anglais
http://www.purebasic.fr/english/viewtop ... 12&t=27012
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Shinao
Messages : 137
Inscription : dim. 21/sept./2008 13:00

Re: ListIconGadget : Editable ?

Message par Shinao »

Merci pour vos réponses, je me disais bien que c'était une fonctionnalité particulièrement utilisé.

J'ai donc pris le fichier que tu as modifié falsam, en regardant le code des autres membres pour vori comment vous avez fait le tout.

Excellent en tout cas, d'une grande simplicité, le petit bug génant c'est que quand on modifie une cellule alors la cellule de la 1ere colonne de cette ligne disparaît... étrange.

Après j'aurais aimé pouvoir locker une colonne, je vais voir si c'est possible de le faire rapidement en trifouillant rapidement.

En tout cas merci à vous et si quelqu'un met à jour le fichier magique je suis là !
Shinao
Messages : 137
Inscription : dim. 21/sept./2008 13:00

Re: ListIconGadget : Editable ?

Message par Shinao »

3 - Quand tu double clique sur une cellule, il ne devrais pas y avoir de décalage entre le StrinGadget et la cellule !
On voie un petit décalage du texte, ça ne fais pas propre je trouve
Aucun intérêt de remettre le fichier, mais juste à changer les lignes 228 à 230 ce qui donne :

Code : Tout sélectionner

*wpos\cy=*liedit\cy 
*wpos\x=*liedit\x
*wpos\y=*liedit\y
L'ancien code était pour fixer XP je crois qu'il avait un décalage, supprimé parce qu'il y a une erreur d'explicit sûrement.

J'édite si je trouve pour LockColumn()... mais ça va être beaucoup plus dur surtout que niveau API Windows je rame, si quelqu'un si connait, come at me !

Edit : http://herosh.com/download/10883195/edi ... n.rar.html

Voilà ou j'en suis : LockColumn/LockRow(#IdListIcon, item) permet donc de gelé une ligne/colonne.

Seul soucis, je trouve mon code dégueulasse : j'ai voulu avoir un accès direct comme le fait une table de hachage, hors je ne sais pas comment on en fait en PB, donc j'ai fais une structure (Dim locked.elem(100)), donc on ne peut gelé que les 100 premieres colonnes ou lignes. Si quelqu'un pourrait régler ce problème car je pense que c'est immonde au niveau de la mémoire.

Thanks

PS : Toujours pas réussi à enlever le fait que la première colonne disparaisse, je laisse la place.
Golfy
Messages : 423
Inscription : mer. 25/août/2004 15:14
Localisation : Grenoble
Contact :

Re: ListIconGadget : Editable ?

Message par Golfy »

J'avoue que c'est ce qui m'a rebuté dans mon programme de domotique : les gars qui ont développés Excel sont des cadors en API Windows :lol:

Pour ma part, lorsqu'il y a un double-clic sur une ligne (de cellules), j'ouvre un formulaire...
Dommage que Purebasic ne propose pas un Gadget "Tableau-Editable" car j'ai toujours l'impression de rajouter une usine à gaz très contraignante sur cet aspect :roll:

Peut-être dans la version 5.00 :?: :|
Purebasic 5.30 full sous Windows XP (x86) et Win7 (64 bits), Linux Debian. Orientation réseaux, domotique
http://golfy.olympe.in/Teo-Tea/
Avatar de l’utilisateur
falsam
Messages : 7317
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: ListIconGadget : Editable ?

Message par falsam »

Tu peux essayer d'utiliser PureLVSORT
Dans sa derniere version, en plus de proposer un tri sur les colonnes ainsi qu'une sauvegarde du contenu d'un ListIconGadget, gnozal, propose une solution d'édition :
-Saisie de texte libre,
-Choix d'une valeur dans une liste déroulante

Image

La mise en oeuvre est simple à travers un CallBack évènementiel.
Les évenements testes sont les suivants.
#PureLVSORT_EditStart - La cellule vient de passer en mode édition
#PureLVSORT_EditText - Le texte de la cellule a changé
#PureLVSORT_EditEnd - Sortie du mode édition avec la touche Entrée
#PureLVSORT_EditEscape - Sortie du mode édition avec la touche Escape

Pour les 2 premiers évènements il est possible de connaitre la colonne et la ligne qui a provoqué l'évenement.
Malheureusement pour les deux suivants je pense qu'il y a un bug, !!

Code : Tout sélectionner

;Test PureLVSORT
;PB 4.61

Enumeration
  #FontApp
  #Mainform
  #Table
  #TotQte
  
  #Status
EndEnumeration

Global TotQte.i, LastBuffer.s
Global Mois.s="Janvier|Février|Mars|Avril|Mai|juin"

Declare.L Edit_Callback(Event.l, ListIconNumber.l, Column.l, Row.l, Text.s)
Declare GetTotalQty()
Declare Open_MainForm()

Procedure.l Edit_Callback(Event.l, ListIconNumber.l, Column.l, Row.l, Text.s)
  Static LastColumn = -1, LastRow = -1, LastBuffer.s
  If Column <> -1
    LastColumn = Column
    LastBuffer=Text
  EndIf
  If Row <> -1
    LastRow = Row
  EndIf
    
  SetGadgetText(#Status, Str(Column)+"/"+Str(LastRow)) 
  
  Select Event
    Case #PureLVSORT_EditStart
      Select LastColumn
        Case 0 ;Colonne 1 on peut choisir un mois (defilement des fleches)
          ProcedureReturn @"Janvier|Février|Mars|Avril|Mai|Juin"
          
        Case 1 ;Quantité de 1 à 10
          ProcedureReturn @"1|2|3|4|5|6|7|8|9|10"
          
        Case 2 ;Texte libre
          ProcedureReturn 0
          
      EndSelect
      
    Case #PureLVSORT_EditText
      ;On transforme le texte en masjuscule en cours d'écriture
      Select LastColumn
        Case 0
          
        Case 1
          
        Case 2
          LastBuffer=UCase(LastBuffer)
          ProcedureReturn @LastBuffer
          
      EndSelect
      
      
    Case #PureLVSORT_EditEnd
      ;Si une quantité est modifiée on recalcul le cumul de ces quantités
      Select LastColumn
        Case 0
          
        Case 1
          GetTotalQty()
          
        Case 2
          
      EndSelect
      
    Case #PureLVSORT_EditEscape
      ProcedureReturn @Text ; On retourne le texte initiale
      
  EndSelect
EndProcedure


;Recalcul les quantités
Procedure GetTotalQty()
  TotQte=0
  For i=0 To CountGadgetItems(#Table)-1
    TotQte+Val(GetGadgetItemText(#Table,i,1))
  Next
  SetGadgetText(#TotQte, Str(TotQte))  
EndProcedure


;Fenetre principale 
Procedure Open_MainForm()
  LoadFont(#FontApp,"Arial",11)
  SetGadgetFont(#PB_Default,FontID(#FontApp)) 

  OpenWindow(#Mainform, 0, 0, 500, 400, "Test PureLVSORT")
  ListIconGadget(#Table, 10,10,480,200,"Mois",100, #PB_ListIcon_FullRowSelect)
  AddGadgetColumn(#Table,1,"Qté.",50)
  AddGadgetColumn(#Table,2,"Observation.",200)
  TextGadget(#PB_Any, 10, 220, 100, 20, "Total Quantité : ")
  TextGadget(#TotQte, 110, 220, 50, 22, "0")
  
  TextGadget(#Status, 20, 350, 150, 22, "")
  
  
  ;Un peu de remplissage
  For row=0 To 5
    AddGadgetItem(#Table, -1, StringField(Mois,Row+1,"|") + Chr(10)+Str(Row))
  Next
  GetTotalQty()

  ;Utilisation de PureLVSORT 
  If PureLVSORT_SelectGadgetToSort(#Table, #PureLVSORT_ShowClickedHeader_IconLeft) = #PureLVSORT_Ok 
    PureLVSORT_SetColumnType(#Table, 0, #PureLVSORT_String)  
    PureLVSORT_SetColumnType(#Table, 1, #PureLVSORT_Float)  
    PureLVSORT_SetColumnAlignment(#Table, 1, #PureLVSORT_Right)
  
    PureLVSORT_MakeColumnEditable(#Table, 0, #True)
    PureLVSORT_MakeColumnEditable(#Table, 1, #True)
    PureLVSORT_MakeColumnEditable(#Table, 2, #True)
    
    PureLVSORT_SetEditingColors($DEF4F8, $000000)
    PureLVSORT_SetEditingCallback(@Edit_Callback()) 
  EndIf
  
  
EndProcedure


Open_MainForm()


Repeat
  Select WaitWindowEvent()
    Case #PB_Event_Gadget
      Select EventGadget()
          
      EndSelect
        
    Case #PB_Event_CloseWindow
      End
  EndSelect
  
ForEver
Le lien de téléchargement pour la version 4.60 ou 4.61
PB4.6x : http://gnozal.ucoz.com/PureLVSORT_460.zip

Il y a deux versions dans cette archive : PureLVSORT (standard) etPureLVSORT-Plus. Cette version contient les fonctionnalités de bases pour éditer un ListIconGadget. L'éxécution de PureLVSORT-Plus s'occupera de mettre en place la lib sans le dossier de Pure Basic. N'oublies pas de redémarrer le compilateur (menu compilateur puis redémarrer le compilateur).

:arrow: Le post sur le forum anglais
http://www.purebasic.fr/english/viewtop ... purelvsort

:arrow: Le site de gnozal
http://gnozal.ucoz.com/
Dernière modification par falsam le mer. 06/juin/2012 21:05, modifié 1 fois.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Shinao
Messages : 137
Inscription : dim. 21/sept./2008 13:00

Re: ListIconGadget : Editable ?

Message par Shinao »

Thanks, je devrais avoir tout les outils pour faire mes petites fonctions maintenant !
Mesa
Messages : 1126
Inscription : mer. 14/sept./2011 16:59

Re: ListIconGadget : Editable ?

Message par Mesa »

dayvid
Messages : 1242
Inscription : mer. 11/nov./2009 18:17
Localisation : Poitiers (Vienne)

Re: ListIconGadget : Editable ?

Message par dayvid »

C'est quoi, tu peut nous expliquer s'il te plait :)
La vie, C'est comme, Une boitte, De startis, On en voie, De toutes, Les couleurs !

Mon forum http://purebasic.forumphp3.com/index.php
Répondre