https://www.purebasic.fr/german/viewtop ... =8&t=20818
J'ai ajouté la possibilité d'éditer certaines colonnes avec un String ou une combobox en fonction du contenu de la liste passée en paramètres.
Je n'ai pas compris à quoi servait la fonction avec la touche F2, j'ai supprimée cette partie.
Fonctionne sur Window 10 X64 - Purebasic 5.71 LTS
Code : Tout sélectionner
; Description: Simple Editable ListIconGadget
; OS: Windows
; English-Forum:
; French-Forum:
; German-Forum: http://www.purebasic.fr/german/viewtopic.php?f=8&t=20818
; -----------------------------------------------------------------------------
; MIT License
;
; Copyright (c) 2009 hjbremer
; Copyright (c) 2014 ts-soft -- PB_Gadget_SendGadgetCommand() replaced with PostEvent()
; Copyright (c) 2015 GPI -- bugfix
;
; Permission is hereby granted, free of charge, to any person obtaining a copy
; of this software and associated documentation files (the "Software"), to deal
; in the Software without restriction, including without limitation the rights
; to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
; copies of the Software, and to permit persons to whom the Software is
; furnished to do so, subject to the following conditions:
;
; The above copyright notice and this permission notice shall be included in all
; copies or substantial portions of the Software.
;
; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
; IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
; FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
; AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
; LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
; SOFTWARE.
CompilerIf #PB_Compiler_OS<>#PB_OS_Windows
CompilerError "Windows Only!"
CompilerEndIf
; 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
; EnableExplicit
Declare Resize_saisie()
Global editfeld.l, L_mod.l, C_mod.l, oldCallback, Gadget_list
Enumeration
#but1
#lvg1
#lvg2
#lvg3
#win1
#font
#font1
EndEnumeration
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, List combob.s(), selflag = 0, font = -1)
Protected flag, x, y, br, hh, nix, iitem$, nwrow
Protected rect.RECT
Protected point.POINT
Static lvid, lvnr, lvhd, lvrow, lvcol, editfont, f2flag
If 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)
lvcol = point\x
lvrow = point\y
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)
If ListSize(combob()) = 0
editfeld = StringGadget(#PB_Any, x, y, br, hh,"")
Else
editfeld = ComboBoxGadget(#PB_Any,x,y,br,hh)
ClearGadgetItems(editfeld)
ForEach combob()
AddGadgetItem(editfeld,-1,combob())
Next
EndIf
SetGadgetText(editfeld,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
EndIf
ProcedureReturn event
EndProcedure
Procedure WindowCallback(hWnd,uMsg,wParam,lParam) ;redimension des combo et string
Select uMsg
Case #WM_NOTIFY
*nmHEADER.HD_NOTIFY = lParam
If *nmHEADER\hdr\code = #HDN_ITEMCHANGING
If *nmHEADER\iItem = 0
ProcedureReturn 1
EndIf
Resize_saisie()
EndIf
EndSelect
ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure
Procedure Resize_saisie()
If IsGadget(editfeld)
RtlZeroMemory_(@itemrect.RECT,SizeOf(RECT))
itemrect\top = C_mod
SendMessage_(GadgetID(Gadget_list),#LVM_GETSUBITEMRECT, L_mod, @itemrect)
ResizeGadget(editfeld,itemrect\left,itemrect\top,itemrect\right-itemrect\left,#PB_Ignore)
SetActiveGadget(editfeld)
EndIf
EndProcedure
;-Example
Procedure Open_win()
DisableExplicit
LoadFont(#font, "Arial", 10)
LoadFont(#font1, "Arial", 8)
OpenWindow(#win1,0,0,800,480,"ListIcon Gadget",#PB_Window_SystemMenu|1)
lvflags = #PB_ListIcon_GridLines|#PB_ListIcon_FullRowSelect|#PB_ListIcon_CheckBoxes
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, RGB(255, 255, 224))
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 25
nr$ = LSet(Str(i),3," ")
txt$ = "Text "+nr$+" in Spalte 0" + #LF$ + Str(Random(111))
AddGadgetItem(#lvg1, -1, txt$)
AddGadgetItem(#lvg2, -1, txt$)
AddGadgetItem(#lvg3, -1, txt$)
Next
NewList combo.s()
AddElement(combo()) : combo() = "1"
AddElement(combo()) : combo() = "3"
AddElement(combo()) : combo() = "5"
AddElement(combo()) : combo() = "6"
NewList comboA.s()
AddElement(comboA()) : comboA() = "Aube"
AddElement(comboA()) : comboA() = "Blois"
AddElement(comboA()) : comboA() = "Calva"
AddElement(comboA()) : comboA() = "Doubs"
NewList vide.s()
SetWindowCallback(@WindowCallback()) ;pouer redimensionner le string ou le combo
;=====================================================
Repeat
event = WaitWindowEvent(1)
Select event
Case #PB_Event_Gadget
Select EventGadget()
Case #lvg1
If Not IsGadget(editfeld)
LvMausclick(GadgetID(#lvg1),p1.Point)
L_mod = p1\y
C_mod = p1\x
Gadget_list = #lvg1
If p1\x = 0
event = LvEdit1(event,vide(),2)
ElseIf p1\x = 1
event = LvEdit1(event,combo(), 2)
ElseIf p1\x = 2
event = LvEdit1(event,comboA(), 2)
EndIf
EndIf
Case #lvg2
If Not IsGadget(editfeld)
LvMausclick(GadgetID(#lvg2),p2.Point)
L_mod = p2\y
C_mod = p2\x
Gadget_list = #lvg2
If p2\x = 1
event = LvEdit1(event,vide(), 2)
EndIf
EndIf
Case #lvg3
If Not IsGadget(editfeld)
LvMausclick(GadgetID(#lvg3),p3.Point)
L_mod = p3\y
C_mod = p3\x
Gadget_list = #lvg3
event = LvEdit1(event,vide(), 2)
EndIf
Case editfeld
If IsGadget(editfeld)
If EventType() = #PB_EventType_LostFocus And GadgetType(editfeld) = #PB_GadgetType_String
SetGadgetItemText(Gadget_list,L_mod,GetGadgetText(editfeld),C_mod)
FreeGadget(editfeld): editfeld = 0
ElseIf GadgetType(editfeld) = #PB_GadgetType_ComboBox
SetGadgetItemText(Gadget_list,L_mod,GetGadgetText(editfeld),C_mod)
FreeGadget(editfeld): editfeld = 0
EndIf
EndIf
EndSelect
Case #WM_KEYDOWN
;Edit beeenden wenn ESC oder Return
If IsGadget(editfeld) And GadgetType(editfeld) = #PB_GadgetType_String
Select EventwParam()
Case #VK_RETURN, #VK_DOWN
SetGadgetItemText(Gadget_list,L_mod,GetGadgetText(editfeld),C_mod)
FreeGadget(editfeld): editfeld = 0
If L_mod < CountGadgetItems(Gadget_list)
SetGadgetState(Gadget_list,L_mod + 1)
EndIf
Case #VK_UP
SetGadgetItemText(Gadget_list,L_mod,GetGadgetText(editfeld),C_mod)
FreeGadget(editfeld): editfeld = 0
If L_mod > 0
SetGadgetState(Gadget_list,L_mod - 1)
EndIf
Case #VK_ESCAPE
FreeGadget(editfeld): editfeld = 0
EndSelect
EndIf
Case 161
Resize_saisie()
EndSelect
Until event = #PB_Event_CloseWindow
EndProcedure
Open_win()