Seite 1 von 1

Listicongadget noch einfacheres Edit von Einträgen

Verfasst: 20.12.2012 12:13
von hjbremer
diessmal mit eigenem Eventhandler, brauchbar für klitzekleine Programme

es gibt nur einen einzigen Befehl zum Aktivieren und natürlich die Include Datei

Code: Alles auswählen

;ab PB 4.41 (x86) Windows 32 Bit - Dez.2012 - by HJBremer

Structure LvEditStruktur
   lvnr.i                  ;ListIconGadget PBnr
   lvid.i                  ;ListIconGadget Id
   hdid.i                  ;Header Id
   lvptr.i                 ;Pointer Ori WndProc
   strgnr.i                ;Stringgadget PBnr
   strgid.i                ;Stringgadget Id
   strgptr.i               ;Pointer Ori WndProc
   item.i                  ;Zeile
   subitem.i               ;Spalte
   editflag.i              ;wenn 1 im Editmode
   celltext.s              ;
   StructureUnion          ;um lParam in Hi + Loword zu zerlegen, nur für Mouseposi
      lparam.i             ; lParam vom Callback
      points.points        ; aufgeteiltes lParam in x + y
   EndStructureUnion   
EndStructure

EnableExplicit

Macro LvEdit_End(p)
   If p\editflag
      p\editflag = 0
      p\celltext = GetGadgetText(p\strgnr)
      SetGadgetItemText(p\lvnr, p\item, p\celltext, p\subitem)
      HideGadget(p\strgnr, 1)   
   EndIf
EndMacro
Macro LvEdit_Esc(p)
   If p\editflag
      p\editflag = 0
      HideGadget(p\strgnr, 1)   
   EndIf
EndMacro

