Die Korrektur von ts-soft ermöglicht folgende Lösung, bei der man die Zelle des Listicongadgets angeben kann, egal ob das Gadget aktiv ist oder nicht. Der Mausklick muss lediglich im aktiven Bereich des Listicongadgets erfolgen, also da, wo eine Spalte oder Zeile definiert wurde. Den verbleibenden Problemfall, dass ein Klick auf eine Spalte rechts vom sichtbaren Bereich erfolgt, kann man wunschweise korrigieren.
Code: Alles auswählen
Procedure Start()
Protected Colnr.i,RowNr.i
OpenWindow(0,20,20,300,500,"Testwindow")
ListIconGadget(1,0,1,200,WindowHeight(0)-50,"Sp0",50,#PB_ListIcon_GridLines)
For nr=1 To 5
AddGadgetColumn(1,nr,"sp"+Str(nr),50)
Next
For nr= 1 To 10
AddGadgetItem(1,nr,"xyz")
Next
For RowNr=0 To 10
For ColNr=1 To 5
SetGadgetItemText(1,RowNr,"("+Str(RowNr)+","+Str(ColNr)+")",ColNr)
Next
Next
EndProcedure
Procedure eval_LeftClick(LIcNr.i,*p.Point)
;von hjBremer
;Ermittlung der Zellenpos. in p\x bzw. p\y (Zählung ab Zeile,Spalte =0)
Protected lvhit.LVHITTESTINFO,LIcID.i,ret.i
GetCursorPos_(*p) ;Mauskoordinaten ermitteln
LIcID=GadgetID(LIcNr)
MapWindowPoints_(0, LIcID, *p, 1) ;0:Schirmkoord. umrechnen in Koord. von LIcGad
lvhit\pt\x = *p\x
lvhit\pt\y = *p\y
SendMessage_(LIcID, #LVM_SUBITEMHITTEST, 0, lvhit)
*p\y = lvhit\iItem ;row ab 0
*p\x = lvhit\iSubItem ;col ab 0
If *p\x>=0 And *p\y>=0 ;Click innerhalb des aktiven LICGadgets
ret=#True
Else ;außerhalb
ret=#False
EndIf
ProcedureReturn ret
EndProcedure
Define Ev.i,EvType.i,EvWin.i,Zelle.Point,EvGad.i
start()
;SetActiveGadget(1)
DisableGadget(1,0) ; Hier zum Testen aktivieren/deaktivieren
Repeat
Ev=WaitWindowEvent()
EvType=EventType()
EvWin=EventWindow()
EvGad=EventGadget()
If EvWin=0
If EvType = #PB_EventType_LeftClick
If eval_LeftClick(1,@Zelle) ; Mausklick auf aktiven Bereich des Listicongadgets
Debug "("+Str(Zelle\y)+","+Str(Zelle\x)+")"
Else
Debug "außerhalb des beschriebenen Bereichs des Listicongadgets"
EndIf
EndIf
EndIf
Until Ev=#PB_Event_CloseWindow