[RESOLU] EditorGagdet et Callback : Pb dûs aux panelgadget

Programmation d'applications complexes
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

[RESOLU] EditorGagdet et Callback : Pb dûs aux panelgadget

Message par Progi1984 »

Dans ce code, il m'est impossible de recevoir les évènements du richedit à moins qu'il soit hors du panel.

Code : Tout sélectionner

ProcedureDLL TEditor_Init()
  ; Numérotation des lignes
  Structure LN
    Editor_Ed.l
    Container.l
    Editor_Ln.l
  EndStructure
  Global NewList LNumber.LN()
EndProcedure
;- OK Numérotation de Lignes
;{
Procedure.l TEditor_LN_Callback(hwnd, msg, wparam, lparam)
  OriginProc.l= GetProp_(hWnd, "OriginProc")
  Shared previousItems
  result = #PB_ProcessPureBasicEvents
  Find=#False
  For i=0 To CountList(LNumber())-1
    SelectElement(LNumber(),i)
    If IsGadget(LNumber()\Editor_ed)
      Debug Str(wparam)+"-"+Str(lparam)+"-"+Str(GadgetID(LNumber()\Editor_ed))
      If GadgetID(LNumber()\Editor_ed)=lparam
        Find=#True
        Break
      EndIf
    EndIf
  Next
  If Find=#True 
    Select msg
      Case #WM_COMMAND
        If IsGadget(LNumber()\Editor_ed) And IsGadget(LNumber()\Editor_ln)
          If lparam = GadgetID(LNumber()\Editor_ed)
            Select wparam >>16&$FFFF
              Case #EN_VSCROLL
                ; --> Keep linenumbers in sync with EditorGadget scrolling up or down (clicking scroll buttons)
                SendMessage_(GadgetID(LNumber()\Editor_ed), #EM_GETSCROLLPOS, 0, @egOne.POINT)
                ; --> Keep numbers from scrolling left
                egOne\x = 0
                SendMessage_(GadgetID(LNumber()\Editor_ln), #EM_SETSCROLLPOS, 0, egOne)
              Case #EN_UPDATE
                SendMessage_(GadgetID(LNumber()\Editor_ed), #EM_SETCHARFORMAT, #SCF_ALL, @egFormat)
                ; --> Keep linenumbers in sync with EditorGadget scrolling up or down (dragging scroll thumb)
                SendMessage_(GadgetID(LNumber()\Editor_ed), #EM_GETSCROLLPOS, 0, @egOne.POINT)
                ; --> Keep numbers from scrolling left
                egOne\x = 0
                SendMessage_(GadgetID(LNumber()\Editor_ln), #EM_SETSCROLLPOS, 0, egOne)
              Case #EN_CHANGE
                ; --> Keep linenumbers in sync with EditorGadget adding or removing items
                currentLine = SendMessage_(GadgetID(LNumber()\Editor_ed), #EM_LINEFROMCHAR, -1, 0)+1
                lnItems = CountGadgetItems(LNumber()\Editor_ln)
                egItems = CountGadgetItems(LNumber()\Editor_ed)
                ; --> For now I just clear the entire number list when items are
                ; --> added or removed. >>>>>>>>>>>>>  Causes slight flicker so find a better way! <<<<<<<<<<<<<<
                If egItems > lnItems
                  For i = lnItems+1 To egItems
                    AddGadgetItem(LNumber()\Editor_ln, i, Str(i))
                  Next i
                EndIf
                If egItems < lnItems
                  For i = lnItems To egItems Step -1
                    RemoveGadgetItem(LNumber()\Editor_ln, i)
                  Next i
                  ; --> Remove the last CR/LF left behind by RemoveGadgetItem
                  ; --> Readonly off for linenumbers
                  SendMessage_(GadgetID(LNumber()\Editor_ln), #EM_SETREADONLY, 0, 0)
                  SendMessage_(GadgetID(LNumber()\Editor_ln), #WM_KEYDOWN, #VK_BACK, 0)
                  SendMessage_(GadgetID(LNumber()\Editor_ln), #WM_KEYUP, #VK_BACK, 0)
                  SendMessage_(GadgetID(LNumber()\Editor_ln), #EM_SETREADONLY, 1, 0)
                EndIf
                ; --> Keep linenumbers in sync with EditorGadget scrolling up or down (dragging scroll thumb)
                SendMessage_(GadgetID(LNumber()\Editor_ed), #EM_GETSCROLLPOS, 0, @egOne.POINT)
                ; --> Keep numbers from scrolling left
                egOne\x = 0
                SendMessage_(GadgetID(LNumber()\Editor_ln), #EM_SETSCROLLPOS, 0, egOne)
                previousItems = egItems
            EndSelect
          EndIf
        EndIf
      Case #WM_CLOSE
        RemoveProp_(hWnd,"OriginProc")
    EndSelect
  EndIf
  ProcedureReturn CallWindowProc_(OriginProc,hWnd,Msg,wParam,lParam)
EndProcedure
ProcedureDLL TEditor_LN_SetState(Gadget.l,State.l)
  If State=#True
    ;{
    Find=#False
    ForEach LNumber()
      If LNumber()\Editor_ed=gadget
        Find=#True
        Break
      EndIf
    Next
    If Find=#False
      LastElement(LNumber())
      AddElement(LNumber())
      LNumber()\Editor_ed=gadget
      gadget_x=GadgetX(gadget)
      gadget_y=GadgetY(gadget)
      gadget_width=GadgetWidth(gadget)
      gadget_height=GadgetHeight(gadget)
    
      ResizeGadget(gadget,gadget_x+50,#PB_Ignore,gadget_width-50,#PB_Ignore)
      LNumber()\Container=ContainerGadget(#PB_Any, gadget_x, gadget_y, 50, gadget_height,#PB_Container_BorderLess)
      LNumber()\Editor_Ln=EditorGadget(#PB_Any, 0, 0, 50, gadget_height)
      SendMessage_(GadgetID(LNumber()\Editor_Ln),#EM_SHOWSCROLLBAR,#SB_VERT,#False)
      SendMessage_(GadgetID(LNumber()\Editor_Ln),#EM_SHOWSCROLLBAR,#SB_HORZ,#False)
      CloseGadgetList()
      ;{
      AddGadgetItem(LNumber()\Editor_Ln, -1, "1 ")
      SendMessage_(GadgetID(LNumber()\Editor_Ln), #EM_SETBKGNDCOLOR, 0, RGB(248, 248, 220))
      SendMessage_(GadgetID(LNumber()\Editor_Ln), #EM_SETREADONLY, 1, 0)
      
      SendMessage_(GadgetID(gadget), #EM_SETEVENTMASK, 0, #ENM_UPDATE | #ENM_CHANGE | #ENM_SCROLL | #ENM_KEYEVENTS)
      egFormat.CHARFORMAT
      egFormat\cbSize = SizeOf(CHARFORMAT)
      egFormat\dwMask =  #CFM_SIZE | #CFM_COLOR
      ;size=TEditor_GetFontSize(gadget)
      size=8
      egFormat\yHeight = size*20
      SendMessage_(GadgetID(LNumber()\Editor_Ln), #EM_SETCHARFORMAT, #SCF_ALL, @egFormat)
      SendMessage_(GadgetID(LNumber()\Editor_ed), #EM_GETSCROLLPOS, 0, @egOne.POINT)
        egOne\x = 0
        SendMessage_(GadgetID(LNumber()\Editor_ed), #EM_HIDESELECTION,#True,0)
          SetGadgetText(LNumber()\Editor_ed,GetGadgetText(LNumber()\Editor_ed))
        SendMessage_(GadgetID(LNumber()\Editor_ed), #EM_HIDESELECTION,#False,0)
      SendMessage_(GadgetID(LNumber()\Editor_ed), #EM_SETSCROLLPOS, 0, egOne)  
      
      ;}
      
      ;{ Mise à droite des colonnes
      egPara.PARAFORMAT2
      egPara\cbSize = SizeOf(PARAFORMAT2)
      egPara\dwMask = #PFM_ALIGNMENT
      egpara\wAlignment = #PFA_RIGHT
      SendMessage_(GadgetID(LNumber()\Editor_Ln), #EM_SETPARAFORMAT, #SCF_ALL, @egPara)
      ; récupère le texte de la sélection
      SendMessage_(GadgetID(LNumber()\Editor_Ln),#EM_GETSEL,@StartSel,@EndSel)
      Buffer$ = Space(EndSel-StartSel)
      SendMessage_(GadgetID(LNumber()\Editor_Ln),#EM_GETSELTEXT,0,@Buffer$)
      ; récupère la position des barres de scroll
      SendMessage_(GadgetID(LNumber()\Editor_Ln), #EM_GETSCROLLPOS, 0, @scrollP.POINT)
      SendMessage_(GadgetID(LNumber()\Editor_Ln),#EM_REPLACESEL,#True,@Buffer$)
      ; définit la position des barres de scroll
      SendMessage_(GadgetID(LNumber()\Editor_Ln), #EM_SETSCROLLPOS, 0, scrollP.POINT)
      ;}
      SendMessage_(GadgetID(LNumber()\Editor_ln),#EM_SETMARGINS,1|2, 0|(10<<16))
    EndIf
    ProcedureReturn  
    ;}
  Else
    ;{
    If IsGadget(gadget)
      Find=-1
      ForEach LNumber()
        If LNumber()\Editor_ed=gadget
          Find=ListIndex(LNumber())
          Break
        EndIf
      Next
      If Find>-1
        SelectElement(LNumber(),Find)
        Editor_ed=LNumber()\Editor_ed
        container=LNumber()\container
        Editor_ln=LNumber()\Editor_ln
        DeleteElement(LNumber(),1)
        
        size_container=GadgetWidth(container)
        ; libération des gadgets
        FreeGadget(Editor_ln)
        FreeGadget(container)
        ; redimensionnement de l'éditeur
        ResizeGadget(Editor_ed,GadgetX(Editor_ed)-size_container,#PB_Ignore,GadgetWidth(Editor_ed)+size_container,#PB_Ignore)
      EndIf
    EndIf
    ProcedureReturn 
    ;}
  EndIf
EndProcedure
ProcedureDLL TEditor_LN_Start(Window.l)
  OriginProc = SetWindowLong_(WindowID(Window), #GWL_WNDPROC, @TEditor_LN_Callback())
  SetProp_(WindowID(Window), "OriginProc", OriginProc)
EndProcedure
ProcedureDLL TEditor_Info()
  MessageRequester("", "Number:"+Str(CountList(LNumber())))
  For i=0 To CountList(LNumber())-1
    SelectElement(LNumber(),i)
    MessageRequester("",Str(ListIndex(LNumber()))+"-"+Str(LNumber()\editor_ln))
  Next
EndProcedure
;}
TEditor_Init()
If OpenWindow(0, 0, 0, 520, 440, "LibEditorPlus - Exemple > Numérotation des lignes", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) And CreateGadgetList(WindowID(0))
  ; Initialisation de la numerotation des lignes pour cette fenetre
  TEditor_LN_Start(0)
  ;{ Menus
  CreateMenu(1, WindowID(0))
  MenuTitle("EditorGadget")
    MenuItem(1, "Colonne > Fond"+Chr(9)+"F1")
    MenuItem(2, "Colonne > Texte"+Chr(9)+"F2")
    MenuItem(3, "Colonne > Taille +"+Chr(9)+"F3")
    MenuItem(4, "Colonne > Taille -"+Chr(9)+"F4")
    MenuItem(5, "Editeur > Fond"+Chr(9)+"F5")
    MenuItem(6, "Stop"+Chr(9)+"F6")
    MenuItem(7, "Commencer"+Chr(9)+"F7")
    MenuItem(8, "Infos"+Chr(9)+"F8")
    AddKeyboardShortcut(0,#PB_Shortcut_F1,1)
    AddKeyboardShortcut(0,#PB_Shortcut_F2,2)
    AddKeyboardShortcut(0,#PB_Shortcut_F3,3)
    AddKeyboardShortcut(0,#PB_Shortcut_F4,4)
    AddKeyboardShortcut(0,#PB_Shortcut_F5,5)
    AddKeyboardShortcut(0,#PB_Shortcut_F6,6)
    AddKeyboardShortcut(0,#PB_Shortcut_F7,7)
    AddKeyboardShortcut(0,#PB_Shortcut_F8,8)
  ;}
   
  ;{ EditorGadget
  PanelGadget(1000,0,0,250,400)
    AddGadgetItem(1000,-1,"WIP_0")
      EditorGadget(4,000,10,250,400)
      TEditor_LN_SetState(4,#True)
      TEditor_Info()
    AddGadgetItem(1000,-1,"WIP_1")
      Editor=EditorGadget(#PB_Any,000,10,250,400)
      TEditor_LN_SetState(Editor,#True)
      TEditor_Info()
  CloseGadgetList()
  For i=0 To 100
    AddGadgetItem(4,i,"Line"+Str(i))
    AddGadgetItem(Editor,i,"Line"+Str(i))
  Next
  ;}
  Repeat
    event = WaitWindowEvent()
    Select event
      Case #PB_Event_Menu
        Select EventMenu()
          Case 8
            TEditor_Info()
        EndSelect
    EndSelect
  
  Until event = #PB_Event_CloseWindow 
EndIf
End
Pas de pb lorsque l'on commente les lignes : 218-219-223 et 227.
Dernière modification par Progi1984 le mar. 29/août/2006 11:08, modifié 1 fois.
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

Quelqu'un pour m'aider ?
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

Code : Tout sélectionner

ProcedureDLL TEditor_LN_Start(Window.l) 
  OriginProc = SetWindowLong_(Window, #GWL_WNDPROC, @TEditor_LN_Callback()) 
  SetProp_(Window, "OriginProc", OriginProc) 
EndProcedure 
...
...
...

TEditor_LN_Start(GetParent_(GadgetID(Editor))) 
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

Comment pourrais je savoir si un gadget est contenu dans un item d'un panelgadget ?
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

t'auras peut être le même problème avec les scrollarea et container gadgets... à vérifier

Dri
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

Progi1984 a écrit :Comment pourrais je savoir si un gadget est contenu dans un item d'un panelgadget ?
J'ai vu que tu passes souvent l'id d'un gadget ou d'une fenêtre à une procédure au lieu de passer directement le handle. Alors évite de passer l'id et avec GetParent comme dans l'exemple que je donne tu ne devrais pas avoir de problème, sinon il te faut récupérer la classe.
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

Dans le cas de la numérotation des lignes, je vais faire cela afin d'éviter toute ambiguité... en le prouvant dans les exemples.

Merci nico et Dri.

[edit] Passage du sujet en résolu
Répondre