treegadget & popupmenu

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
jpd
Beiträge: 380
Registriert: 14.02.2005 10:33

treegadget & popupmenu

Beitrag von jpd »

moin,
brauche eure hilfe da ich mit meine pb kenntnisse am limit bin ...
folgendes problem, ich möchte auf ein treegadget ein contextmenu verwenden
rechtemaustaste auf ein "item" und menu aufrufen ...
dies funktioniert auch...
aber beim ausführen des menuaufruf starte ich ein neues fenster...
über "createthread".
beim schliessen des fenster kann ich die variable fullpath ..
nicht mehr verwenden.
diese variable ermöglicht mir zu wissen welche name und ebene (root,child...)der aktuelle ausgewählten Eintrag (fullpath) hat.
ich entschuldige mich für die unubersichtlichkeit des code ....
und natürlich hoffe ich das jemand mir helfen wird.

Grüsse
JPD


Code: Alles auswählen


Enumeration
  #Frame3D_0
  #Text_0
  #Text_1
  #String_0
  #String_2
  #Button_00
  #Text_3
  #Combo_0
  #Button_01
EndEnumeration








#Window_0 = 1111
#Window = 0 
#Gadget_TV = 1
#MMTB = 200 
Global MMTextBox , Position.l,FullPath.s


Global Buffer.s,dom_name.s,dom_group.s,CurrentText.s, status.s,CurrentItem.l,  hItem.l  ,   hParent.l
Procedure Open_win(group_dom.s)

  If OpenWindow(#Window_0, 501, 27, 238, 211,  #PB_Window_SystemMenu | #PB_Window_TitleBar | #PB_Window_BorderLess , "accout")
    If CreateGadgetList(WindowID())
      Frame3DGadget(#Frame3D_0, 10, 10, 220, 140, "user credentials")
      TextGadget(#Text_0, 20, 40, 60, 30, "Username:")
      TextGadget(#Text_1, 20, 80, 60, 20, "Password:")
      StringGadget(#String_0, 110, 40, 110, 20, "")
      StringGadget(#String_2, 110, 80, 110, 20, "", #PB_String_Password)
      ButtonGadget(#Button_00, 10, 170, 100, 30, "Connect")
      TextGadget(#Text_3, 30, 120, 60, 20, "Domain")
      ComboBoxGadget(#Combo_0, 110, 120, 110, 80)
      ButtonGadget(#Button_01, 130, 170, 100, 30, "Cancel")
      
    EndIf
  EndIf
  
  
          Debug "Computername: " + CurrentText
          AddGadgetItem(#Combo_0, -1,  CurrentText)
          AddGadgetItem(#Combo_0, -1,  group_dom)
          SetGadgetState(#Combo_0,0) 


  Repeat 
    Select WaitWindowEvent() 
      Case #PB_EventCloseWindow 
        Debug "currentitem: " + Str(currentitem) 
      
        SetFocus_(WindowID(#Window))
        

        
        QuitThread = 1 
    EndSelect 
  Until QuitThread = 1 
 
EndProcedure








If CreatePopupMenu(1) 
  MenuItem(1,"Login") 
  
EndIf 




hWnd.l=OpenWindow(#Window, 111,111, 400, 300, #PB_Window_TitleBar , "nett desk") 
CreateGadgetList(hWnd) 
Frame3DGadget(#Window,5,0,390,295,"")
tv=TreeGadget(#Gadget_TV, 10, 10, 380, 280,#ES_AUTOVSCROLL|#WS_VSCROLL|#PB_String_ReadOnly   ) 
SendMessage_(GadgetID(#Gadget_TV),$111D,0,12189133)

  For t=1 To 5
      AddGadgetItem(#Gadget_TV,-1,"item"+Str(t)) 
      OpenTreeGadgetNode(#Gadget_TV,t) 
      AddGadgetItem(#Gadget_TV,-1,"child"+Str(t)) 
      CloseTreeGadgetNode(#Gadget_TV,t)
  Next 
  
Repeat 
  EventID.l=WaitWindowEvent() 
  Select EventID 
  Case #PB_Event_Gadget 
    Select EventGadgetID() 
    Case 1 
      MB.l=EventType() ;<--- for checking if was pushed RMB or LMB, ... 
      GetCursorPos_(@var.TV_HITTESTINFO\pt) ;get mousepointer position screen coordenates 
      ScreenToClient_(GadgetID(#Gadget_TV),@var.TV_HITTESTINFO\pt) ;convert that coordenates to the Gadget 1 (TreeView Gadget) referenced by 
      SendMessage_(GadgetID(#Gadget_TV),#TVM_HITTEST,0,var) ;this is to know what is the item i am pointing. 
      SendMessage_(GadgetID(#Gadget_TV),#TVM_SELECTITEM,#TVGN_CARET,var\hItem);<-- and this selects the pointed item 
      itemsel=GetGadgetState(#Gadget_TV) ;save selected item 
      
      Select MB 
       Case #PB_EventType_RightClick 
          Gosub testtree
          Debug "fullpath: "+  FullPath
          Position = FindString(FullPath, "/", 1) 
          Debug "position: " +Str(position) 
          If  position => 1 ;wird diese if struktur verwendet dann wird ein popupmenu nur bei childs
          ;angezeigt!
            DisplayPopupMenu(1,hWnd) 
          EndIf 
       
       
      EndSelect 
    EndSelect 
    Case #PB_Event_Menu 
      Select EventMenuID() 
        Case 1: CreateThread(@Open_win(),0)
      EndSelect 
  EndSelect 
Until EventID=#PB_Event_CloseWindow 

testtree:
Debug "testtree"
If GetGadgetState(#gadget_tv) <> -1
  CurrentItem = GetGadgetState(#gadget_tv)
  CurrentText = GetGadgetItemText(#gadget_tv, CurrentItem, 0)
  ItemToWalk.l = CurrentItem
  FullPath  = CurrentText
  
  Repeat
    hItem.l        = GadgetItemID(#gadget_tv, ItemToWalk)
    hParent.l      = SendMessage_(GadgetID(#gadget_tv), #TVM_GETNEXTITEM, #TVGN_PARENT, hItem)
    ParentNumber.l = TreeGadgetItemNumber(#gadget_tv, hParent)
    ParentText2.s   = GetGadgetItemText(#gadget_tv, ParentNumber, 0)
    FullPath    = ParentText2 + "/" + FullPath
    ItemToWalk     = ParentNumber
  Until ItemToWalk = -1
  
  If Left(FullPath, 1) = "/"
    FullPath = Mid(FullPath, 2, Len(FullPath) - 1)
  EndIf
 
EndIf
Return

Benutzeravatar
Justy
Beiträge: 131
Registriert: 10.09.2004 13:31
Wohnort: Feldbach / Steiermark / Österreich
Kontaktdaten:

Beitrag von Justy »

Hallo jpd!

Ich kann dir jetzt nicht genau sagen wo dein Problem liegt, aber ich hab einige Ideen:

1. Sobald ein zweites Fenster offen ist, funktioniert (bie mir) der Rechtsklick auf das TreeGadget nicht mehr richtig. Das könnte an der zweiten Event-Abfrage im Thread liegen, so dass die Events nicht mehr ganz richtig verarbeitet werden. Dadurch wird fullpath nicht mehr (richtig) gefüllt.

2. Angeblich mögen sich Threads und Strings nicht so gern (hatte aber noch keine Probleme), könnte also irgendwie daran liegen. Bei mehrern Fenster arbeite ich sowieso ohne Threads, sondern lasse alle Events mit der Hauptschleife abarbeiten. Dadurch entfällt die zweite Schleife und das ganze ist weniger fehleranfällig. Mit EventWindowID() kann man abfragen, in welchem Fenster ein Event stattgefunden hat.

Da ich im Moment auch an so etwas ähnlichem arbeite noch ein kleiner Tip: Ich habe eine LinkedList mit Structure angelegt, in der der Status des Treegadgets so gespeichert ist, dass ich es jederzeit aus der Liste neu aufbauen kann. Durch die Structure lassen sich dann "im" TreeGadget über die Liste noch weitere Daten speichern, wie z.b. bei einem Explorer-ähnlichen Programm die Dategröße oder das Datum.


Ich hoffe ich konnte dir helfen!
mfg. Justy

(Was tut das eigentlich im Anfänger-Forum, ich würde das durchaus als PB-Allgemein bezeichnen)
Am Anfang erschuf der Mensch Gott.
Friedrich Nietzsche
Benutzeravatar
jpd
Beiträge: 380
Registriert: 14.02.2005 10:33

Beitrag von jpd »

Hi Yusty,

danke für deine tipps!

ich werde diese entsprechend ändern so das ich alle ereignisse unter eine

schleife abarbeite... malschauen.


du erwähnst
Da ich im Moment auch an so etwas ähnlichem arbeite noch ein kleiner Tip: Ich habe eine LinkedList mit Structure angelegt, in der der Status des Treegadgets so gespeichert ist, dass ich es jederzeit aus der Liste neu aufbauen kann. Durch die Structure lassen sich dann "im" TreeGadget über die Liste noch weitere Daten speichern, wie z.b. bei einem Explorer-ähnlichen Programm die Dategröße oder das Datum.
wie macht man so was ... nie verwendet vieleicht kannst du ein kleiner beispiel posten... was ich nicht vohrer gesehen habe ...kann ich auch nicht nachmachen :)


Grüsse
JPD
Benutzeravatar
Justy
Beiträge: 131
Registriert: 10.09.2004 13:31
Wohnort: Feldbach / Steiermark / Österreich
Kontaktdaten:

Beitrag von Justy »

Also, sorry für die lange Antwortzeit, war nicht daheim!

Hier ein Beispielcode für LinkedLists in diesem Zusammenhang, ich hoffe du kannst was damit anfangen!

Code: Alles auswählen

Structure daten ;Die Structure kann mehrere "Untervariablen" beinhalten
  name.s
  groesse.l
  datum.s
EndStructure
NewList daten.daten() ;Eine neue LinkedList mit der Structure erstellen

AddElement(daten()) ;Ein neues Element
daten()\name="test1.txt"
daten()\groesse=1235654
daten()\datum="1.7.1984"
AddElement(daten())
daten()\name="test5.doc"
daten()\groesse=652384
daten()\datum="2.8.1985"

OpenWindow(0,0,0,300,500,#PB_Window_ScreenCentered|#PB_Window_SystemMenu,"Testfenster")
CreateGadgetList(WindowID())
TreeGadget(0,0,0,300,500)

ResetList(daten()) ;Liste auf Element -1 setzen
For i = 0 To CountList(daten())-1
  NextElement(daten())
  AddGadgetItem(0,-1,daten()\name) ;Die Daten aus der Liste ins Gadget bringen
Next
; Wenn man die Daten im Gadget aktualisieren möchte, muss man nur die obere Schleife ausführen.
; Daten können bequem in der Liste geändert und EINGEFÜGT werden, ohne sich mit den Eintragnummern des Gadgets
; herumschlagen zu müssen. Wenn man direkt im Gadget einen Eintrag in der Mitte hinzufügt, ändern sich alle nachfolgenden Nummern.
; Somit kann man nicht mehr genau sagen, um was es sich bei einem Eintrag handelt

Repeat
  event=WaitWindowEvent()
  Select event
    Case #PB_Event_CloseWindow
      End
    Case #PB_Event_Gadget
      If EventGadgetID()=0 And EventType()=#PB_EventType_RightClick
        GetCursorPos_(@var.TV_HITTESTINFO\pt)
        ScreenToClient_(GadgetID(0),@var.TV_HITTESTINFO\pt)
        SendMessage_(GadgetID(0),#TVM_HITTEST,0,var)
        SendMessage_(GadgetID(0),#TVM_SELECTITEM,#TVGN_CARET,var\hItem)
        
        SetGadgetState(0,GetGadgetState(0))
        SelectElement(daten(),GetGadgetState(0))
        Debug "Name: "+daten()\name ;Ausgabe der gespeicherten Daten
        Debug "Größe: "+Str(daten()\groesse)
        Debug "Datum:"+daten()\datum
        Debug "-------"
      EndIf
  EndSelect
ForEver
Am Anfang erschuf der Mensch Gott.
Friedrich Nietzsche
Benutzeravatar
jpd
Beiträge: 380
Registriert: 14.02.2005 10:33

Beitrag von jpd »

Hi Justy,


hatte mir das eigentlich nicht so schwierig vorgestellt :shock:

grafische darstellung für ein kaoten liebhaber..... wofür brauche ich soviel ordnung ??? :-)

habe mir heute mit der treell von NicTheQuick rumgeschlagen ...
nicht übel.....

http://forums.purebasic.com/german/view ... linkedlist


diesmal werde ich richtig alt bis ich erreiche was ich möchte....

aber ich hab zeit .. und heute abend auch frisches bier !!!


danke justy

ich probiere mal ne runde weiter !

Ciao
JPD
Benutzeravatar
jpd
Beiträge: 380
Registriert: 14.02.2005 10:33

Beitrag von jpd »

Hi,

anbei eine funktionierende variante die das problem behebt!

Danke justy für deine Hilfe,
leider verwende ich keine linkedlist ,dies muss bei mir noch geübt werden.

Ciao.

Code: Alles auswählen


Declare Open_win()
Declare.s ParentItemText(gadgethandle) 

Enumeration
#main_window
#Gadget_TV
#Button_00
#Button_11
#Button_12
#Button_13
#Text_3
#Combo_0
#Button_01

#login_window
#Frame3D_0
#Text_0
#Text_1
#String_0
#String_2
EndEnumeration

If CreatePopupMenu(1) 
        MenuItem(1,"Login") 
EndIf 


If OpenWindow(#main_window, 111,111, 400, 300, #PB_Window_TitleBar , "main") 

     If CreateGadgetList(WindowID()) 
        Frame3DGadget(#main_window,5,0,390,295,"")
        tv=TreeGadget(#Gadget_TV, 10, 10, 380, 280,#ES_AUTOVSCROLL|#WS_VSCROLL|#PB_String_ReadOnly   ) 
        SendMessage_(GadgetID(#Gadget_TV),$111D,0,12189133)
     EndIf
     
     For t=1 To 5
      AddGadgetItem(#Gadget_TV,-1,"item"+Str(t)) 
      OpenTreeGadgetNode(#Gadget_TV,t) 
      AddGadgetItem(#Gadget_TV,-1,"child"+Str(t)) 
      CloseTreeGadgetNode(#Gadget_TV,t)
    Next 
  


  Repeat

    Select WaitWindowEvent()
    
    
        Case #PB_Event_Gadget 
    
        Select EventGadgetID() 
          Case 1 
          MB.l=EventType() ;<--- for checking if was pushed RMB or LMB, ... 
          GetCursorPos_(@var.TV_HITTESTINFO\pt) ;get mousepointer position screen coordenates 
          ScreenToClient_(GadgetID(#Gadget_TV),@var.TV_HITTESTINFO\pt) ;convert that coordenates to the Gadget 1 (TreeView Gadget) referenced by 
          SendMessage_(GadgetID(#Gadget_TV),#TVM_HITTEST,0,var) ;this is to know what is the item i am pointing. 
          SendMessage_(GadgetID(#Gadget_TV),#TVM_SELECTITEM,#TVGN_CARET,var\hItem);<-- and this selects the pointed item 
          itemsel=GetGadgetState(#Gadget_TV) ;save selected item 
          
          Select MB 
            Case #PB_EventType_RightClick 
            gad=GadgetID(EventGadgetID()) 
            is_parent.s=ParentItemText(gad)
            Debug "parent: "+ is_parent
            If is_parent
              DisplayPopupMenu(1,WindowID())
            EndIf  
          EndSelect 
        EndSelect
        
        Case #PB_Event_Menu
        
          Select EventMenuID()  ; To see which menu has been selected
              
            Case 1 
              Debug "active thread"
              CreateThread(@Open_win(),0)
           
          EndSelect
        
      Case #PB_Event_CloseWindow
        Quit = 1

    EndSelect

  Until Quit = 1

EndIf

End  

Procedure Open_win()

  If OpenWindow(#login_Window, 501, 27, 238, 211,  #PB_Window_SystemMenu | #PB_Window_TitleBar | #PB_Window_BorderLess , "accout")
    
   

    If CreateGadgetList(WindowID())
      Frame3DGadget(#Frame3D_0, 10, 10, 220, 140, "user credentials")
      TextGadget(#Text_0, 20, 40, 60, 30, "Username:")
      TextGadget(#Text_1, 20, 80, 60, 20, "Password:")
      StringGadget(#String_0, 110, 40, 110, 20, "")
      StringGadget(#String_2, 110, 80, 110, 20, "", #PB_String_Password)
      ButtonGadget(#Button_00, 10, 170, 100, 30, "Connect")
      TextGadget(#Text_3, 30, 120, 60, 20, "Domain")
      ComboBoxGadget(#Combo_0, 110, 120, 110, 80)
      ButtonGadget(#Button_01, 130, 170, 100, 30, "Cancel")
      
    EndIf
  EndIf
  


  Repeat 
    Select WaitWindowEvent() 
      Case #PB_EventCloseWindow 
       QuitThread = 1 
       ;Debug "???"
       UseWindow(#main_window) 
    EndSelect 
  Until QuitThread = 1 
 
EndProcedure



Procedure.s ParentItemText(gadgethandle) 

;http://forums.purebasic.com/english/viewtopic.php?t=13555&highlight=parentitemtext

  current=SendMessage_(gadgethandle,#TVM_GETNEXTITEM,#TVGN_CARET,0) 
  parent=SendMessage_(gadgethandle,#TVM_GETNEXTITEM,#TVGN_PARENT,current) 
  
  If parent 
    parenttext$=Space(260) 
    Text.TV_ITEM 
    Text\mask=#TVIF_TEXT 
    Text\hItem=parent 
    Text\pszText=@parenttext$ 
    Text\cchTextMax=260 
    SendMessage_(gadgethandle,#TVM_GETITEM,0,@Text) 
    ProcedureReturn parenttext$ 
  Else 
    ProcedureReturn "" 
  EndIf 
  
EndProcedure 

Antworten