Listicongadget simples Edit von Einträgen
Verfasst: 03.09.2009 18:56
ich weiß gibt es ohne Ende, aber ich finde mein Werk einfach schön
und es funktioniert ohne Callback und vor allem man braucht nur eine einzige Zeile ins Hauptprogramm einfügen.
hier die Include Datei
und hier eine Demo
und für die jenigen die was zu nörgln haben, I am 

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
