
hier die Include Datei
Code: Alles auswählen
; ListIconGadget Felder editieren
;
; Aufruf: im Hauptprogramm nur eine Zeile einfügen, direkt nach
; event = WaitWindowEvent() kommt
; event = LvEdit1(event)
;
; zusätzlicher Parameter selflag 0, 1 oder 2
; event = WaitWindowEvent()
; event = LvEdit1(event, 1)
; 0 = Cursor am Anfang, nur nötig wenn font angegeben
; 1 = Cursor ans Ende
; 2 = Cursor ans Ende + Feldinhalt wird markiert
;
; zusätzlicher Parameter font
; event = WaitWindowEvent()
; event = LvEdit1(event, 0, fontnr)
; Die fontnr muß eine PbNr sein, keine ID
; Wird ein Font angegeben sollte dieser auch geladen sein.
; Ohne fontnr wird ein etwas kleinerer Font geladen
;
; mit Doppelclick auf ein Feld wird Edit aktiviert
; mit ESC oder ein Klick auf ein Feld/Gadget/Window wird Edit beendet
;
; NUR mit Return werden Eingaben übernommen !
;
; zusätzlicher Spielkram
; wenn eine Zeile markiert und F2 gedrückt wird,
; wird Edit aktiviert und zwar das Feld in dem die Maus sich befindet.
; Nun mit Pfeiltasten oder Maus eine andere Zeile wählen, F2 drücken
; und nächstes Feld in der gleichen Spalte bearbeiten.
; Diesen "F2-Modus" mit Doppelclick auf ein Feld wieder ausschalten
Import ""
PB_Gadget_SendGadgetCommand(id, pbEventType)
EndImport
;EnableExplicit
Procedure LvFontHoehe(pbnr)
Protected lg.LOGFONT
Protected fontid = GetGadgetFont(pbnr)
Protected pixely = GetDeviceCaps_(GetDC_(0), #LOGPIXELSY)
Protected retvalue = GetObject_(fontid, SizeOf(LOGFONT), lg)
Protected fonthoehe = -MulDiv_(lg\lfHeight, 72, pixely)
ProcedureReturn fonthoehe
EndProcedure
Procedure LvMausclick(lvid,*p.Point)
Protected lvhit.LVHITTESTINFO
GetCursorPos_(*p) ;wo ist Maus
MapWindowPoints_(0, lvid, *p, 1)
lvhit\pt\x = *p\x
lvhit\pt\y = *p\y
SendMessage_(lvid, #LVM_SUBITEMHITTEST, 0, lvhit)
*p\y = lvhit\iItem ;row ab 0
*p\x = lvhit\iSubItem ;col ab 0
EndProcedure
Procedure LvEdit1(event, selflag = 0, font = -1)
Protected flag, x, y, br, hh, nix, iitem$
Protected rect.RECT
Protected point.POINT
Static lvid, lvnr, lvhd, lvrow, lvcol, editfeld, editfont, f2flag
If editfeld
Select event
Case 161 ;Scrollbalken Keyup
;Edit beeenden
flag = 3
Case #WM_KEYDOWN
;Edit beeenden wenn ESC oder Return
If EventwParam() = #VK_RETURN: flag = 2: EndIf
If EventwParam() = #VK_ESCAPE: flag = 1: EndIf
Case #PB_Event_Gadget
;Edit beeenden wenn LostFocus
If EventGadget() = editfeld
If EventType() = #PB_EventType_LostFocus
flag = 1
EndIf
Else ;oder irgendein anderes Gadget angeclickt
flag = 1
EndIf
Case #PB_Event_Menu, #PB_Event_SysTray ;bei Bedarf mehr Events
flag = 1 ;Edit beeenden
EndSelect
;Header angeclickt ? wenn ja Edit Ende
If GetCapture_() = lvhd: flag = 1: EndIf
If flag ;Edit beenden
SetGadgetState(lvnr,lvrow)
;Return gedrückt
If flag = 2
iitem$ = GetGadgetText(editfeld)
SetGadgetItemText(lvnr, lvrow, iitem$, lvcol)
EndIf
;neu zeichnen falls Liste verschoben
If flag = 3
SendMessage_(lvid, #WM_SETREDRAW, #True, 0)
InvalidateRect_(lvid, 0, #True)
EndIf
FreeGadget(editfeld): editfeld = 0
If font = -1: FreeFont(editfont): EndIf
EndIf
ElseIf event = #PB_Event_Gadget
lvnr = EventGadget()
If IsGadget(lvnr) = 0: ProcedureReturn -1: EndIf
If GadgetType(lvnr) = #PB_GadgetType_ListIcon
If EventType() = #PB_EventType_LeftDoubleClick
lvid = GadgetID(lvnr)
lvhd = SendMessage_(lvid, #LVM_GETHEADER, 0, 0)
LvMausclick(lvid, point)
If f2flag = 0
lvcol = point\x
lvrow = point\y
Else
lvrow = GetGadgetState(lvnr)
EndIf
If lvrow = -1: ProcedureReturn -1: EndIf
rect\top = lvcol
rect\left = #LVIR_LABEL
SendMessage_(lvid, #LVM_GETSUBITEMRECT , lvrow, rect)
InflateRect_(rect,1,1) ;rect um 1 vergrößern
x = rect\left + 1
y = rect\top
br = rect\right - rect\left
hh = rect\bottom - rect\top
iitem$ = GetGadgetItemText(lvnr, lvrow, lvcol)
editfeld = StringGadget(#PB_Any, x, y, br, hh, iitem$)
If font = -1
editfont = LoadFont(#PB_Any, "Arial", LvFontHoehe(lvnr) - 1)
Else
editfont = font
EndIf
If IsFont(editfont): SetGadgetFont(editfeld,FontID(editfont)): EndIf
If selflag = 1 ;ans Ende
SendMessage_(GadgetID(editfeld), #EM_SETSEL, Len(iitem$), -1)
ElseIf selflag = 2 ;ans Ende + alles markieren
SendMessage_(GadgetID(editfeld), #EM_SETSEL, 0, -1)
EndIf
;sieht besser aus finde ich
SetWindowTheme_(GadgetID(editfeld), @nix, @nix)
SetParent_(GadgetID(editfeld), lvid) ;sehr wichtig
SetActiveGadget(editfeld)
EndIf
EndIf
ElseIf event = #WM_KEYDOWN ;etwas Spielkram
If EventwParam() = #VK_F2
lvnr = GetActiveGadget()
If IsGadget(lvnr)
If GadgetType(lvnr) = #PB_GadgetType_ListIcon
f2flag = 1
PB_Gadget_SendGadgetCommand(GadgetID(lvnr), #PB_EventType_LeftDoubleClick)
EndIf
EndIf
EndIf
ElseIf event = #WM_LBUTTONDBLCLK ;beim nächsten Doubleclick auf null
f2flag = 0
EndIf
ProcedureReturn event
EndProcedure
Code: Alles auswählen
XIncludeFile "\Bremer\PureBasic430_Pbi\LvEdit1.pbi"
Enumeration
#but1
#lvg1
#lvg2
#lvg3
#win1
#font
#font1
EndEnumeration
LoadFont(#font, "Arial", 10)
LoadFont(#font1, "Arial", 8)
OpenWindow(#win1,0,0,800,480,"ListIcon Gadget",#PB_Window_SystemMenu|1)
ButtonGadget(#but1,10,440,80,25,"Tue nix")
lvflags = #PB_ListIcon_GridLines|#PB_ListIcon_FullRowSelect|#PB_ListIcon_CheckBoxes ;|#LVS_NOCOLUMNHEADER)
ListIconGadget(#lvg1,10,10,280,400,"Spalte 0",140,lvflags)
AddGadgetColumn(#lvg1,1,"Spalte 1",55)
AddGadgetColumn(#lvg1,2,"Spalte 2",55)
SetGadgetFont(#lvg1,FontID(#font))
SetGadgetColor(#lvg1, #PB_Gadget_BackColor, #Yellow)
lvflags = #PB_ListIcon_GridLines|#PB_ListIcon_FullRowSelect|#LVS_NOCOLUMNHEADER
ListIconGadget(#lvg2,300,10,220,400,"Spalte 0",140,lvflags)
AddGadgetColumn(#lvg2,1,"Spalte 1",55)
SetGadgetFont(#lvg2,FontID(#font))
lvflags = #PB_ListIcon_GridLines
ListIconGadget(#lvg3,530,10,220,400,"Spalte 0",140,lvflags)
AddGadgetColumn(#lvg3,1,"Spalte 1",55)
SetGadgetFont(#lvg3,FontID(#font))
For i = 0 To 16
nr$ = LSet(Str(i),3," ")
txt$ = "Text in Zeile "+nr$+" in Spalte 0" + #LF$ + Str(Random(111))
AddGadgetItem(#lvg1, -1, txt$)
AddGadgetItem(#lvg2, -1, txt$)
AddGadgetItem(#lvg3, -1, txt$)
Next
;=====================================================
Repeat
event = WaitWindowEvent(1)
event = LvEdit1(event, 2)
If Event = #PB_Event_Gadget Or Event = #PB_Event_Menu
welcherButton = EventGadget()
Select welcherButton
Case #but1: Debug "Button 1 gedrückt"
Case #lvg1: If EventType() = #PB_EventType_LeftClick
;LvMausclick kann auch separat benutzt werden
LvMausclick(GadgetID(#lvg1),p.Point)
Debug "lv1 " + Str(p\x) + " " + Str(p\y)
EndIf
EndSelect
EndIf
Until event = #PB_Event_CloseWindow
End
