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()