Listicongadget noch einfacheres Edit von Einträgen
Verfasst: 20.12.2012 12:13
diessmal mit eigenem Eventhandler, brauchbar für klitzekleine Programme
es gibt nur einen einzigen Befehl zum Aktivieren und natürlich die Include Datei
Falls Interesse, es gibt natürlich auch eine Extended Version, mit ein paar mehr Befehlen
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()