StringGadget - PathRequester(Doppelklick) ?

Anfängerfragen zum Programmieren mit PureBasic.
Simon74
Beiträge: 60
Registriert: 04.05.2014 10:05

StringGadget - PathRequester(Doppelklick) ?

Beitrag von Simon74 »

Hallo,

ich versuche einen PathRequester im StringGadget (zu finden im Preferences Untermenu!) mit #PB_EventType_Focus. (#PB_Event_LeftDoubleClick funktioniert leider gar nicht).
Ich lande dann in einem PathRequester-Loop.
Wie macht manns richtig ?

Code: Alles auswählen

Procedure Preferences()
  If OpenWindow(2, #PB_Ignore, #PB_Ignore, 600, 360," Preferences", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    AddKeyboardShortcut(2, #PB_Shortcut_Escape, 890)
    If UseGadgetList(WindowID(2)) 
      TextGadget(81, 40, 50, 200, 25,"Path:")
      Text_Path = StringGadget(82, 100, 50, 360, 20,  "")
    EndIf
  EndIf
EndProcedure

If OpenWindow(0, 0, 0, 500, 520, " test", #PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_ScreenCentered)
  ;Tastaturkeys
  AddKeyboardShortcut(0, #PB_Shortcut_Escape, 130)
  AddKeyboardShortcut(0, #PB_Shortcut_Control | #PB_Shortcut_O, 145)
  AddKeyboardShortcut(0, #PB_Shortcut_Control | #PB_Shortcut_P, 146)
  
  If UseGadgetList(0) ;Buttons und Ausgabefeld
    
   
    If CreateStatusBar(0, WindowID(0))
      AddStatusBarField(#PB_Ignore)
    EndIf

    StatusBarText(0, 0, "", #PB_StatusBar_BorderLess)
    
    If CreateMenu(0, WindowID(0)) ;Menüeinträge
      MenuTitle("Menu")
      MenuItem( 5, "&Preferences" + Chr(9) + "Strg+P")      
      MenuBar()
      MenuItem( 7, "&Exit" + Chr(9) + "Esc")

      
    EndIf
  EndIf    
  
 
  Repeat
    Select WaitWindowEvent()
      Case #PB_Event_CloseWindow
        Quit = 1
        
      Case #PB_Event_Menu ;Tastaturereignisse
        Select EventMenu()
          Case 5,146                   : Preferences()
          Case 7,130                   : Quit = 1
          Case 222,890,891,892         : CloseWindow(2)
          Case 990,991                 : CloseWindow(3)
        EndSelect
        
      Case #PB_Event_Gadget ;Mauseereignisse
        Select EventGadget()
          Case 82
            Select EventType()
              Case #PB_EventType_Focus
                BatchPath$ = PathRequester("Choose a folder.", Path$)
                SetGadgetText(82, BatchPath$)
            EndSelect
        EndSelect
        
    EndSelect
    
  Until Quit = 1
  
EndIf
Danke für Tip !
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: StringGadget - PathRequester(Doppelklick) ?

Beitrag von ts-soft »

Hinter dem StringGadget für den Pfad, noch einen Button mit "..." oder "browse" anfügen und auf den
Button reagieren.
Wenn Du auf Veränderungen im StringGadget reagieren möchtest, dann nutze das LostFocus event,
oder Poste selber ein Event nach dem Requester.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Simon74
Beiträge: 60
Registriert: 04.05.2014 10:05

Re: StringGadget - PathRequester(Doppelklick) ?

Beitrag von Simon74 »

Also doch besser Button verwenden.
Vielen Dank
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Re: StringGadget - PathRequester(Doppelklick) ?

Beitrag von edel »

Unter Windows wuerde es mit folgendem Code gehen, allerdings ist der Doppelklick in einem Stringgadget fuer das Markieren gedacht.

Code: Alles auswählen

Procedure StringEditCallback(hWnd, Msg, wParam, lParam)
  Protected OldProc = GetProp_(hWnd, "OldProc")
  Protected BatchPath.s
  
  If Msg = #WM_LBUTTONDBLCLK
    BatchPath = PathRequester("Choose a folder.", "")
    SetGadgetText(82, BatchPath)
  EndIf
  
  If Msg = #WM_DESTROY
    RemoveProp_(hWNd, "OldProc")
  EndIf
  
  
  ProcedureReturn CallWindowProc_(OldProc, hWnd, Msg, wParam, lParam)
EndProcedure

Procedure SetGadgetCallback(Gadget, Callback)
  Protected OldProc
  Protected hWnd
  
  hWnd = GadgetID(Gadget)
  
  If hWnd
    OldProc = SetWindowLongPtr_(hWnd, #GWLP_WNDPROC, Callback)
    SetProp_(hWnd, "OldProc", OldProc)
  EndIf
  
  ProcedureReturn 0
EndProcedure

Procedure Preferences()
  If OpenWindow(2, #PB_Ignore, #PB_Ignore, 600, 360," Preferences", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    AddKeyboardShortcut(2, #PB_Shortcut_Escape, 890)
    If UseGadgetList(WindowID(2)) 
      TextGadget(81, 40, 50, 200, 25,"Path:")
                  
      Text_Path = StringGadget(82, 100, 50, 360, 20,  "")
      SetGadgetCallback(82, @StringEditCallback())
    EndIf
  EndIf
EndProcedure

If OpenWindow(0, 0, 0, 500, 520, " test", #PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_ScreenCentered)
  ;Tastaturkeys
  AddKeyboardShortcut(0, #PB_Shortcut_Escape, 130)
  AddKeyboardShortcut(0, #PB_Shortcut_Control | #PB_Shortcut_O, 145)
  AddKeyboardShortcut(0, #PB_Shortcut_Control | #PB_Shortcut_P, 146)
  
  If UseGadgetList(0) ;Buttons und Ausgabefeld
    
   
    If CreateStatusBar(0, WindowID(0))
      AddStatusBarField(#PB_Ignore)
    EndIf

    StatusBarText(0, 0, "", #PB_StatusBar_BorderLess)
    
    If CreateMenu(0, WindowID(0)) ;Menüeinträge
      MenuTitle("Menu")
      MenuItem( 5, "&Preferences" + Chr(9) + "Strg+P")      
      MenuBar()
      MenuItem( 7, "&Exit" + Chr(9) + "Esc")

      
    EndIf
  EndIf    
  
 
  Repeat
    Select WaitWindowEvent()
      Case #PB_Event_CloseWindow
        Quit = 1
        
      Case #PB_Event_Menu ;Tastaturereignisse
        Select EventMenu()
          Case 5,146                   : Preferences()
          Case 7,130                   : Quit = 1
          Case 222,890,891,892         : CloseWindow(2)
          Case 990,991                 : CloseWindow(3)
        EndSelect
        
      Case #PB_Event_Gadget ;Mauseereignisse
        Select EventGadget()
          Case 82
            Select EventType()
              Case #PB_EventType_Focus

            EndSelect
        EndSelect
        
    EndSelect
    
  Until Quit = 1
  
EndIf
Antworten