Ich wollte dass Postevent durch Prototype ersetzen. Geht auch, aber ...
Wenn der Prototype-FunktionsName im Modul der Gleiche ist wie der Prozedurname im Mainprogramm gibt es eine Fehlermeldung
Was mach ich falsch ? oder muß das so sein !
Code: Alles auswählen
DeclareModule ListIconGadgetEdit
; Alle Elemente in diesem Abschnitt sind für den Zugriff von außerhalb verfügbar
Declare ListIconGadgetEdit(lvnr, window, fontid = 0, ptr = 0)
Declare ListIconGadgetEditOld(lvnr, *p.point)
#my_EventType_EditEnd = 999
EndDeclareModule
Module ListIconGadgetEdit
; Alle Elemente in diesem Abschnitt sind privat. Alle Namen können ohne
; Namenskonflikt auch woanders verwendet werden.
Structure EditStruktur
lvnr.i ;ListIconGadget PBnr
lvpt.i ;Pointer Ori WndProc
item.i ;Zeile
subitem.i ;Spalte
header.i ;Header Id
strgnr.i ;Stringgadget PBnr
strgpt.i ;Pointer Ori WndProc
editflag.i ;wenn 1 im Editmode
oldtext.s
newtext.s
checkptr.i
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
Prototype editcheck(a, b, c)
Global EditCheck.editcheck
EnableExplicit
Macro Edit_End(p)
If p\editflag
p\editflag = 0
p\oldtext = GetGadgetItemText(p\lvnr, p\item, p\subitem)
p\newtext = GetGadgetText(p\strgnr)
SetGadgetItemText(p\lvnr, p\item, p\newtext, p\subitem)
;PostEvent(#PB_Event_Gadget, EventWindow(), p\lvnr, #my_EventType_EditEnd)
If p\checkptr
EditCheck = p\checkptr
If EditCheck(p\lvnr, p\item, p\subitem) = #False
Debug "xyz bla bla"
EndIf
EndIf
HideGadget(p\strgnr, 1)
EndIf
EndMacro
Macro Edit_Esc(p)
If p\editflag
p\editflag = 0
HideGadget(p\strgnr, 1)
EndIf
EndMacro
Procedure.s ListIconGadgetGetItem(lvnr, iitem)
Protected j
Protected head = SendMessage_(GadgetID(lvnr), #LVM_GETHEADER, 0, 0)
Protected cols = SendMessage_(head, #HDM_GETITEMCOUNT, 0, 0)
Protected item$ = GetGadgetItemText(lvnr, iitem, 0)
For j = 1 To cols -1
item$ + #TAB$ + GetGadgetItemText(lvnr, iitem, j)
Next
item$ + #CR$
ProcedureReturn item$
EndProcedure
Procedure.i CallBackLv(hwnd, msg, wParam, lParam)
Protected *lv.EditStruktur = GetWindowLongPtr_(hwnd, #GWL_USERDATA)
Protected *nm.NMHDR, hitinfo.LVHITTESTINFO
Protected rect.rect, x, y, br, hh, txt$
Protected j, count, iitem, shift
Static item$
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
Edit_End(*lv)
Case #WM_NOTIFY ;vom Header
*nm = lparam
If *nm\hwndFrom = \header: Edit_End(*lv): EndIf
Case #WM_KEYDOWN ;: Debug wParam
Select wParam
Case #VK_F2: PostMessage_(hwnd, #WM_LBUTTONDBLCLK, 0, 0)
Case #VK_DELETE
shift = #False
If GetKeyState_(#VK_SHIFT) > 1: shift = #True: EndIf
If shift = #True: item$ = "": EndIf
iitem = -1
count = SendMessage_(hwnd, #LVM_GETSELECTEDCOUNT, 0, 0)
For j = 1 To count
iitem = SendMessage_(hwnd, #LVM_GETNEXTITEM, iitem, #LVNI_SELECTED)
If shift = #True
item$ + ListIconGadgetGetItem(\lvnr, iitem)
SetClipboardText(item$)
EndIf
RemoveGadgetItem(\lvnr, iitem)
iitem - 1
Next
SetGadgetState(\lvnr, iitem + 1)
Case #VK_INSERT
shift = #False
If GetKeyState_(#VK_SHIFT) > 1: shift = #True: EndIf
iitem = GetGadgetState(\lvnr)
If shift = #False
If iitem = -1
AddGadgetItem(\lvnr, iitem, "")
iitem = CountGadgetItems(\lvnr) - 1
Else
AddGadgetItem(\lvnr, iitem, "")
EndIf
Else
If iitem = -1: iitem = CountGadgetItems(\lvnr): EndIf
count = CountString(item$, #CR$)
ReplaceString(item$, #TAB$, #LF$, #PB_String_InPlace)
For j = 1 To count
AddGadgetItem(\lvnr, iitem + j - 1, StringField(item$, j, #CR$))
Next
SetGadgetState(\lvnr, -1)
EndIf
SetGadgetState(\lvnr, iitem)
EndSelect
Case #WM_LBUTTONDBLCLK
Edit_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)
x = rect\left + 1
y = rect\top + 0
br = rect\right - rect\left - 1
hh = rect\bottom - rect\top - 1
txt$ = GetGadgetItemText(\lvnr, \item, \subitem)
ResizeGadget(\strgnr, x, y, br, hh)
SetGadgetText(\strgnr, txt$)
SendMessage_(GadgetID(\strgnr), #EM_SETSEL, Len(txt$), -1) ;Cursor ans Ende
HideGadget(\strgnr, 0)
SetActiveGadget(\strgnr)
\editflag = 1
EndSelect
ProcedureReturn CallWindowProc_(\lvpt, hwnd, msg, wParam, lParam)
EndWith
EndProcedure
Procedure.i CallBackStrg(hwnd, msg, wParam, lParam)
Protected *lv.EditStruktur = GetWindowLongPtr_(hwnd, #GWL_USERDATA)
If msg = #WM_CHAR
Select wparam
Case #VK_RETURN: Edit_End(*lv)
Case #VK_ESCAPE: Edit_Esc(*lv)
EndSelect
ElseIf msg = #WM_KILLFOCUS
Edit_End(*lv)
EndIf
ProcedureReturn CallWindowProc_(*lv\strgpt, hwnd, msg, wParam, lParam)
EndProcedure
Procedure.i ListIconGadgetEdit(lvnr, window, fontid = 0, ptr = 0)
Protected *lv.EditStruktur = AllocateMemory(SizeOf(EditStruktur))
Protected lvid, strgid, oldlist
If fontid = 0: fontid = GetGadgetFont(lvnr): EndIf
With *lv
;LV
\lvnr = lvnr: lvid = GadgetID(lvnr)
\lvpt = GetWindowLongPtr_(lvid, #GWL_WNDPROC) ;Ori WindowProcPointer holen
SetWindowLongPtr_(lvid, #GWL_USERDATA, *lv) ;Memory setzen
SetWindowLongPtr_(lvid, #GWL_WNDPROC, @CallBackLv()) ;WindowProc setzen
\header = SendMessage_(lvid, #LVM_GETHEADER, 0, 0)
;StringGadget
oldlist = UseGadgetList(WindowID(window))
\strgnr = StringGadget(#PB_Any, 0, 0, 0, 0, "")
strgid = GadgetID(\strgnr)
\strgpt = GetWindowLongPtr_(strgid, #GWL_WNDPROC)
SetGadgetFont(\strgnr, fontid)
HideGadget(\strgnr, 1)
SetParent_(strgid, lvid)
SetWindowLongPtr_(strgid, #GWL_USERDATA, *lv)
SetWindowLongPtr_(strgid, #GWL_WNDPROC, @CallBackStrg())
If oldlist: UseGadgetList(oldlist): EndIf
\checkptr = ptr
EndWith
EndProcedure
Procedure.i ListIconGadgetEditOld(lvnr, *p.point)
Protected *lv.EditStruktur = GetWindowLongPtr_(GadgetID(lvnr), #GWL_USERDATA)
*p\y = *lv\item
*p\x = *lv\subitem
ProcedureReturn @*lv\oldtext
EndProcedure
EndModule
UseModule ListIconGadgetEdit
; -Test
CompilerIf #PB_Compiler_IsMainFile
Enumeration
#window
#liste1
#liste2
EndEnumeration
Procedure.i EditCheck1(nr, iitem, subitem)
Debug "nr " + nr
Debug "iitem " + iitem
Debug "subitem " + subitem
ProcedureReturn #True
EndProcedure
Procedure.i EditCheck(nr, iitem, subitem)
Debug "nr " + nr
Debug "iitem " + iitem
Debug "subitem " + subitem
ProcedureReturn #False
EndProcedure
Procedure.i Mainwindow()
Protected j, event
Protected flags = #PB_Window_SystemMenu|#PB_Window_MinimizeGadget
OpenWindow(#window, 150, 150, 700, 600, "", flags)
flags = #PB_ListIcon_GridLines|#PB_ListIcon_FullRowSelect
flags | #PB_ListIcon_MultiSelect
ListIconGadget(#liste1, 20, 5, 290, 500, "0", 40, flags)
ListIconGadget(#liste2, 320, 5, 290, 500, "0", 40, flags)
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
ListIconGadgetEdit(#liste1, #window, 0, @EditCheck1())
ListIconGadgetEdit(#liste2, #window, 0, @EditCheck())
SetActiveGadget(#liste1)
Repeat: event = WaitWindowEvent()
Until event = #PB_Event_CloseWindow
EndProcedure
Mainwindow()
CompilerEndIf