TreeGadget

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Leonhard
Beiträge: 602
Registriert: 01.03.2006 21:25

TreeGadget

Beitrag von Leonhard »

Ich arbeite gerade am TreeGadget und möchte, das der User dort sich Ordner und Dateien erstellen kann. Die daten darin werden im Programm erst später ausgelesen. Leider hab im vom TreeGadget zu wenig Ahnung.

Ich hab hier mal nen Beispiel-Code. Dieser ist dient nur als Beispiel:

Code: Alles auswählen

OpenWindow(1, 0, 0, 250, 250, "") 
CreateGadgetList(WindowID(1)) 

CreatePopupMenu(1) 
  MenuItem(1, "Ordner erstellen") 
  MenuItem(2, "Datei erstellen") 

TreeGadget(1, 0, 0, 250, 250) 

Repeat 
  WindowEvent = WaitWindowEvent() 
  If WindowEvent = #WM_CLOSE : Break : EndIf 
  
  If WindowEvent = #PB_Event_Gadget And EventGadget() = 1 
    If EventType() = #PB_EventType_RightClick 
      DisplayPopupMenu(1, WindowID(1)) 
    EndIf 
  EndIf 
  
  If WindowEvent = #PB_Event_Menu 
    Select EventMenu() 
      Case 1 
        AktivItem=GetGadgetState(1)
        If AktivItem = -1 
          AddGadgetItem(1, -1, "Book "+Str(Random($FF))) 
          SetGadgetItemData(1, CountGadgetItems(1)-1, 1) 
        Else 
          If GetGadgetItemData(1, AktivItem) = 1 
            AddGadgetItem(1, AktivItem+1, "Book "+Str(Random($FF)), 0, GetGadgetItemAttribute(1,AktivItem,#PB_Tree_SubLevel)+1) 
          Else 
            AddGadgetItem(1, AktivItem+1, "Book "+Str(Random($FF))) 
          EndIf 
          SetGadgetItemData(1, AktivItem+1, 1) 
        EndIf 
      Case 2 
        AktivItem=GetGadgetState(1)
        If AktivItem = -1 
          AddGadgetItem(1, -1, "Page "+Str(Random($FF))) 
        Else 
          If GetGadgetItemData(1, AktivItem) = 1 
            AddGadgetItem(1, AktivItem+1, "Page "+Str(Random($FF)), 0, GetGadgetItemAttribute(1,AktivItem,#PB_Tree_SubLevel)+1) 
          Else 
            AddGadgetItem(1, AktivItem+1, "Page "+Str(Random($FF))) 
          EndIf 
        EndIf 
    EndSelect 
  EndIf 
ForEver 

End
Mein Problem ist jetzt:
1. Das angecklickte Item herauszufinden (sehr miserabel)
2. Die Items untereinander verschieben zu lassen (Item in Ordner, Item eine Position höher, ...)
Erledigt 3. mehr als ein Note-Level hinzubekommen bzw. Das Note-Level aus einem Item auszulesen.
Zuletzt geändert von Leonhard am 12.11.2006 09:53, insgesamt 1-mal geändert.
Marvin
Beiträge: 497
Registriert: 17.07.2005 14:42
Wohnort: Krikkit

Beitrag von Marvin »

1. Müsste doch eigentlich mit GetGadgetState() gehen, oder?

3. Sublevel auslesen:

Code: Alles auswählen

GetGadgetItemAttribute(Gadget,item,#PB_Tree_SubLevel)
Benutzeravatar
Leonhard
Beiträge: 602
Registriert: 01.03.2006 21:25

Beitrag von Leonhard »

Danke für die Hilfe, aber ich möchte das angecklickte Item wissen, das ich mit der rechten maustaste angecklickt habe. Wenn ich erst ein Item ancklicke und danach kein Item wird das zuvor angecklickte Item Verwendet.

Dein Zweiter Beitrag konnte ich gebrauchen.
Benutzeravatar
Leonhard
Beiträge: 602
Registriert: 01.03.2006 21:25

Beitrag von Leonhard »

// EDIT: siehe oben
Zuletzt geändert von Leonhard am 31.07.2018 12:17, insgesamt 1-mal geändert.
Tw4!n
Beiträge: 8
Registriert: 07.03.2006 21:19

Beitrag von Tw4!n »

Sieh mal in der Hilfe unter EventType()
tmjuk
Beiträge: 380
Registriert: 30.06.2006 00:10
Wohnort: Backaryd, Schweden

Beitrag von tmjuk »

@ Leonhard

hallo, gib doch mal als Suchbegriff "treegadget" ein. Ich denke, da wird dir schon eine Menge geliefert.

Mfg
Torsten
Benutzeravatar
Shardik
Beiträge: 746
Registriert: 25.01.2005 12:19

Beitrag von Shardik »

Eine Board-Suche im englischen Forum oder ein Blick in purearea.net hätte folgendes gefunden:

Tree-Eintrag mit der rechten Maustaste markieren:
http://www.purebasic.fr/english/viewtopic.php?t=17959
http://www.purebasic.fr/english/viewtopic.php?t=7316

Rechte Maustaste erkennen und PopUp-Menu einblenden:
http://www.purearea.net/pb/CodeArchiv/G ... ect_RMB.pb
Benutzeravatar
Leonhard
Beiträge: 602
Registriert: 01.03.2006 21:25

Beitrag von Leonhard »

Ich hab den Code aus dem CodeArchiv für DropDown genommen.

Code: Alles auswählen

; German forum:
; Author: Freak (Timo Harter)
; Date: 17. December 2002


; --------------------------------------------------------------------------
; Drag'n' Drop mit TreeGadgets
; by Timo Harter
;
; Syntax:
; EnableDragDrop( #Gadget, DragMode, @DropProcedure() )
;
;  #Gadget : Die Gadgetnummer vom TreeGadget
;
; DragMode : #Drag_LeftMouse  = Drag'n'Drop mit linker Maustaste
;            #Drag_RightMouse = Drag'n'Drop mit rechter Maustaste
;            (kann man mit '|' kombinieren)
;
; @DropProcedure()
;            Adresse einer Procedure, die aufgerufen wird, wenn ein Item losgelassen wurde.
;            Sie muss folgenden Syntax haben:
;
;            Procedure DropProcedure(X.l, Y.l, Button.l, Item.l)
;
;            EndProcedure
;
;            X, Y    enthält die Position, wo es losgelassen wurde
;
;            Button  enthält #Drag_LeftMouse, wenn die linke Taste benutzt wurde, oder
;                    #Drag_RightMouse, wenn es die rechte war.
;
;            Item    enthält die Nummer des Items im TreeGadget, das losgelassen wurde
;                    (gleicher Index wie bei GetGadgetState() )
;
;
; Anmerkung:
; Wenn das TreeView keine Icons enthält, so werden leere Icons hnzugefügt, weil das Ganze
; ohne nicht funktioniert.
;
; Für mehr Infos bitte das Beispiel ansehen.
;
; -------------------------------------------------------------------------

#TVN_BEGINDRAG       = -407
#TVN_BEGINRDRAG      = -408
#TVS_DISABLEDRAGDROP = $10
#Drag_LeftMouse  = 1
#Drag_RightMouse = 2

; Structure NMTREEVIEW     ; Structure is already declared in PB 3.70+
;   hdr.NMHDR
;   action.l
;   itemOld.TV_ITEM
;   itemNew.TV_ITEM
;   ptDrag.POINT
; EndStructure

Global hWndTV.l, DropProc.l, DragDropMode.l, hDragIml.l, DragItem.l

Procedure.l DragDropCallback(Window.l, Message.l, wParam.l, lParam.l)
  Protected DoDrag.l, DropX.l, DropY.l, hItem.l, hItem2.l, dItem.l
  result = #PB_ProcessPureBasicEvents
  Select Message
    Case #WM_NOTIFY
      *lp.NMHDR = lParam
      If *lp\code = #TVN_BEGINDRAG And (DragDropMode & #Drag_LeftMouse): DoDrag = #True: EndIf
      If *lp\code = #TVN_BEGINRDRAG And (DragDropMode & #Drag_RightMouse): DoDrag = #True: EndIf
      If DoDrag
        *pnmtv.NMTREEVIEW = lParam
        DragItem = *pnmtv\itemNew\hItem
        hDragIml = SendMessage_(hWndTV, #TVM_CREATEDRAGIMAGE, 0, DragItem)
        SendMessage_(hWndTV, #TVM_SELECTITEM, #TVGN_CARET, #Null)
        ImageList_BeginDrag_(hDragIml, 0, 0, 0)
        ImageList_DragEnter_(GetParent_(hWndTV), 0, 0)
        ImageList_DragShowNolock_(#True)
        ImageList_DragLeave_(hWndTV)
        ShowCursor_(#False)
        SetCapture_(GetParent_(hWndTV))
        SendMessage_(hWndTV, #TVM_SELECTITEM, #TVGN_CARET, DragItem)
        
        CallFunctionFast(DropProc, WindowMouseX(0), WindowMouseY(0), -1, -1)
      EndIf
    Case #WM_MOUSEMOVE
        If hDragIml
          DropX = PeekW(@lParam)
          DropY = PeekW(@lParam+2)
          ImageList_DragMove_(DropX, DropY+20)
          ImageList_DragShowNolock_(#False)
          ImageList_DragShowNolock_(#True)
        EndIf
    Case #WM_LBUTTONUP
        If hDragIml And (DragDropMode & #Drag_LeftMouse)
          ImageList_EndDrag_()
          ReleaseCapture_()
          ShowCursor_(#True)
          ImageList_Destroy_(hDragIml)
          hDragIml = #False
          dItem = 0
          hItem = SendMessage_(hWndTV, #TVM_GETNEXTITEM, #TVGN_ROOT, 0)
          While hItem <> DragItem
            hItem2 = SendMessage_(hwndTV, #TVM_GETNEXTITEM, #TVGN_CHILD, hItem)
            Repeat
              If hItem2 = #Null: hItem2 = SendMessage_(hwndTV, #TVM_GETNEXTITEM, #TVGN_NEXT, hItem): EndIf
              If hItem2 = #Null: hItem = SendMessage_(hwndTV, #TVM_GETNEXTITEM, #TVGN_PARENT, hItem): EndIf
            Until hItem2 <> #Null
            hItem = hItem2
            dItem + 1
          Wend
          CallFunctionFast(DropProc, WindowMouseX(0), WindowMouseY(0), #Drag_LeftMouse, dItem)
        EndIf
    Case #WM_RBUTTONUP
        If hDragIml And (DragDropMode & #Drag_RightMouse)
          ImageList_EndDrag_()
          ReleaseCapture_()
          ShowCursor_(#True)
          ImageList_Destroy_(hDragIml)
          hDragIml = #False
          dItem = 0
          hItem = SendMessage_(hWndTV, #TVM_GETNEXTITEM, #TVGN_ROOT, 0)
          While hItem <> DragItem
            hItem2 = SendMessage_(hwndTV, #TVM_GETNEXTITEM, #TVGN_CHILD, hItem)
            Repeat
              If hItem2 = #Null: hItem2 = SendMessage_(hwndTV, #TVM_GETNEXTITEM, #TVGN_NEXT, hItem): EndIf
              If hItem2 = #Null: hItem = SendMessage_(hwndTV, #TVM_GETNEXTITEM, #TVGN_PARENT, hItem): EndIf
            Until hItem2 <> #Null
            hItem = hItem2
            dItem + 1
          Wend
          CallFunctionFast(DropProc, WindowMouseX(0), WindowMouseY(0), #Drag_RightMouse, DragItem)         
        EndIf
  EndSelect
  ProcedureReturn result
EndProcedure

Procedure.l EnableDragDrop(TVGadget.l, DragMode.l, DropProcedure.l)
  Protected Style.l, hIml.l
  hWndTV = GadgetID(TVGadget)
  DropProc = DropProcedure
  DragDropMode = DragMode
  Style = GetWindowLong_(hWndTV, #GWL_STYLE)
  Style = Style & (~#TVS_DISABLEDRAGDROP)
  SetWindowLong_(hWndTV, #GWL_STYLE, Style)
  If SendMessage_(hWndTV, #TVM_GETIMAGELIST, #TVSIL_NORMAL, 0) = #Null
    hIml = ImageList_Create_(16,16,#ILC_COLOR8,0,999)
    SendMessage_(hWndTV, #TVM_SETIMAGELIST, #TVSIL_NORMAL, hIml)
  EndIf
  SetWindowCallback(@DragDropCallback())
  ProcedureReturn #True
EndProcedure

; -------------------------------------------------------------------------
; Beispiel Code:
; -------------------------------------------------------------------------

#Tree = 1

Global mypoint.Point
; diese Procedure wird aufgerufen nach dem Drag'n'drop Vorgang:
Procedure DropProcedure(X.l, Y.l, Button.l, Item.l)
  If Button = - 1
    mypoint\x = X
    mypoint\y = Y
  ElseIf Button = #Drag_LeftMouse
    mypoint\x=mypoint\y-X
    mypoint\y=mypoint\y-Y
    
    If X > GadgetX(#Tree) And X < GadgetX(#Tree)+GadgetWidth(#Tree) And Y > GadgetY(#Tree) And Y < GadgetY(#Tree)+GadgetHeight(#Tree)
      MessageRequester("Drag'n Drop","Item Number "+Str(Item)+" has been dropped at X:"+Str(X)+" Y:"+Str(Y)+" using left Button."+#LF$+"Changed: X:"+Str(mypoint\x-mypoint\x*2)+" Y:"+Str(mypoint\y-mypoint\y*2),#MB_ICONINFORMATION)
    EndIf
  EndIf
EndProcedure

; Window und Gadget...
OpenWindow(0, 0, 0, 640, 480, "Drag'n Drop", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
CreateGadgetList(WindowID(0))

TreeGadget(#Tree, 5, 5, 150, 250)
hImg = LoadIcon_(0,#IDI_APPLICATION)
AddGadgetItem(#Tree, 0, "Item1", hImg)
AddGadgetItem(#Tree, 0, "Item2")
AddGadgetItem(#Tree, 0, "Item3", 0, 1)
AddGadgetItem(#Tree, 0, "Item4", 0, 1)

; mehr als das muß man nicht tun:
EnableDragDrop(#Tree, #Drag_LeftMouse, @DropProcedure())

; warten auf Ende...
While WaitWindowEvent() <> #PB_Event_CloseWindow: Wend
End

; -------------------------------------------------------------------------
Wie bekomm ich da jetzt heraus, über welches Item ich gegangen bin, da mit ich weis, um wie viel stellen sich das Item verschiebt.
Antworten