ListIconGadget mit CheckBox

Anfängerfragen zum Programmieren mit PureBasic.
ThoPie
Beiträge: 130
Registriert: 19.05.2006 15:18
Kontaktdaten:

ListIconGadget mit CheckBox

Beitrag von ThoPie »

Hallo,
ich verwende ein ListIconGadget mit CheckBoxes. Gibt es eine Möglichkeit ein Ereignis auszulösen, wenn irgendeine Veränderung an den CheckBoxes vorgenommen wurde?
Vielen Dank.
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: ListIconGadget mit CheckBox

Beitrag von Kiffi »

ThoPie hat geschrieben:Gibt es eine Möglichkeit ein Ereignis auszulösen, wenn irgendeine Veränderung an den CheckBoxes vorgenommen wurde?
das einfachste wäre es, wenn Du WaitWindowEvent() auf #PB_Event_Gadget
und EventGadget() auf Dein ListIconGadget testen würdest.

Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
Regenduft
Beiträge: 574
Registriert: 25.03.2008 15:07
Wohnort: THE LÄÄÄND!

Beitrag von Regenduft »

Wenn ich Dich rightig verstehe willst Du, dass ein Stück Code einmalig ausgeführt werden soll, in dem Moment, wenn ein Haken gesetzt oder entfernt wird?

Dann schlage ich Dir vor, einen "Flanken-Merker" zu verwenden!

Beim Haken setzen:

Code: Alles auswählen

