Seite 2 von 2

Verfasst: 28.01.2008 02:26
von tobe
das mit den klicks verlieren passiert bei mir nur wenn ich einen Doppelklick auf ein item mache, daher kann man das einfach ignorieren :)
oder mit

Code: Alles auswählen

Case #PB_EventType_LeftClick, #PB_EventType_LeftDoubleClick
wird nichts mehr vergessen.

Verfasst: 28.01.2008 15:12
von scholly
tobe hat geschrieben:das mit den klicks verlieren passiert bei mir nur wenn ich einen Doppelklick auf ein item mache, daher kann man das einfach ignorieren :)
Yep, und wenn man eine Nacht drüber geschlafen hat, bekommt man manchmal (wieder) den richtigen Blickwinkel auf das Problem.

Ziel der ganzen Aktion ist, daß in meiner Video-Verwaltung bei bestimmten Aktionen eine neue Filterung ins ListIconGadget geladen wird. Das soll nur geschehen, wenn bewußt das Item (bzw das Lable, der Text zum Item) selektiert wird und nicht, wenn aus irgendwelchen Gründen der User den Teil einfaltete, in dem das gerade angezeigte Item liegt.
Aus dieser Anforderung heraus ist es IMHO sinnvoller, nicht auf TVHT_ONITEMBUTTON sondern auf TVHT_ONITEMLABEL, einem anderen Wert der TV_HITTESTINFO Struktur zu checken.

Man wird zwar etwas rammdösig bei den ganzen Klick-Tests, aber AFAICS löst dieser Code das Problem so, wie ich es eigentlich erwartetete:

Code: Alles auswählen

#main_win   = 1
#main_tree  = 3

Procedure.L ugs_isTGitemtextclicked()
  Protected ItemHandle.L
  Protected TVHitTest.TV_HITTESTINFO
  Protected TVItem.TV_ITEM

  TVHitTest\Pt\x = WindowMouseX(#main_win) - GadgetX(#main_tree)
  TVHitTest\Pt\y = WindowMouseY(#main_win) - GadgetY(#main_tree)

  ItemHandle = SendMessage_(GadgetID(#main_tree), #TVM_HITTEST, 0, @TVHitTest)

  If ItemHandle <> 0
    If TVHitTest\Flags = #TVHT_ONITEMLABEL
      ProcedureReturn #True
    EndIf
  EndIf

  ProcedureReturn #False
EndProcedure


If OpenWindow(#main_win, 50, 50, 355, 250, "TreeGadget", #PB_Window_SystemMenu ) And CreateGadgetList(WindowID(#main_win))
  TreeGadget(#main_tree, 5, 5, 160, 230, #PB_Tree_AlwaysShowSelection )                                         
  AddGadgetItem(#main_tree, -1, "Normal Item 1", 0, 0)
  AddGadgetItem(#main_tree, -1, "Node 1", 0, 0)       
  AddGadgetItem(#main_tree, -1, "Sub-Item 1-1", 0, 1)           
  AddGadgetItem(#main_tree, -1, "Sub-Item 1-2", 0, 1)
  AddGadgetItem(#main_tree, -1, "Sub-Item 1-3", 0, 1)
  AddGadgetItem(#main_tree, -1, "Sub-Item 1-4", 0, 1)
  AddGadgetItem(#main_tree, -1, "Normal Item 2", 0, 0)       
  AddGadgetItem(#main_tree, -1, "Node 2", 0, 0)       
  AddGadgetItem(#main_tree, -1, "Sub-Item 2-1", 0, 1)           
  AddGadgetItem(#main_tree, -1, "Sub-Item 2-2", 0, 1)
  AddGadgetItem(#main_tree, -1, "Sub-Node 3", 0, 1)
  AddGadgetItem(#main_tree, -1, "Sub-Sub-item 3-1", 0, 2)
  AddGadgetItem(#main_tree, -1, "Sub-Sub-Item 3-2", 0, 2)
  AddGadgetItem(#main_tree, -1, "Sub-Sub-Item 3-3", 0, 2)
  AddGadgetItem(#main_tree, -1, "Sub-Sub-Item 3-4", 0, 2)
  StringGadget(#String,170,100,100,20,"")

  SetActiveGadget(#main_tree)
  SetGadgetState(#main_tree, 0)
  SetGadgetText(#String, GetGadgetItemText(#main_tree, GetGadgetState(#main_tree)))

  Repeat
    Select WaitWindowEvent()
      Case #PB_Event_CloseWindow
        Break
      Case #PB_Event_Gadget     
        Select EventGadget()
          Case #main_tree         
            Select EventType()
              Case #PB_EventType_LeftClick         
                If ugs_isTGitemtextclicked() = #True
                  Debug "item-text getroffen"
                  SetGadgetText(#String, GetGadgetItemText(#main_tree, GetGadgetState(#main_tree)))
                Else
                  Debug "nicht den item-text getroffen"
                EndIf
            EndSelect
        EndSelect
    EndSelect; WaitWindowEvent()
  ForEver
EndIf
:allright: an Shardik und tobe für deren Codes, aus denen zumindest ich etwas lernen konnte.