Listicongadget simples 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 simples Edit von Einträgen

Beitrag von hjbremer »

ich weiß gibt es ohne Ende, aber ich finde mein Werk einfach schön :mrgreen: und es funktioniert ohne Callback und vor allem man braucht nur eine einzige Zeile ins Hauptprogramm einfügen.

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
und hier eine Demo

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 
und für die jenigen die was zu nörgln haben, I am :iamwithstupid:
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
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Beitrag von RSBasic »

@hjbremer
Schöner Code :allright:
Sehr nützlich :allright:

Schön, dass du diesmal im richtigen Unterforum gepostet hast :mrgreen:
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
Hyper
Beiträge: 194
Registriert: 19.04.2005 19:14

Beitrag von Hyper »

Sehr nützlich - Danke!
Kann man irgenwie einstellen, dass bestimmte Spalten/Zeilen nicht editierbar sein sollen?
PB 5.72
Benutzeravatar
HeX0R
Beiträge: 3040
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Beitrag von HeX0R »

Code: Alles auswählen

Case 161 ;Scrollbalken Keyup
Event-Nr. 161 nennt sich übrigens #WM_NCLBUTTONDOWN.
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Beitrag von hjbremer »

Hallo Hyper, möglich ist alles, aber dann wäe es nicht mehr simpel. Du könntest aber ein Strukturarray übergeben in dem das dann definiert wird.
Also LvEdit1(event, 0, -1, Array myFelddef()) oder so ähnlich, vielleicht mache ich das mal. :D

Danke HeX0R für den Hinweis.
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
Hyper
Beiträge: 194
Registriert: 19.04.2005 19:14

Beitrag von Hyper »

Hallo hjbremer,

ja das habe ich auch schon überlegt, jetzt ist es ja fantastisch einfach. Aber wenn man eine Liste hat, steht meist vorn irgendeine laufende Nummer. Die zu editieren ist natürlich nicht gewollt.

Ebenso Zwischenüberschriften.

Idee: Schnittstelle einfach halten, z.B. optionale Parameter als Strings:

Code: Alles auswählen

Procedure LvEdit1(event, selflag = 0, font = -1, Columns_NoEdit = "", Lines_NoEdit = "") 
Man könnte es dann so übergeben:

Code: Alles auswählen

LvEdit1(event, 0, -1, "1,3", "2,10,18")
Was hälst Du davon?
PB 5.72
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Beitrag von hjbremer »

Im Prinzip hast du recht, wenn es eine normale Prozedur wäre.
Aber bedenke dies ist ein Eventhandler, soll heißen diese Prozedur wird bei JEDEM Event aufgerufen, auch wenn du nur die Maus bewegst.
Und darum finde ich sollte man nur Adressen bzw. Integerwerte übergeben, denn Strings sind eventuell langsam. Glaube, denke, fürchte ich.

Ich bin mehr für ein Feld, dessen Adresse man übergibt. Man kann natürlich auch ein Array direkt übergeben, wäre auch nur eine Adresse, aber dann kann man nicht mehr schreiben Pointer = 0 und den Parameter einfach weglassen. Denn Array xyz(1) = 0 im Prozedurkopf wird leider angemeckert. Kleiner Mangel von PB.

habe es eben etwa so gemacht

Code: Alles auswählen

; in der Include

Structure lveditdef
 col.i
 row.i
 pbnr.i
EndStructure 

Procedure LvCheckFeld(pointer, lvnr, lvcol, lvrow)            
 
  *p.lveditdef = pointer
  anz = *p\col : *p + SizeOf(lveditdef)
  
  For j = 1 To anz
    If *p\pbnr = lvnr
     If *p\col = lvcol 
      If *p\row = lvrow
         ProcedureReturn 0  ;edit verboten 
      EndIf
     EndIf
    EndIf
    *p + SizeOf(lveditdef)
  Next
  
ProcedureReturn 1
EndProcedure

;Prozedurkopf wäre dann Procedure LvEdit1(event, selflag = 0, pointer = 0, font = -1)

