Seite 1 von 1

ListIconGadget

Verfasst: 19.05.2012 17:19
von ProgOldie
Gibt's einen Weg, mit dem man bei einem ListiconGadget nach einem Event wie #PB_EventType_LeftDoubleClick ermitteln kann, auf welche Spalte der Doppelklick erfolgte? Ich möchte nämlich die angeklickte Zelle ermitteln, wobei man die Zeile ja mit GetGadgetState erhält. Es würde auch reichen, wenn man zur angeklickten Zelle die Bezeichnung des Spaltenkopfes zurückgereicht bekommt.

Gruß und Dank!

Re: ListIconGadget

Verfasst: 20.05.2012 03:28
von Bisonte
RSBasic's Winapi Library : http://www.rsbasic.de/aktualisierung/wi ... swerten.pb

Ist es das was du suchst ?

Re: ListIconGadget

Verfasst: 20.05.2012 08:53
von Pelagio
Hallo ProgOldie,

ich habe einmal in meine alten Codeschnitzel nachgeschaut und dies gefunden:

Code: Alles auswählen

Enumeration
   #Win
   #LVG
EndEnumeration

Procedure LvMausclick(vID.i, *vP.Point)
   Protected pLVH.LVHITTESTINFO
  
   GetCursorPos_   (*vP)  ;wo ist Maus 
   MapWindowPoints_(0, vID, *vP, 1)
   pLVH\pt\x = *vP\x
   pLVH\pt\y = *vP\y
   SendMessage_(vID, #LVM_SUBITEMHITTEST, 0, pLVH)                
   *vP\y = pLVH\iItem      ;row ab 0
   *vP\x = pLVH\iSubItem   ;col ab 0
EndProcedure

OpenWindow(#Win, 0, 0, 300,420,"ListIcon Gadget",#PB_Window_SystemMenu|#PB_Window_ScreenCentered) 
       
  ListIconGadget(#LVG, 10, 10, 280, 400, "Spalte 0", 140, #PB_ListIcon_GridLines);|#PB_ListIcon_FullRowSelect)
  AddGadgetColumn(#LVG, 1,"Spalte 1",55) 
  AddGadgetColumn(#LVG,2,"Spalte 2",55) 
  For n=0 To 16 
    txt$ = "Text in Zeile " + LSet(Str(n), 3, " ")  + " in Spalte 0" + #LF$ + Str(Random(99)) + #LF$ + Str(n)
    AddGadgetItem(#LVG, -1, txt$) 
  Next n

;=====================================================

Repeat
   Event = WaitWindowEvent(1) 
   If (Event=#PB_Event_Gadget) And (EventGadget()=#LVG)
      If (EventType()=#PB_EventType_LeftClick)
         LvMausclick(GadgetID(#LVG), p.Point) 
         Debug GetGadgetItemText(#LVG, p\y, p\x)
      EndIf
   EndIf
Until (Event=#PB_Event_CloseWindow)

End 


am Ende ist dies nichts anderes als was bei RSBasic's Winapi Library steht wie Bisonte schon gelinkt hat.
Ich glaube/hoffe aber das es etwas verständlicher ist. :allright:

Re: ListIconGadget

Verfasst: 20.05.2012 14:33
von Stephan-X
Eventuell Hilft das ..

Code: Alles auswählen

Case #List_0
               If EventType() = #PB_EventType_Focus
               ElseIf EventType() = #PB_EventType_RightDoubleClick
                    ; Reihe ermitteln die ausgewählt wird
                    Reihe.l = GetGadgetState(#List_0)  ;Welcher Satz wurde angeklickt 
                    If Reihe.l <> -1 
                         ZeileP = Val(GetGadgetItemText(#List_0,Reihe.l,10)) ;hier wird die 11. Spalte gelesen
                         
                    .... weiterer code
                    Endif
               Endif
                            

Re: ListIconGadget

Verfasst: 20.05.2012 14:43
von ts-soft
@Stephan-X
Den verstehe ich nicht, zu mal ein ListIcon gar kein #PB_EventType_Focus unterstützt.
Wo die Werte ermittelt werden kann ich auch nicht erkennen.
Vielleicht machste da mal eine ausführbare Version daraus, mit diesem Ausschnitt wird wohl niemand
klar kommen.

Ich bin jedenfalls der Meinung, Dein Vorschlag kann nicht funktionieren.

Gruß
Thomas

Re: ListIconGadget

Verfasst: 20.05.2012 18:45
von ProgOldie
Dank an Bisonte!
Übrigens ist http://www.rsbasic.de/winapi-library/ eine super-WinAPI-Sammlung, auf die Anfänger 'mal generell unter 'Links' und 'Private Webseiten' hingewiesen werden könnten.

Re: ListIconGadget

Verfasst: 28.09.2012 15:59
von bobobo
geht das auch andersrum ?

ich habe ein Listicongadget und benötige
dort die Koordinaten der einzelnen Felder

Re: ListIconGadget

Verfasst: 28.09.2012 21:53
von hjbremer
bobobo hat geschrieben:geht das auch andersrum ?

ich habe ein Listicongadget und benötige
dort die Koordinaten der einzelnen Felder
siehe MSDN - LVM_GETSUBITEMRECT

Re: ListIconGadget

Verfasst: 29.09.2012 03:39
von BSP
Eine Möglichkeit:
Den Teil ab "Ergänzung" einfach in die Procedure einfügen.

Code: Alles auswählen

Procedure LvMausclick(vID.i, *vP.Point)
   Protected pLVH.LVHITTESTINFO
   
   GetCursorPos_   (*vP)  ;wo ist Maus 
   MapWindowPoints_(0, vID, *vP, 1)
   pLVH\pt\x = *vP\x
   pLVH\pt\y = *vP\y
   SendMessage_(vID, #LVM_SUBITEMHITTEST, 0, pLVH)                
   *vP\y = pLVH\iItem      ;row ab 0
   *vP\x = pLVH\iSubItem   ;col ab 0
   
; --- Ergänzung
    Protected rec.RECT , i
    SendMessage_(vid, #LVM_GETSUBITEMRECT, *vp\y, rec)
    rec\left=0
    rec\right=rec\left+GetGadgetItemAttribute(#LVG,-1,#PB_ListIcon_ColumnWidth,0)
    If *vP\x >0
      For i=1 To *vP\x
        rec\left+GetGadgetItemAttribute(#LVG,-1,#PB_ListIcon_ColumnWidth, i-1)
        rec\right=rec\left+GetGadgetItemAttribute(#LVG,-1,#PB_ListIcon_ColumnWidth,i)
      Next
    EndIf
    Debug "-----"
    Debug rec\left
    Debug rec\right
    Debug rec\top
    Debug rec\bottom
    Debug "  "
EndProcedure
Geht bestimmt noch besser, funktioniert aber.

Gruß: Bernd