Editor Gadget notify on select text ?

Für allgemeine Fragen zur Programmierung mit PureBasic.
TWELVE
Beiträge: 72
Registriert: 01.04.2007 18:33

Editor Gadget notify on select text ?

Beitrag von TWELVE »

Hallo zusammen,

ich benutze in meiner Applikation ein Editor Gadget und benutze folgenden Code, um an den selektierten Text zu kommen ( nicht auf meinem Mist gewachsen):

Code: Alles auswählen

Procedure.s GetSelectedEditorText(iEdId.i)
;-----------------------------------------
Protected sSelected.s, Range.CHARRANGE, iSize.i 

               SendMessage_(GadgetID(iEdId), #EM_EXGETSEL, 0, Range)

                      iSize = (Range\cpMax - Range\cpMin)
                  sSelected = Space((iSize * 2) + 1)
          
               SendMessage_(GadgetID(iEdId),#EM_GETSELTEXT, 0, sSelected)

               ProcedureReturn(sSelected)
EndProcedure
Wie kann ich eine Benachrichtung erhalten, wenn im Editor Gadget Text selektiert wurde ?

Ich benötige dies u.a., um ein Kontextmenü zu aktivieren.

Die PB Hilfe bietet nur diese 3 Events für das Editor Gadget an:

Code: Alles auswählen

 #PB_EventType_Change   : the text has been modified by the user.
  #PB_EventType_Focus    : the editor has got the focus.
  #PB_EventType_LostFocus: the editor has lost the focus.
Ich habe natürlich schon jede Menge im Forum gesucht und auch viele Sachen gefunden, aber das hier leider noch nicht.
Scheint so, dass die meisten Sachen mit dem Editor Gadget über WinAPI gemacht werden müssen.

Über eine Lösung würde ich mich freuen...egal ob WinAPI oder PB ( ich bevorzuge eine PB only Lösung, aber wenn's nur mit
WinAPI geht, dann isses eben so ;- ).
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Re: Editor Gadget notify on select text ?

Beitrag von edel »

Du kannst es mal so probieren :

Code: Alles auswählen

Procedure WndProc(hWnd, Msg, wParam, lParam)
  Protected result = #PB_ProcessPureBasicEvents
  Protected *ntf.NMHDR
  Protected *sel.SELCHANGE 
  
  If Msg = #WM_NOTIFY
    
    *ntf = lParam
    
    If *ntf\code = #EN_SELCHANGE      
      *sel = lParam      
      If *sel        
        If Not *sel\seltyp = #SEL_EMPTY          
          Debug "select : " +  *sel\chrg\cpMin + " <-> " + *sel\chrg\cpMax          
        EndIf          
      EndIf            
    EndIf
    
  EndIf
  
  ProcedureReturn result
EndProcedure


Procedure Main()
  Protected mask
  
  If OpenWindow(0, #PB_Ignore, #PB_Ignore, 300, 300, "")
    
    SetWindowCallback(@WndProc(), 0)
    
    EditorGadget(0, 0, 0, 300, 300)
        
    mask = SendMessage_(GadgetID(0), #EM_GETEVENTMASK, 0, 0)
    SendMessage_(GadgetID(0), #EM_SETEVENTMASK, 0, mask | #ENM_SELCHANGE)
    
    Repeat
    Until WaitWindowEvent() = #PB_Event_CloseWindow
    
  EndIf  
  
EndProcedure: End Main()

  
  
TWELVE
Beiträge: 72
Registriert: 01.04.2007 18:33

Re: Editor Gadget notify on select text ?

Beitrag von TWELVE »

edel hat geschrieben:Du kannst es mal so probieren :

Code: Alles auswählen

Procedure WndProc(hWnd, Msg, wParam, lParam)
  Protected result = #PB_ProcessPureBasicEvents
  Protected *ntf.NMHDR
  Protected *sel.SELCHANGE 
  
  If Msg = #WM_NOTIFY
    
    *ntf = lParam
    
    If *ntf\code = #EN_SELCHANGE      
      *sel = lParam      
      If *sel        
        If Not *sel\seltyp = #SEL_EMPTY          
          Debug "select : " +  *sel\chrg\cpMin + " <-> " + *sel\chrg\cpMax          
        EndIf          
      EndIf            
    EndIf
    
  EndIf
  
  ProcedureReturn result
EndProcedure


Procedure Main()
  Protected mask
  
  If OpenWindow(0, #PB_Ignore, #PB_Ignore, 300, 300, "")
    
    SetWindowCallback(@WndProc(), 0)
    
    EditorGadget(0, 0, 0, 300, 300)
        
    mask = SendMessage_(GadgetID(0), #EM_GETEVENTMASK, 0, 0)
    SendMessage_(GadgetID(0), #EM_SETEVENTMASK, 0, mask | #ENM_SELCHANGE)
    
    Repeat
    Until WaitWindowEvent() = #PB_Event_CloseWindow
    
  EndIf  
  
EndProcedure: End Main()

  
  
Funktioniert....aber: ich habe bereits ein anderes Window Callback, um den Rechtsklick für das Editor Gagdet abzufangen, um damit das
Kontextmenü anzeigen zu lassen:

Code: Alles auswählen

Procedure WinCallback(hWnd, uMsg, wParam, lParam) 
  Protected result = #PB_ProcessPureBasicEvents
  
  Select uMsg
    Case #WM_CONTEXTMENU
      If GadgetID(Editor_1) = wParam
        DisplayPopupMenu(Popupmenu_1, WindowID(Main)) 
      EndIf
  EndSelect
  
  ProcedureReturn result 
EndProcedure
Kann man überhaupt mehr als einen Callback pro Window haben ? Vermutlich nein...?

So..und wie kombiniere ich nun beides ? Also Events für Editor right-click und text-select ?

Das ist einer der Gründe, warum ich WinAPI Code meide.Ich verstehe ihn nicht wirklich, aber da ich die Funktionen benötige, füge ich
solche Codeschnipsel als Blackbox in meinen Code ein.Schade, dass Purebasic solche banalen Dinge nicht out-of-the-box kann.
Benutzeravatar
mk-soft
Beiträge: 3871
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Editor Gadget notify on select text ?

Beitrag von mk-soft »

Einfach zusammenpacken. Etwa so....

Fehlt der rest noch von dir

Code: Alles auswählen

Procedure WndProc(hWnd, Msg, wParam, lParam)
  Protected result = #PB_ProcessPureBasicEvents
  Protected *ntf.NMHDR
  Protected *sel.SELCHANGE 
  
  Select uMsg
    Case #WM_CONTEXTMENU
      If GadgetID(0) = wParam
        DisplayPopupMenu(Popupmenu_1, WindowID(Main)) 
      EndIf
  
    Case #WM_NOTIFY
    
      *ntf = lParam
      
      If *ntf\code = #EN_SELCHANGE      
        *sel = lParam      
        If *sel        
          If Not *sel\seltyp = #SEL_EMPTY          
            Debug "select : " +  *sel\chrg\cpMin + " <-> " + *sel\chrg\cpMax          
          EndIf          
        EndIf            
      EndIf
    
  EndSelect

  ProcedureReturn result
EndProcedure


Procedure Main()
  Protected mask
  
  If OpenWindow(0, #PB_Ignore, #PB_Ignore, 300, 300, "")
    
    SetWindowCallback(@WndProc(), 0)
    
    EditorGadget(0, 0, 0, 300, 300)
        
    mask = SendMessage_(GadgetID(0), #EM_GETEVENTMASK, 0, 0)
    SendMessage_(GadgetID(0), #EM_SETEVENTMASK, 0, mask | #ENM_SELCHANGE)
    
    Repeat
    Until WaitWindowEvent() = #PB_Event_CloseWindow
    
  EndIf  
  
EndProcedure: End Main()

Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
TWELVE
Beiträge: 72
Registriert: 01.04.2007 18:33

Re: Editor Gadget notify on select text ?

Beitrag von TWELVE »

Vielen Dank für die schnelle Antwort !!! Funktioniert so !

Ich hab es jetzt so gemacht:

Code: Alles auswählen

Procedure WinCallback(hWnd, uMsg, wParam, lParam) 
  Protected result = #PB_ProcessPureBasicEvents
  Protected *ntf.NMHDR
  Protected *sel.SELCHANGE 
  
  Select uMsg
    Case #WM_CONTEXTMENU
      If GadgetID(Editor_1) = wParam
        DisplayPopupMenu(Popupmenu_1, WindowID(Main)) 
      EndIf
      
      
      
      
     Case #WM_NOTIFY
    
      *ntf = lParam
      
      If *ntf\code = #EN_SELCHANGE      
        *sel = lParam      
        If *sel        
          If Not *sel\seltyp = #SEL_EMPTY          
            Debug "select : " +  *sel\chrg\cpMin + " <-> " + *sel\chrg\cpMax    
            
            ;********enable popupmenu_1 items ( Editor_1 Gagdet) when text is selected 
            DisableMenuItem(Popupmenu_1,#MenuItem_30, 0)
            DisableMenuItem(Popupmenu_1,#MenuItem_31, 0)
            DisableMenuItem(Popupmenu_1,#MenuItem_32, 0)
            DisableMenuItem(Popupmenu_1,#MenuItem_33, 0)
            
            
          Else
            
            ;********disable popupmenu_1 items ( Editor_1 Gagdet) when no text is selected 
            DisableMenuItem(Popupmenu_1,#MenuItem_30, 1)
            DisableMenuItem(Popupmenu_1,#MenuItem_31, 1)
            DisableMenuItem(Popupmenu_1,#MenuItem_32, 1)
            DisableMenuItem(Popupmenu_1,#MenuItem_33, 1) 
  
            
          EndIf          
        EndIf            
      EndIf    
      
      
  EndSelect
  
  ProcedureReturn result 
EndProcedure
Es wird also der right-click genutzt, um das Kontext-Menü anzuzeigen und der selektierte Text aktiviert es.
Antworten