;und nach        If lvrow = -1: ProcedureReturn -1: EndIf  bei mir Zeile 170 in der Include
;dies einfügen
            
            If pointer
               ok = LvCheckFeld(pointer, lvnr, lvcol, lvrow)
               If Not ok: ProcedureReturn -1: EndIf
            EndIf

;im Hauptprogramm vor der Eventschleife

Dim felddef.lveditdef(0)

;und irgendwo im Hauptprogramm die variable Definition z.B.
            Case #but1: Debug "Button 1 gedrückt"

                        Dim felddef.lveditdef(2)  
                        felddef(0)\col = ArraySize(felddef())
                        felddef(1)\col = 1
                        felddef(1)\row = 3
                        felddef(1)\pbnr = #lvg1
                        felddef(2)\col = 1
                        felddef(2)\row = 5
                        felddef(2)\pbnr = #lvg1
wenn du auf den Button drückst, gilt die Definition und in col 1 row 3 +5 ist edit verboten

hoffe du kommst damit klar, sonst poste ich den kompletten code nochmal

glaube ich habe nix vergessen :D
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
Andesdaf
Moderator
Beiträge: 2671
Registriert: 15.06.2008 18:22
Wohnort: Dresden

Beitrag von Andesdaf »

danke :allright:
Win11 x64 | PB 6.20
Benutzeravatar
Hyper
Beiträge: 194
Registriert: 19.04.2005 19:14

Beitrag von Hyper »

Hallo hjbremer,

danke vorweg, allerdeings funktioniert es bei mir nicht. Vielleicht habe ich es auch nicht richtig eingebaut. Es sind immer noch alle Felder editierbar.
PB 5.72
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Beitrag von hjbremer »

Hyper nur für dich, ist irgendwie suboptimal, aber als Beispiel sicher brauchbar.

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 pointer
;         event = WaitWindowEvent() 
;         event = LvEdit1(event, 1, @felddef(0)) 
;         Feld muß vorher definiert werden, Dim felddef.lveditdef(0)
;
; zusätzlicher Parameter font
;         event = WaitWindowEvent() 
;         event = LvEdit1(event, 0, 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

Structure lveditdef
 col.i
 row.i
 pbnr.i
EndStructure 

;EnableExplicit

Procedure LvCheckFeld(pointer, lvnr, lvcol, lvrow)            
 
  *p.lveditdef = pointer
  anz = *p\col : *p + SizeOf(lveditdef)
  
  For j = 1 To anz
    If *p\pbnr = lvnr
     If *p\col = lvcol 
      If *p\row = lvrow
         ProcedureReturn 0  ;edit verboten 
      EndIf
     EndIf
    EndIf
    *p + SizeOf(lveditdef)
  Next
  
ProcedureReturn 1
EndProcedure

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, pointer = 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
            
            If pointer
               ok = LvCheckFeld(pointer, lvnr, lvcol, lvrow)
               If Not ok: ProcedureReturn -1: EndIf
            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\LvEdit1d.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 
  
  Dim felddef.lveditdef(0)  
      
;=====================================================

Repeat

  event = WaitWindowEvent(1) 
  event = LvEdit1(event, 2, @felddef(0))
  
  If Event = #PB_Event_Gadget Or Event = #PB_Event_Menu 
          
      welcherButton = EventGadget() 
  
      Select welcherButton
      
            Case #but1: Debug "Button 1 gedrückt"
                        Dim felddef.lveditdef(2)  
                        felddef(0)\col = ArraySize(felddef())
                        felddef(1)\col = 1
                        felddef(1)\row = 3
                        felddef(1)\pbnr = #lvg1
                        felddef(2)\col = 1
                        felddef(2)\row = 5
                        felddef(2)\pbnr = #lvg1
                     
            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 
und nun auf den Button "tue nix" drücken, dann ist Zeile 3 + 5 Spalte 1 im ersten LV gesperrt
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
Antworten