Listicongadget noch einfacheres Edit von Einträgen

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Listicongadget noch einfacheres Edit von Einträgen

Beitrag von hjbremer »

diessmal mit eigenem Eventhandler, brauchbar für klitzekleine Programme

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()
Falls Interesse, es gibt natürlich auch eine Extended Version, mit ein paar mehr Befehlen
Purebasic 5.70 x86 5.72 X 64 - Windows 10

Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6999
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Listicongadget noch einfacheres Edit von Einträgen

Beitrag von STARGÅTE »

Nett, und wirklich einfach (in der Einbindung) :allright:
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3857
Registriert: 13.09.2004 17:48
Kontaktdaten:

Re: Listicongadget noch einfacheres Edit von Einträgen

Beitrag von bobobo »

Cool !
Tastatursteuerung
Pfeiltasten und Enter verlassen das aktuelle Feld gespeichert und
setzen das nächste (in Pfeilrichtung oder rechts bzw. unten (konfigurierbar)bei Enter )
editierbar.
Esc beenden diesen Modus.

mit der Gnozal-Lib PureLVSort (extended) habe ich das mal ansatzweise
versucht (Pfeil nach unten geht dort)

http://www.purebasic.fr/english/viewtop ... 73#p394573
‮pb aktuell5.7 - windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Listicongadget noch einfacheres Edit von Einträgen

Beitrag von ts-soft »

:allright: cool
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Listicongadget noch einfacheres Edit von Einträgen

Beitrag von RSBasic »

:allright:
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
Falko
Admin
Beiträge: 3531
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.0
Kontaktdaten:

Re: Listicongadget noch einfacheres Edit von Einträgen

Beitrag von Falko »

:allright:
Bild
Win10 Pro 64-Bit, PB_5.4,GFA-WinDOS, Powerbasic9.05-Windows, NSBasic/CE, NSBasic/Desktop, NSBasic4APP, EmergenceBasic
H.Brill
Beiträge: 357
Registriert: 15.10.2004 17:42
Wohnort: 66557 Neunkirchen

Re: Listicongadget noch einfacheres Edit von Einträgen

Beitrag von H.Brill »

Auch von mir :allright:
Bin schon seit einiger Zeit auf der Suche nach erweiterten
Funktionen des ListIcon - Gadgets. Hab sonst immer Frank
Abbings Listview.dll benutzt. Die gibts aber nur für 32 Bit, was
schade ist.

Was ich noch vermisse, wäre eine schöne Druckfunktion. Die Codes,
die ich während der letzten Jahre so gefunden hatte, funktionierten
entweder nicht richtig oder das Druckbild war für mich nicht so befriedigend.
Deshalb nutzte ich auch da immer Franks Listview.dll, die das sehr gut
machte.
PB 6.10
Benutzeravatar
mk-soft
Beiträge: 3701
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Listicongadget noch einfacheres Edit von Einträgen

Beitrag von mk-soft »

:allright:
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Antworten