Page 1 sur 1

Concept pour LibEditorPlus : AutoCompletion

Publié : dim. 03/avr./2005 22:32
par Progi1984
Voilà, je souhaiteraisa ajouter cette fonctionnalité à ma librairie LibEditorPlus mais je ne vois pas comment faire donc si quelques uns avait l'idée de m'aider par des idées, des bouts de codes, des axes à suivre, cela m'aiderait ! Merci !

PS : A toutes les améliorations que l'on m'a demandé, elles seront terminées bientot ! Enfin j'espère !

Re: Concept pour LibEditorPlus : AutoCompletion

Publié : lun. 04/avr./2005 17:24
par Oliv
Progi1984 a écrit :Voilà, je souhaiteraisa ajouter cette fonctionnalité à ma librairie LibEditorPlus mais je ne vois pas comment faire donc si quelques uns avait l'idée de m'aider par des idées, des bouts de codes, des axes à suivre, cela m'aiderait ! Merci !

PS : A toutes les améliorations que l'on m'a demandé, elles seront terminées bientot ! Enfin j'espère !
Les sources de JaPBe

Publié : lun. 04/avr./2005 18:34
par Progi1984
JaPBe est basé sur la DLL de Scintilla que j'essaie de reproduire car je n'arrive pas du tout à l'utiliser !

Publié : lun. 04/avr./2005 19:31
par Oliv
Progi1984 a écrit :JaPBe est basé sur la DLL de Scintilla que j'essaie de reproduire car je n'arrive pas du tout à l'utiliser !
arf ok dsl :oops:

Publié : lun. 04/avr./2005 21:01
par Progi1984
Pas grave mais j'attends vos idées...

Publié : lun. 04/avr./2005 22:09
par Backup
c'est pas tres dur !

tu tiens a jour une liste de nom de fonction (par exemple)

puis a chaque frappe de l'utilisateur (a chaque charactere entré)

tu compare le mot en cours d'ecriture avec chacun des mot de la liste (celle qui contien les fonction d'un basic par exemple ! )