Procedure.i LvEdit_CallBackLv(hwnd, msg, wParam, lParam) 
   Protected *lv.LvEditStruktur = GetWindowLongPtr_(hwnd, #GWL_USERDATA)   
   Protected *nm.NMHDR, hitinfo.LVHITTESTINFO, rect.rect, x, y, br, hh   
   With *lv      
      Select msg 
         Case #WM_MOUSEMOVE
            If \editflag = 0
               \lparam = lparam    ;Mouseposi Hi+Loword stehen in \points\x + y
            EndIf            
         
         Case #WM_VSCROLL, #WM_HSCROLL, #WM_RBUTTONDOWN, #WM_LBUTTONDOWN ;, #WM_NCMOUSELEAVE
            LvEdit_End(*lv)
            
         Case #WM_NOTIFY   ;vom Header 
            *nm = lparam
            If *nm\hwndFrom = \hdid: LvEdit_End(*lv): EndIf
            
         Case #WM_LBUTTONDBLCLK            
            LvEdit_End(*lv)            ;wenn im Editmode, erst beenden            
            hitinfo\pt\x = \points\x   ;\points kommt von #WM_MOUSEMOVE
            hitinfo\pt\y = \points\y  
            SendMessage_(hwnd, #LVM_SUBITEMHITTEST, 0, hitinfo)            
            \item = hitinfo\iitem
            \subitem = hitinfo\iSubItem             
            rect\top = \subitem          
            rect\left = #LVIR_LABEL
            SendMessage_(hwnd, #LVM_GETSUBITEMRECT, \item, rect)                
            \celltext = GetGadgetItemText(\lvnr, \item, \subitem)               
            x = rect\left + 1 
            y = rect\top + 0
            br = rect\right - rect\left - 1
            hh = rect\bottom - rect\top - 0
            ResizeGadget(\strgnr, x, y, br, hh)
            SetGadgetText(\strgnr, \celltext)
            HideGadget(\strgnr, 0)
            SetActiveGadget(\strgnr)
            \editflag = 1
      EndSelect       
      ProcedureReturn CallWindowProc_(\lvptr, hwnd, msg, wParam, lParam)      
   EndWith
EndProcedure 

Procedure.i LvEdit_CallBackStrg(hwnd, msg, wParam, lParam) 
   Protected *lv.LvEditStruktur = GetWindowLongPtr_(hwnd, #GWL_USERDATA)
   If msg = #WM_CHAR            
      Select wparam 
         Case #VK_RETURN: LvEdit_End(*lv)
         Case #VK_ESCAPE: LvEdit_Esc(*lv)                  
      EndSelect
   ElseIf msg = #WM_KILLFOCUS
      LvEdit_End(*lv)
   EndIf
   ProcedureReturn CallWindowProc_(*lv\strgptr, hwnd, msg, wParam, lParam) 
EndProcedure 

Procedure.i LvEditEnable(lvnr, fontid = 0)   
   Protected *lv.LvEditStruktur = AllocateMemory(SizeOf(LvEditStruktur))    
   If fontid = 0: fontid = GetGadgetFont(lvnr): EndIf   
   With *lv      
      ;LV
      \lvnr = lvnr 
      \lvid = GadgetID(lvnr)
      \hdid = SendMessage_(\lvid, #LVM_GETHEADER, 0, 0)         
      \lvptr = GetWindowLongPtr_(\lvid, #GWL_WNDPROC)  ;Original WindowProcPointer holen
      SetWindowLongPtr_(\lvid, #GWL_USERDATA, *lv)     ;Memory + WindowProc setzen
      SetWindowLongPtr_(\lvid, #GWL_WNDPROC, @LvEdit_CallBackLv())
      ;StringGadget
      \strgnr = StringGadget(#PB_Any, 0, 0, 0, 0, "")
      \strgid = GadgetID(\strgnr)         
      \strgptr = GetWindowLongPtr_(\strgid, #GWL_WNDPROC)
      SetGadgetFont(\strgnr, fontid)
      HideGadget(\strgnr, 1)
      SetParent_(\strgid, \lvid) ; wichtig !!!
      SetWindowLongPtr_(\strgid, #GWL_USERDATA, *lv)
      SetWindowLongPtr_(\strgid, #GWL_WNDPROC, @LvEdit_CallBackStrg())
   EndWith   
EndProcedure

DisableExplicit

Code: Alles auswählen

XIncludeFile "LvEditMini.pbi"

Enumeration
   #window   
   #liste1   
   #liste2   
EndEnumeration

Procedure.i Mainwindow()
   
   Protected j, event   
   Protected flags = #PB_Window_SystemMenu|#PB_Window_MinimizeGadget
   
   OpenWindow(#window, 150, 150, 700, 600, "", flags)
   ListIconGadget(#liste1, 20, 5, 290, 500, "0", 40, #PB_ListIcon_GridLines|#PB_ListIcon_FullRowSelect)
   ListIconGadget(#liste2, 320, 5, 290, 500, "0", 40, #PB_ListIcon_GridLines|#PB_ListIcon_FullRowSelect)
   For j = 1 To 3
      AddGadgetColumn(#liste1, j, Str(j), 80)
      AddGadgetColumn(#liste2, j, Str(j), 80)
   Next   
   For j = 0 To 27      
      AddGadgetItem(#liste1, -1, Str(j)+#LF$+"Hans"+#LF$+"Meier"+#LF$+Str(Random(999)))      
      AddGadgetItem(#liste2, -1, Str(j)+#LF$+"Otto"+#LF$+"Leier"+#LF$+Str(Random(999)))      
   Next 
   
   LvEditEnable(#liste1)       
   LvEditEnable(#liste2)       
   SetActiveGadget(#liste1)
   
   Repeat: event = WaitWindowEvent()      
   Until event = #PB_Event_CloseWindow 
   
EndProcedure

Mainwindow()
Falls Interesse, es gibt natürlich auch eine Extended Version, mit ein paar mehr Befehlen

Re: Listicongadget noch einfacheres Edit von Einträgen

Verfasst: 20.12.2012 12:20
von STARGÅTE
Nett, und wirklich einfach (in der Einbindung) :allright:

Re: Listicongadget noch einfacheres Edit von Einträgen

Verfasst: 20.12.2012 12:58
von bobobo
Cool !
Tastatursteuerung
Pfeiltasten und Enter verlassen das aktuelle Feld gespeichert und
setzen das nächste (in Pfeilrichtung oder rechts bzw. unten (konfigurierbar)bei Enter )
editierbar.
Esc beenden diesen Modus.

mit der Gnozal-Lib PureLVSort (extended) habe ich das mal ansatzweise
versucht (Pfeil nach unten geht dort)

http://www.purebasic.fr/english/viewtop ... 73#p394573

Re: Listicongadget noch einfacheres Edit von Einträgen

Verfasst: 20.12.2012 13:00
von ts-soft
:allright: cool

Re: Listicongadget noch einfacheres Edit von Einträgen

Verfasst: 20.12.2012 13:06
von RSBasic
:allright:

Re: Listicongadget noch einfacheres Edit von Einträgen

Verfasst: 20.12.2012 13:30
von Falko
:allright:

Re: Listicongadget noch einfacheres Edit von Einträgen

Verfasst: 20.12.2012 14:49
von H.Brill
Auch von mir :allright:
Bin schon seit einiger Zeit auf der Suche nach erweiterten
Funktionen des ListIcon - Gadgets. Hab sonst immer Frank
Abbings Listview.dll benutzt. Die gibts aber nur für 32 Bit, was
schade ist.

Was ich noch vermisse, wäre eine schöne Druckfunktion. Die Codes,
die ich während der letzten Jahre so gefunden hatte, funktionierten
entweder nicht richtig oder das Druckbild war für mich nicht so befriedigend.
Deshalb nutzte ich auch da immer Franks Listview.dll, die das sehr gut
machte.

Re: Listicongadget noch einfacheres Edit von Einträgen

Verfasst: 20.12.2012 19:56
von mk-soft
:allright: