Seite 2 von 3

Verfasst: 10.05.2007 00:16
von persepole
Wollte nur mal wissen was erfahrene programmierer davon halten.
Ich programmiere noch nicht sehr lange commerziel.
D.h. ich bin mir noch etwas unsicher wie soetwas klassisch unter
PB umgesetzt wird.
In C# gibts da ja fast alle vorgefertigt.
Das beispiel auf das TS-soft hingewiesen hat ist auch ganz nett.
Ich finde aber das die ProGui lib was z.B. bei verschieben eines
Gadgets in der Rebar die breite der Combobox und Stringgadgets
angeht etwas professioneller.
Naja, jedenfalls ist das beispiel mit PB doch etwas komplizierter.
Jedenfalls für mich.
Kommt in dem Bsp. die API zum einsatz?

MFG

Verfasst: 10.05.2007 00:22
von persepole
achso. Hätt ich fast vergessen.

Der entwickler dieser lib entwickelt das teil
jedenfalls noch weiter.
Geplant sind Menues im Office stil usw.
Von ihm sind in absehbarer zeite weitere libs zu erwarten.
Sehr netter kontakt.
Ich denke mit diesem Herrn könnte sich pureare usw. durchaus
arrangieren.
Was denkt Ihr darüber?

Verfasst: 12.05.2007 00:28
von persepole
Hat vielleicht jemand ne Idee zu der Lib was
noch verbessert oder erweitert werden könnte?

MFG

Persepole

(Hört ihr das singen der Vögel)

Verfasst: 12.05.2007 06:54
von rolaf
persepole hat geschrieben:(Hört ihr das singen der Vögel)
Nö, aber gleich singt Kearu das du keine 3-fach Postings erzeugen sollst! :wink:

Verfasst: 13.05.2007 21:38
von X0r
[img]C:\Dokumente%20und%20Einstellungen\anonym\Desktop\ProProGui.jpg[/img]
Geil! :lol:
:bounce:

(Tipp: www.imageshack.us )

Also ich werde mir diese Lib auf jeden Fall kaufen, wenn es den OfficeXP|Office 2003|Whidbey style unterstützt.

Geht nicht, aber vielleicht insperiert es ja

Verfasst: 22.05.2007 12:30
von Xaby
Meine ersten Gedanken zu der ToolBar-Problematik.

Code: Alles auswählen

;/ EasyVent
XIncludeFile "EasyVENT.pbi" ;
; Link to Download: http://www.purebasic.fr/english/viewtopic.php?t=21136&highlight=easyvent

Declare.l DragItem(*sender.PB_Sender)
Declare.l DropItem(*sender.PB_Sender)
;/ EasyVent END

; http://www.purebasic.fr/german/viewtopic.php?t=10704&highlight=global+hotkeys
Declare.l AddHotkey(Window, fsModifiers, Keys, HotkeyID) ; Create a new global hotkey HotkeyID in specified Window. 
Declare.l RemoveHotkey(Window, HotkeyID) ; Remove Specified HotkeyID in Window. 
#MOD_WINDOWS = $8 
#PB_Event_Hotkey = 786 


; My Functions
Declare ByCTRL(j.l)


Enumeration
 #MainWin
EndEnumeration

Define Event.l
Define GadgetNr.l
Define MerkeCTRL.l


OpenPreferences("FLFenster.ini")
Define WinPosX_MainWin.l=ReadPreferenceLong("WINDOW_XPOS_MAIN",50);
Define WinPosY_MainWin.l=ReadPreferenceLong("WINDOW_YPOS_MAIN",50);
ClosePreferences()