GetGadgetItemState(#ListIconGadget, Position) And Not Flanke(Position)
  Flanke(Position) = 1
  
  *Dein Code*
  
EndIf
Beim Haken entfernen:

Code: Alles auswählen

If Not GetGadgetItemState(#ListIconGadget, Position) And Flanke(Position)
  Flanke(Position) = 0
 
  *Dein Code*
  
EndIf
Statt ein Array als Flankenmerker, kannst Du auch eine LinkedList verwenden.
PureBasic 5.73 LTE x86/x64 | Windows 7 (x64)
ThoPie
Beiträge: 130
Registriert: 19.05.2006 15:18
Kontaktdaten:

Beitrag von ThoPie »

Das mache ich schon. Allerdings werden auch alle anderen registriert (Klick ins Gadget etc.). Ich möchte aber seperat abfragen ob eine Checkbox angeklickt wurde.
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Beitrag von Fluid Byte »

Das eigentliche Problem ist das sich der Status des Gadgets nicht verändert wenn man auf eine Checkbox klickt. Also wenn man z. B. das erste Mal den Code ausführt und mit GetGadgetState() das momentan ausgewählte item ermitteln will kommt immer -1 zurück weil noch kein Item angeklickt wurde. Nur wenn man direkt auf den Text des Items klickt erfolgt eine Statusänderung. Das lässt sich aber mit API lösen falls das eine Option für dich ist.
Windows 10 Pro, 64-Bit / Outtakes | Derek
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Beitrag von hjbremer »

Hier ein Beispiel aus dem englischen Forum, welches als Beispiel dir eventuell hilft

OriginalCode mit eingefügtem SetGadgetState Befehl um Zeile zu markieren

Code: Alles auswählen

; English forum: http://www.purebasic.fr/english/viewtopic.php?t=14457&highlight=
; Author: Sparkie (updated for PB 4.00 by Andre)
; Date: 20. March 2005
; OS: Windows
; Demo: Yes


; ListIcon - realtime detection of the state of a checkbox when an item 
; becomes checked or unchecked.

#LVN_ITEMCHANGED = #LVN_FIRST-1 
#MyWindow = 0 
#MyGadget = 1 

Procedure myWindowCallback(hWnd, msg, wParam, lParam) 
  result = #PB_ProcessPureBasicEvents 
  Select msg 
    Case #WM_NOTIFY 
      *pnmhdr.NMHDR = lParam 
      Select *pnmhdr\code 
        Case #LVN_ITEMCHANGED 
          *lvChange.NMLISTVIEW = lParam 
          Debug *lvChange\uNewState >>12 &$FFFF 
          ;--> Read the State image mask value ( 1 = un-checked   2 = checked 
          Select *lvChange\uNewState >>12 &$FFFF 
            Case 1 
              SetGadgetState(#MyGadget,-1)              ;<------ z.B. Markierung aus !!!
              StatusBarText(0, 0, "Item " + Str(*lvChange\iItem) + " has been un-checked") 
            Case 2
              SetGadgetState(#MyGadget,*lvChange\iItem) ;<------ z.B. Markierung ein !!!
              StatusBarText(0, 0, "Item " + Str(*lvChange\iItem) + " has been checked") 
          EndSelect 
      EndSelect 
  EndSelect 
  ProcedureReturn result 
EndProcedure 

If OpenWindow(#MyWindow, 100, 100, 350, 140, "ListIcon Test", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) And CreateGadgetList(WindowID(#MyWindow)) 
  CreateStatusBar(0, WindowID(#MyWindow)) 
  ListIconGadget(#MyGadget, 5, 5, 340, 110, "Name", 100, #PB_ListIcon_CheckBoxes | #PB_ListIcon_FullRowSelect|#PB_ListIcon_AlwaysShowSelection) 
  AddGadgetColumn(#MyGadget, 1, "Address", 250) 
  AddGadgetItem(#MyGadget, -1, "Harry Rannit" + Chr(10) + "12 Parliament Way, Battle Street, By the Bay") 
  AddGadgetItem(#MyGadget, -1, "Ginger Brokeit" + Chr(10) + "130 PureBasic Road, BigTown, CodeCity") 
  SetWindowCallback(@myWindowCallback()) 
  Repeat 
    event = WaitWindowEvent() 
  Until event = #PB_Event_CloseWindow 
EndIf 
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
Häns
Beiträge: 47
Registriert: 27.10.2007 14:30
Wohnort: Kölle

Beitrag von Häns »

Darf es denn auch ohne API gehen?

Code: Alles auswählen

#MyWindow = 0
#MyGadget = 1


If OpenWindow(#MyWindow, 100, 100, 350, 140, "ListIcon Test", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) And CreateGadgetList(WindowID(#MyWindow))
  CreateStatusBar(0, WindowID(#MyWindow))
  ListIconGadget(#MyGadget, 5, 5, 340, 110, "Name", 100, #PB_ListIcon_CheckBoxes | #PB_ListIcon_FullRowSelect|#PB_ListIcon_AlwaysShowSelection)
  AddGadgetColumn(#MyGadget, 1, "Address", 250)
  AddGadgetItem(#MyGadget, -1, "Harry Rannit" + Chr(10) + "12 Parliament Way, Battle Street, By the Bay")
  AddGadgetItem(#MyGadget, -1, "Ginger Brokeit" + Chr(10) + "130 PureBasic Road, BigTown, CodeCity")

EndIf
  Repeat

   ev=WaitWindowEvent()

   Select ev
      Case #PB_Event_CloseWindow
         ende=1
      Case #PB_Event_Gadget
         ; was ist passiert ?
         If EventGadget() = #MyGadget And EventType() = #PB_EventType_LeftClick   ; <---Wichtig!
           For i=0 To CountGadgetItems(#MyGadget)-1
             If GetGadgetItemState(#MyGadget,i) & #PB_ListIcon_Checked 
               StatusBarText(0, 0, "Item " + Str(i) + " has been checked")
             EndIf
           Next
         EndIf
   EndSelect
Until ende 
Es wird hier per Schleife nacheinander die Zeilen in der Liste abgefragt, ob sie abgehakt wurde. Wenn es Dir nützt, kannst Du auch weitere Beispiel unter

http://www.purebasic.fr/german/viewtopi ... 0598#80598 bzw.
http://www.purebasic.fr/german/viewtopi ... =3367#3367

finden...:)



Gruß, Häns
PB 5.6
Windows 7 Professional
Antworten