par comparaison , j'entend que tu regarde si ce que le gars viens d'entrer (le mot en cour d'ecriture )
correspond au 2 ,3,ou 4 premiere lettre de chaque mot de la liste
si tu as une correspondance , tu affiche ce mot (celui de la liste)
en lieu et place de celui que le gars tappe !
en te referent a l'espace precedent, pour le depart !!

enfin moi je ferai comme ça !

:D

Publié : lun. 04/avr./2005 22:46
par Progi1984
Je vais essayer un truc avec une ComboxGadget, genre à la VisualBasic ou à la Scintilla ! Vé faire un petit test !
Mais n'hésitez pas à poster ! cela sert toujours à tout le monde le brainstorming !

Publié : mar. 05/avr./2005 0:33
par Guimauve
Récupéré sur code archive dans la section other/OOP

Ça fait ce que tu veux faire je pense.

A+
Guimauve

Code : Tout sélectionner

; English forum: http://purebasic.myforums.net/viewtopic.php?t=8048&highlight=
; Author: Justin
; Date: 25. October 2003


;Autocomplete object
;Justin 10/03

; Just to play a little with the new functions. An object that makes an autocomplete
; in an editbox / listbox. It's a working example, note that you have to use setsel()
; if the selected listbox index changes outside the object, i did this to improve the
; speed, rather than checking the selected index for every edit change inside the object.
; Only for windows.

Interface IPBAutoComplete
  FindStr(str$)
  SetEdit(id)
  SetListBox(id)
  SetSel(isel)
EndInterface

Structure PBAutoCompleteFunctions
  FindStr.l
  SetEdit.l
  SetListBox.l
  SetSel.l
EndStructure

Structure OPBAutoComplete
  *VTable.PBAutoCompleteFunctions
  hwndedit.l
  hwndlistbox.l
  idedit.l
  idlistbox.l
  iselected.l
EndStructure

;finds and select the passed string
Procedure FindStr(*Object.OPBAutoComplete,str$)
  hwndlistbox=*Object\hwndlistbox
  istr=SendMessage_(hwndlistbox,#LB_FINDSTRING,-1,str$)
  If istr<>-1
    ;skip if item is selected
    If *Object\iselected=istr : ProcedureReturn : EndIf
    textlen=Len(str$)
    
    newtextlen=SendMessage_(hwndlistbox,#LB_GETTEXTLEN,istr,0)
    seltextlen=newtextlen-textlen
    
    ;select
    SendMessage_(hwndlistbox,#LB_SETCURSEL,istr,0)
    ;set edit text
    SetGadgetText(*Object\idedit,GetGadgetItemText(*Object\idlistbox,istr,-1))
    ;set selected text
    SendMessage_(*Object\hwndedit,#EM_SETSEL,textlen,newtextlen)
    
    ;update index
    *Object\iselected=istr
  EndIf
EndProcedure

;sets the editbox for this object
;id : editbox id
Procedure SetEdit(*Object.OPBAutoComplete,id)
  *Object\idedit=id
  *Object\hwndedit=GadgetID(id)
EndProcedure

;sets the listbox for this object
;id : listbox id
Procedure SetListBox(*Object.OPBAutoComplete,id)
  *Object\idlistbox=id
  *Object\hwndlistbox=GadgetID(id)
EndProcedure

;sets the selected listbox index
;iselected : index of selected item
;you are responsable to update this index every time it changes
;-1 = no selection
Procedure SetSel(*Object.OPBAutoComplete,iselected)
  *Object\iselected=iselected
EndProcedure

PBAutoCompleteFunctions.PBAutoCompleteFunctions\FindStr=@FindStr()
PBAutoCompleteFunctions.PBAutoCompleteFunctions\SetEdit=@SetEdit()
PBAutoCompleteFunctions.PBAutoCompleteFunctions\SetListBox=@SetListBox()
PBAutoCompleteFunctions.PBAutoCompleteFunctions\SetSel=@SetSel()

OPBAutoComplete.OPBAutoComplete\VTable=PBAutoCompleteFunctions

;-----------------------------------------------------------------
;CODE

;GADGET IDs
#String0=0
#ListView1=1

;WINDOW ID
#Window1=0

;WINDOW
OpenWindow(#Window1,150,70,550,350,#PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget|#PB_Window_SizeGadget|#PB_Window_TitleBar,"Auto Complete")
CreateGadgetList(WindowID(#Window1))

StringGadget(#String0,10,8,310,24,"")
ListViewGadget(#ListView1,11,49,308,262)

AddGadgetItem(#ListView1,-1,"Red")
AddGadgetItem(#ListView1,-1,"Green")
AddGadgetItem(#ListView1,-1,"Blue")
AddGadgetItem(#ListView1,-1,"Yellow")
AddGadgetItem(#ListView1,-1,"Black")
AddGadgetItem(#ListView1,-1,"White")
AddGadgetItem(#ListView1,-1,"Pink")
AddGadgetItem(#ListView1,-1,"Purple")
AddGadgetItem(#ListView1,-1,"Gray")
AddGadgetItem(#ListView1,-1,"Orange")

ActivateGadget(#String0)

;create object
OAutoCP.IPBAutoComplete=@OPBAutoComplete

;init object
OAutoCP\SetEdit(#String0)
OAutoCP\SetListBox(#ListView1)
OAutoCP\SetSel(-1) ;no items selected

;EVENT LOOP
Repeat
  EvID=WaitWindowEvent()
  Select EvID
  Case #PB_Event_Gadget
    Select EventGadgetID()
    Case #String0
      Select EventType()
      Case #PB_EventType_Change
        str$=GetGadgetText(#String0)
        OAutoCP\FindStr(str$)
      EndSelect
      
    Case #ListView1 ;important to update selected index in object
      isel=GetGadgetState(#ListView1)
      ;update selected index
      OAutoCP\SetSel(isel)
      ;set selected in edit
      str$=GetGadgetItemText(#ListView1,isel,-1)
      SetGadgetText(#String0,str$)
    EndSelect
  EndSelect
Until EvID=#PB_EventCloseWindow

Publié : mar. 05/avr./2005 5:54
par Progi1984
Génial, je vais essayer de mélanger avec une ComboGagdetText quand j'aurais réussi à le faire dans une EditorGadget !
Merci encore ! C'est génial !

Publié : mar. 05/avr./2005 5:56
par Progi1984
Mais quelqu'un aurait il des informations sur l'objet : OAutoCP.IPBAutoComplete=@OPBAutoComplete ?