OpenWindow(#MainWin,WinPosX_MainWin,WinPosY_MainWin, 750,550,":: FL :: FL-Fenster")

CreateGadgetList(WindowID(0))
ButtonGadget(0,  0, 0, 50, 20, "Menu 1")
ButtonGadget(1,  50, 0, 70, 20, "Menu 2")
ButtonGadget(2, 120, 0, 100, 20, "Menu Nummer 3") 

If AddHotkey(0, #MOD_CONTROL,0, 0) = 0 
  MessageRequester("Error", "Cannot create hotkey 0.") 
EndIf 


SetActiveGadget(1)

;Set event handlers.

Repeat

  Event= WaitWindowEvent()
  
  If Event=#PB_Event_Gadget
    GadgetNr=EventGadget()
    Debug GadgetNr
    
    
  EndIf

  
  If Event = #PB_Event_Hotkey ; If an hotkey was called 
    If  EventwParam()=0 ; For know what hotkey was called, no documentation on PureBasic for this function. 
           ; Hotkey with ID 0 (STRG / CTRL)
      If MerkeCTRL=0  
         MerkeCTRL=1 
      Else
        MerkeCTRL=0 
      EndIf  
      
      Debug MerkeCTRL
      ByCTRL(MerkeCTRL)
          
    EndIf    
  EndIf    
  ; Now we remove the hotkeys. 
  
Until Event=#PB_Event_CloseWindow

RemoveHotkey(0, 0) 

CreatePreferences("FLFenster.ini")
WritePreferenceLong("WINDOW_XPOS_MAIN",WindowX(#MainWin))
WritePreferenceLong("WINDOW_YPOS_MAIN",WindowY(#MainWin))

ClosePreferences()


CloseWindow(#MainWin)


;/ by Folker

Procedure ByCTRL(j.l)
  Static P.l
  If j=1
    P=#OnDragItemStart
    SetEventHandler(GadgetID(0), P, @DragItem())
    SetEventHandler(GadgetID(1), P, @DragItem())
    SetEventHandler(GadgetID(2), P, @DragItem()) 
  Else
    P=#OnDragItemEnd
    SetEventHandler(GadgetID(0), P, @DropItem())
    SetEventHandler(GadgetID(1), P, @DropItem())
    SetEventHandler(GadgetID(2), P, @DropItem()) 
  EndIf  
   
EndProcedure


; GlobalHotkeys library 
; By Gansta93 

Procedure AddHotkey(Window, fsModifiers, Keys, HotkeyID) ; Create a new global hotkey HotkeyID in specified Window. 
  ProcedureReturn RegisterHotKey_(WindowID(Window), HotkeyID, fsModifiers, Keys) 
EndProcedure 

Procedure RemoveHotkey(Window, HotkeyID) ; Remove Specified HotkeyID in Window. 
  ProcedureReturn UnregisterHotKey_(WindowID(Window), HotkeyID) 
EndProcedure 

; From DragDropItems demo 1.pb by srod
;*********************************************************************************
;                                 EVENT HANDLERS
;*********************************************************************************

;Here we simply return #PB_ProcessPureBasicEvents to enable the drag.
;To enable the drag simply place the drag text in *sender\text$
;If *sender\text$ is empty on return, then the drag/drop is cancelled.
Procedure.l DragItem(*sender.PB_Sender)
  ;Determine which gadget is being dragged from.
  Select *sender\hwnd
    Case GadgetID(0)
      *sender\Text$=GetGadgetText(0) ; GetGadgetPosition
    Case GadgetID(1)
      *sender\Text$=GetGadgetText(1)
    Case GadgetID(2)
      *sender\Text$=GetGadgetText(2)
      
  EndSelect
  ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure


;The following handles drops from three gadgets.
Procedure.l DropItem(*sender.PB_Sender)
  ;First remove any line feed / carriage returns from the dragged string.
  *sender\Text$=ReplaceString(*sender\Text$,Chr(10)+Chr(13)," ")
  ;Add to list view gadget.
  AddGadgetItem(4,-1, *sender\Text$)
  ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure
Nächster Ansatz:

Code: Alles auswählen

Enumeration
  #MainWin
EndEnumeration

Define Event.l
Define GadgetNr.l

OpenPreferences("FLFenster2.ini")
Define WinPosX_MainWin.l=ReadPreferenceLong("WINDOW_XPOS_MAIN",50);
Define WinPosY_MainWin.l=ReadPreferenceLong("WINDOW_YPOS_MAIN",50);
ClosePreferences()

OpenWindow(#MainWin,WinPosX_MainWin,WinPosY_MainWin, 750,550,":: FL :: FL-Fenster 2")

CreateGadgetList(WindowID(0))

ListIconGadget(0,0,0,300,20,"Menu 1",50,#PB_ListIcon_HeaderDragDrop)
AddGadgetColumn(0,1,"Menu 2",70)
AddGadgetColumn(0,2,"Menu Nummer 3",120)


Repeat
  
  Event= WaitWindowEvent()
  
  If Event=#PB_Event_Gadget
    GadgetNr=EventGadget()
    Debug GadgetNr
  
     
  EndIf
  
  ;/ HIer geht auch nix :-(
  EventType=EventType()
  If EventType<>-1
    Debug EventType
  EndIf  
  
  
  
  
Until Event=#PB_Event_CloseWindow

CreatePreferences("FLFenster2.ini")
WritePreferenceLong("WINDOW_XPOS_MAIN",WindowX(#MainWin))
WritePreferenceLong("WINDOW_YPOS_MAIN",WindowY(#MainWin))

ClosePreferences()


CloseWindow(#MainWin)

Hier noch eine Methode für die individuelle Menü-Anordnung:

Code: Alles auswählen

Enumeration
  #MainWin
EndEnumeration

Define Event.l
Define GadgetNr.l


NewList Gadgets()


Procedure CreateMenuButton(Text$,Breite.l,List(),Start=0)
  If CountList(List())<>0
    LastElement(List())
    GD=List()
    x=GadgetX(GD)+GadgetWidth(GD)
  Else
    GD=Start-1
  EndIf  
    AddElement(List())
    List()=GD+1
    ButtonGadget(GD+1,  x, 0, Breite-5, 20, Text$)
    AddElement(List())
    List()=GD+2
    ButtonGadget(GD+2,  x+Breite-5, 0, 5, 20,"") 
   
EndProcedure


OpenPreferences("FLFenster3.ini")
Define WinPosX_MainWin.l=ReadPreferenceLong("WINDOW_XPOS_MAIN",50);
Define WinPosY_MainWin.l=ReadPreferenceLong("WINDOW_YPOS_MAIN",50);
ClosePreferences()

OpenWindow(#MainWin,WinPosX_MainWin,WinPosY_MainWin, 750,550,":: FL :: FL-Fenster 3")

CreateGadgetList(WindowID(0))

CreateMenuButton("Menu 1",50,Gadgets(),100) ; GadgetID startet bei 100
CreateMenuButton("Menu 2",70,Gadgets())
CreateMenuButton("Menu Nummer 3",100,Gadgets())
CreateMenuButton("Menu vier",70,Gadgets())
CreateMenuButton("M V",40,Gadgets())


Repeat
  
  Event= WaitWindowEvent()
  
  If Event=#PB_Event_Gadget
    GadgetNr=EventGadget()
    Debug GadgetNr
    
    Anzahl=CountList(Gadgets())
    ResetList(Gadgets())
    While NextElement(Gadgets())
      If GadgetNr=Gadgets()  And  GadgetWidth(Gadgets())=5 And Gadgets()<Anzahl+100-1 ; Letzter Schieber soll nicht funktionieren
        ; kleiner Knopf neben Menu-Eintrag !Breite = 5; Anzahl + 100, weil Gadget-IDs bei 100 Beginnen
        PreviousElement(Gadgets())
        *FirstElement = @Gadgets()
        GD1=Gadgets()
        NextElement(Gadgets())
        *MenuSwap = @Gadgets()
        GDM=Gadgets() 
        NextElement(Gadgets())
        *SecondElement=@Gadgets()
        GD2=Gadgets()
        
        ResizeGadget(GD2,GadgetX(GD1),#PB_Ignore,#PB_Ignore,#PB_Ignore) ; hinterer nach vorn
        ResizeGadget(GDM,GadgetX(GD2)+GadgetWidth(GD2),#PB_Ignore,#PB_Ignore,#PB_Ignore); kleiner Knopf in der Mitte
        ResizeGadget(GD1,GadgetX(GDM)+5,#PB_Ignore,#PB_Ignore,#PB_Ignore)
         
        SwapElements(Gadgets(),*FirstElement,*SecondElement)
        
        ;PreviousElement(Gadgets()) ; es kann sowieso nur jedes zweite Gadget ein MenuSwapper sein
        
        Debug "Tausche"  
        GadgetNr=-1
      EndIf
     
    Wend
     
  EndIf 
  
  
  
Until Event=#PB_Event_CloseWindow

CreatePreferences("FLFenster3.ini")
WritePreferenceLong("WINDOW_XPOS_MAIN",WindowX(#MainWin))
WritePreferenceLong("WINDOW_YPOS_MAIN",WindowY(#MainWin))

ClosePreferences()

CloseWindow(#MainWin)
Wenn man meinen letzten Code mit dem ersten Versuch von EasyVent so verbinden würde, dass jedes 5-Breit-Gadget() zum Droppen gedacht ist und man alle anderen Draggen kann, und diese Trotzdem bei einfachem Klick (Doppelklick geht) eine GadgetNr wiedergeben, dann wäre es ja schon schön oder? + Bildchen natürlich. Aber mit ImageButtonGadget() geht es ja auch :allright:

Hoffe, es nützt jemandem was. :allright:

Burner

Verfasst: 22.05.2007 16:39
von Xaby

Code: Alles auswählen

EnableExplicit

Enumeration
  #MainWin
EndEnumeration

Define Event.l
Define EventType.l
Define GadgetNr.l
Define MausA.POINT
Define MausE.POINT


Define LGD.l, FGD, GD1, GD2, Tausche
Define *FirstElement, *SecondElement

NewList Gadgets()


Procedure CreateMenuButton(Text$,Breite.l,List(),F.l,Start=0)
  Static GD.l,x
  If CountList(List())<>0
    LastElement(List())
    GD=List()
    x=GadgetX(GD)+GadgetWidth(GD)
  Else
    GD=Start-1
  EndIf  
    AddElement(List())
    List()=GD+1
    CreateImage(GD+1,Breite-5,20)
    StartDrawing(ImageOutput(GD+1))
      Box(0,0,ImageWidth(GD+1),ImageHeight(GD+1),#Gray)
      Box(1,1,ImageWidth(GD+1)-2,ImageHeight(GD+1)-2,F)
      DrawText(4,2,Text$,0,F); #LightGray
    StopDrawing()
    ImageGadget(GD+1,  x, 0, Breite, 35, ImageID(GD+1))
  
EndProcedure


OpenPreferences("FLFenster4.ini")
Define WinPosX_MainWin.l=ReadPreferenceLong("WINDOW_XPOS_MAIN",50);
Define WinPosY_MainWin.l=ReadPreferenceLong("WINDOW_YPOS_MAIN",50);
ClosePreferences()

OpenWindow(#MainWin,WinPosX_MainWin,WinPosY_MainWin, 750,550,":: FL :: FL-Fenster 4")

CreateGadgetList(WindowID(#MainWin))


CreateMenuButton("Menu 1",60,Gadgets(),#Yellow,100) ; GadgetID startet bei 100
CreateMenuButton("Menu 2",60,Gadgets(),#Red)
CreateMenuButton("Menu Nummer 3",120,Gadgets(),RGB(128,128,255))
CreateMenuButton("Menu vier",80,Gadgets(),RGB(192,192,192))
CreateMenuButton("M V",40,Gadgets(),#Green)
;CreateMenuButton("",10,Gadgets(),#Gray)


Repeat
  
  Event= WaitWindowEvent()
  
  If Event=#PB_Event_Gadget
    GadgetNr=EventGadget()
    Debug GadgetNr
    
    LastElement(Gadgets())
    LGD.l=Gadgets() ; letztes Element
    FirstElement(Gadgets())
    FGD.l=Gadgets() ; Erstes Element
    ResetList(Gadgets())
    
    While NextElement(Gadgets())
      If GadgetNr=Gadgets(); Letzter Schieber soll nicht funktionieren
        
        EventType=EventType()
        
        Debug EventType ; MouseDown und MouseUp wäre noch nützlich, damit ziehen vom Klicken unterschieden werden kann
        ; 0 = erste Maustaste einfach geklickt
        ; 1 = zweite Maustaste einfach geklickt
        ; 2 = erste Maustaste zweifach geklickt
        ; 3 = zweite Maustaste zweifach geklickt
        ; 14002 = erste Maustaste klicken und dabei ziehen
        
        If EventType = 0
          MausA\x=WindowMouseX(#MainWin)
          MausA\y=WindowMouseY(#MainWin) 
        EndIf
        If EventType = 14002
          MausE\x=WindowMouseX(#MainWin)
          MausE\y=WindowMouseY(#MainWin)
          
          If MausA\x-MausE\x>0
            Debug "<--- nach links geschoben" ; Tausch erfolgt mit 5-Breit-Knopf auf linker Seite vom ImageButton, außer wenn erster
            
            If Gadgets()<>FGD ; erstes Element in der Liste
              Tausche.l=1
              GD2=Gadgets()
              *SecondElement=@Gadgets()
              PreviousElement(Gadgets())
              *FirstElement = @Gadgets() 
              GD1=Gadgets()
            Else
            Tausche.l=0
            EndIf
          Else  
            Debug "nach rechtss geschoben --->" ; Tausch erfolgt mit 5-Breit-Knopf auf rechter Seite vom ImageButton, außer wenn letzter
            If Gadgets()<> LGD; letztes Element in der Liste
            Tausche=1
            GD1=Gadgets()
            *FirstElement = @Gadgets()
             NextElement(Gadgets())
            *SecondElement=@Gadgets()
            GD2=Gadgets()
            Else
              Tausche.l=0
            EndIf
          
          EndIf 
          
        EndIf 
        
        
        ; kleiner Knopf neben Menu-Eintrag !Breite = 5; Anzahl + 100, weil Gadget-IDs bei 100 Beginnen
        If Tausche
        ResizeGadget(GD2,GadgetX(GD1),#PB_Ignore,#PB_Ignore,#PB_Ignore) ; hinterer nach vorn
        SetGadgetState(GD2, ImageID(GD2)) ; Gibt sonst Darstellungsfehler
        ResizeGadget(GD1,GadgetX(GD2)+GadgetWidth(GD2),#PB_Ignore,#PB_Ignore,#PB_Ignore) ; vorderer nach hinten
        SetGadgetState(GD1, ImageID(GD1)) ; Gibt sonst Darstellungsfehler
         
        SwapElements(Gadgets(),*FirstElement,*SecondElement)
        Tausche=0
        GadgetNr=-1
        Debug "getauscht Tausche"   
        EndIf  
      EndIf 
      
    Wend
   
     
  EndIf  
  
  
Until Event=#PB_Event_CloseWindow

CreatePreferences("FLFenster4.ini")
WritePreferenceLong("WINDOW_XPOS_MAIN",WindowX(#MainWin))
WritePreferenceLong("WINDOW_YPOS_MAIN",WindowY(#MainWin))

ClosePreferences()


CloseWindow(#MainWin)
Menüs verschieben, fast wie die Links im Arbeitsplatz (File/I-Explorer)

Nur mit PB-Befehlen. Und wenn erstmal PB 4.1 mit Drag'n'Drop da ist :o :allright:

Verfasst: 22.05.2007 16:46
von bobobo
hier ist auch ne anständige Toolbar-Lösung oder sowas in der Art

Verfasst: 22.05.2007 16:58
von Rings
bobobo hat geschrieben:hier ist auch ne anständige Toolbar-Lösung oder sowas in der Art
ROFL !!!!
Danke, das war der krönenden Abschluss heute :)

Verfasst: 22.05.2007 16:59
von Xaby
Alter Komiker :mrgreen:
Hatte mich fast schon gefreut, dass es da eine vernünftfge LIB zu gibt.
Kann doch nicht so schwer sein, zu mindest für die Hardcore-Programmierer.

Das gibt es im Office doch schon seit 2000 oder so.

Und jedes einiger maßen vernünftige Programm bietet heute sowas auch.

Naja, oder man konfiguriert seine Menüs in einem ListViewGadget()
je nach dem in welcher Reihenfolge sie dort drin stehen, setzt man sie dann auch in das Menü.

:oops: