It is currently Thu May 24, 2018 3:35 pm

All times are UTC




 Page 1 of 1 [ 5 posts ] 
Author Message
 Post subject: Autocompletar en controles
PostPosted: Thu Dec 10, 2015 6:27 pm 

Joined: Thu Feb 16, 2012 1:41 am
Posts: 34
Hola,

Es posible utilizar COMPLETION en controles como por ejemplo DEFINE COMBOBOX CLIPPER o DEFINE COMBOBOX ENTRY

Si es posible me ayudan por favor cómo podría implementar.

Gracias.

Saludos,
Javier


Offline
 Profile Send private message  
 
 Post subject: Re: Autocompletar en controles
PostPosted: Fri Dec 11, 2015 4:42 am 

Joined: Thu Dec 30, 2010 12:18 am
Posts: 91
Hola Javier,

Anexo el ejemplo combomodel.prg modificado para usar autocompletado.

Básicamente para implementar el autocompletado en el gtkcomboboxentry es obtener el gtkentry, crear el modelo de datos para el autocompletado y asignarlo a ese gtkentry.

Para este caso, se requiere modificar el codigo de la clase gEntryCompletion, en el ejemplo se incluye una clase "gCompletion" con la modificación necesaria (ya incorporaré la modificación en el repositorio).

/* Ejemplo de Combobox con un modelo de datos TreeStore y ComboboxEntry.
   (c)2006 Rafa Carmona
   TODO: Se esta trabajando en ello.
  */

#include "gclass.ch"

#define GtkTreeIter  Array( 4 )

Function Main()

  local oWnd, oLbx, oBox, cVar , oCombo, oCombo3, cVar3
  local oCombo2, cVar2 := "ARA", aItems := { "1-Value","2-Dos","3-Well..." }
  Local oComboChange, cVarChange, oEntry

  DEFINE WINDOW oWnd TITLE "T-Gtk Combobox TreeStore power!!"
     
   DEFINE BOX oBox VERTICAL SPACING 8 OF oWnd
     DEFINE LABEL PROMPT "Ups! Combobox with Data Model"  OF oBox EXPAND FILL   
     
     /*Modelo de Datos */
     oLbx := Create_Model()
     
     DEFINE COMBOBOX oCombo VAR cVar ;
            MODEL oLbx ;
            OF oBox  ;
            ON CHANGE ( CambioArray( oComboChange ) )
                     
     DEFINE COMBOBOX ENTRY oCombo2  ;
                 VAR cVar2 ;
                 MODEL oLbx ;
                 OF oBox
                 // ITEMS aItems OF oBox
     
     DEFINE COMBOBOX ENTRY oCombo3  ;
                 VAR cVar3 ;
                 ITEMS aItems OF oBox
     /* Autocompletado en comboboxentry */
     Completion( oCombo3 )
     
     
     DEFINE BUTTON oCombo TEXT "VALUE VARIABLE COMBOBOX" ;
            ACTION MsgInfo( "Model: "+ cVar + CRLF +;
                            "Combo_entry:" + cVar2 + CRLF +;
                            "Combo 3 := "  + cVar3  ) OF oBox
     
     DEFINE COMBOBOX oComboChange VAR cVarChange ;
            ITEMS {""} ;
            OF oBox 

     
   ACTIVATE WINDOW oWnd CENTER
 
RETURN NIL         

STATIC FUNCTION Create_Model()
  local oLbx
  local aParent , aChild , aIter
  local x,j, y
  Local aProvincias := { { "Barcelona", "Girona", "Lleida", "Tarragona" },;
                         { "Castellon","Valencia", "Alicante" },;
                         { "Madrid" },;
                         { "A coruña", "Lugo", "Orense", "Pontevedra" } }
  Local aComunidad := { "Cataluña", "Valencia", "Madrid", "Galicia" }
  Local aPueblos := { "Bigues i Riells", "Sta.Perpetua de la moguda", "Sant Feliu de Codines" }

  DEFINE TREE_STORE oLbx TYPES G_TYPE_STRING
 
  For x := 1 To Len( aComunidad )
       APPEND TREE_STORE oLbx ITER aParent VALUES UTF_8( aComunidad[x] )
       For j := 1 To Len( aProvincias[x] )
          APPEND TREE_STORE oLbx PARENT aParent ;
                 ITER aChild ;
                 VALUES UTF_8( aProvincias[x,j] )
         
          if x = 1 .and. j = 1 // Solamente para Barcelona
             For y := 1 To Len( aPueblos )
                  APPEND TREE_STORE oLbx PARENT aChild ;
                         ITER aIter ;
                         VALUES UTF_8( aPueblos[y] )
             Next
          Endif   
       Next
  Next

 Return oLbx

 STATIC FUNCTION CAMBIOARRAY( oCombo )
     Local aArray1 := { "1","2","3" }
     Local aArray2 := { "4","5","6" }
     Local aArray3 := { "1","2","3", "4","5","6" }

     STATIC nCount := 0

     oCombo:RemoveAll()
     
     nCount++
     if nCount > 3
        nCount := 1
     endif
   
     if nCount = 1
        oCombo:SetItems( aArray1 )
     endif
     
     if nCount = 2
        oCombo:SetItems( aArray2 )
     endif
     
     if nCount = 3
        oCombo:SetItems( aArray3 )
     endif

RETURN NIL


/*
 Creamos un autocompletado a traves de un simple array
*/
function Completion( oEntry, aCompletion )
    Local oLbx, x, n, oCompletion
    Local nLen, cItem

    default aCompletion := { "China", "India", "Estados Unidos", "Indonesia", "Brasil", "Pakistan",;
                             "Bangladesh", "Rusia", "Nigeria", "Japón" }

    nLen := Len( aCompletion )


    /*Modelo de Datos */
    DEFINE LIST_STORE oLbx TYPES G_TYPE_STRING

    FOR EACH cItem IN aCompletion
        INSERT LIST_STORE oLbx ROW cItem:__EnumIndex() VALUES cItem
    Next

    oCompletion := gCompletion():New( oEntry, oLbx, 1 )

RETURN nil



/*
 * Clase para la creación de autocompletado
 */
#include "gtkapi.ch"
#include "hbclass.ch"

CLASS GCOMPLETION FROM GOBJECT
      DATA bSelected     
      DATA oEntry
      DATA oModel
      DATA nColumn
     
      METHOD New( oEntry, oModel, nColum )
      METHOD OnMatch_Selected ( oSender, pTreeModel, aIter )  SETGET
     
ENDCLASS

METHOD New( oEntry, oModel, nColumn ) CLASS GCOMPLETION
 LOCAL pEntry
 DEFAULT nColumn := 1
   
 if oEntry:IsDerivedFrom("GCOMBOBOXENTRY")
    pEntry := tgtk_get_widget_combo_entry( oEntry:pWidget )
 else
    pEntry := oEntry:pWidget
 endif

 ::pWidget := gtk_entry_completion_new()
 ::oEntry  := oEntry
 ::oModel  := oModel

 if !Empty( oEntry )
    gtk_entry_set_completion( pEntry, ::pWidget )
 endif
   
 g_object_unref( ::pWidget )
 
 if !Empty( oModel )
    gtk_entry_completion_set_model( ::pWidget, oModel:pWidget )
    g_object_unref ( oModel:pWidget )
    /* Use model column 0 as the text column */
    gtk_entry_completion_set_text_column( ::pWidget, nColumn -1 )
 endif
 
RETURN Self     


METHOD OnMatch_Selected ( uParam, pTreeModel, aIter )
   Local uResult := .F.
   
   if hb_IsBlock( uParam )
      ::bSelected = uParam
      ::Connect( "match-selected" )
   elseif hb_IsObject( uParam )
      if hb_IsBlock( ::bSelected )
         uResult := Eval( uParam:bSelected, Self, pTreeModel, aIter )
      endif
   endif

RETURN uResult



Saludos!


Offline
 Profile Send private message  
 
 Post subject: Re: Autocompletar en controles
PostPosted: Fri Dec 11, 2015 4:40 pm 

Joined: Thu Feb 16, 2012 1:41 am
Posts: 34
Hola Riztan,

Modificando el prg tal como me lo indicas, compila y ejecuta, pero al obtener el foco el control y escribir el programa se cuelga y genera un log de error, yo no tengo ni idea que puede ser, te lo adjunto a ver si tu puedes ver algo. (Windows 10 64 bits)
javier wrote:
Application Internal Error - C:\t-gtk\tests\gclass\combobox\test.exe
Terminated at: 2015.12.11 10:34:42
Unrecoverable error 6005: Exception error:

Exception Code:C0000005
Exception Address:7434932E
EAX:047183A8 EBX:04718331 ECX:00000000 EDX:00000000
ESI:00000004 EDI:00000000 EBP:007AF808
CS:EIP:0023:7434932E SS:ESP:002B:007AF7FC
DS:002B ES:002B FS:0053 GS:002B
Flags:00010202
CS:EIP: 3A 19 75 0E 40 42 41 3B D6 72 EF 33 C0 5F 5B 5E
SS:ESP: 047183AD 047183A8 00000000 007AF868 617EB075 047183A8 00000000 00000004 007AF84C FFFFFFFF 00000010 00000000 02D7E9F8 00000000 00000000 02DB0088

C stack:
EIP: EBP: Frame: OldEBP, RetAddr, Params...
7434932E 007AF808 007AF868 617EB075 047183A8 00000000 00000004 007AF84C FFFFFFFF 00000010 00000000 02D7E9F8
617EB075 007AF868 007AF8B8 6193DED0 02DAB398 007AF8F0 02DB0018 00000010 0084089C 00000002 00000000 00000002
6193DED0 007AF8B8 007AF938 61942446 02DB0088 04705690 00000000 00000000 007AF918 74307A0B 74307D70 2768027C
61942446 007AF938 007AF958 619427D6 02DAB398 04725288 007AF9B0 02DB0088 04725288 02DAB398
619427D6 007AF958 007AF998 6193C6AD 02DAB398 04725288 007AF9B0 02DB0088 00000000 00000000 00000000 00000000
6193C6AD 007AF998 007AF9D8 6193D7A9 619427B0 02DB0088 04725288 007AF9F8 FD06FF36 02D77860 00000000 00000000
6193D7A9 007AF9D8 007AF9F8 61941D32 02DAB398 619427B0 02DB0088 7431D1F0 53247A04 02DB0018
61941D32 007AF9F8 007AFA28 617EC52D 02DB0088 00000000 00000002 617E9A70 02D9AD28 00000000 000000B1 02DB0028
617EC52D 007AFA28 007AFA78 617E45B4 02DB0018 FFFFFFFF 007AFA68 685E877E 686AC18C 000526A1 000F4240 00000000
617E45B4 007AFA78 007AFAA8 6C34137C 02DB0018 00000001 007AFA98 6860EEA7 00000000 02D17E18 007AFAC8 686591D8
6C34137C 007AFAA8 007AFAC8 685EC99A 02DA76C0 0002B3EE 000003E8 00000000 02D4D1C8 65C419DC
685EC99A 007AFAC8 007AFB48 685EB663 02D4D1C8 6C341334 02DA76C0 007AFB2C 65C419DC 00000001 007AFB08 65C419EF
685EB663 007AFB48 007AFBC8 685EBE09 02D17E18 00000000 04711238 00000002 00000002 02D17E18 007AFB88 65C419EF
685EBE09 007AFBC8 007AFBF8 685EC299 04711270 00000001 007AFBF8 685E7D6D 0000000C 00000000 00000004 00859D4C
685EC299 007AFBF8 007AFC58 618591C4 04711268 04711268 61A09714 00000000 00000000 00000000 007AFC38 04711268
618591C4 007AFC58 007AFC68 004082A3 005457F0 00858424
004082A3 007AFC68 007AFC9C 0045FFF4 00000000 005457F0 007AFC9C 005561D3 00859DCC 00000000 00000001 0043F4BC


Modules:
0x00400000 0x001AA000 C:\t-gtk\tests\gclass\combobox\test.exe
0x77570000 0x0017B000 C:\WINDOWS\SYSTEM32\ntdll.dll
0x744D0000 0x000E0000 C:\WINDOWS\SYSTEM32\KERNEL32.DLL
0x74FB0000 0x0017E000 C:\WINDOWS\SYSTEM32\KERNELBASE.dll
0x74C50000 0x0007B000 C:\WINDOWS\SYSTEM32\ADVAPI32.DLL
0x742C0000 0x000BE000 C:\WINDOWS\SYSTEM32\msvcrt.dll
0x74D00000 0x00044000 C:\WINDOWS\SYSTEM32\sechost.dll
0x75610000 0x000AD000 C:\WINDOWS\SYSTEM32\RPCRT4.dll
0x742A0000 0x0001E000 C:\WINDOWS\SYSTEM32\SspiCli.dll
0x74290000 0x0000A000 C:\WINDOWS\SYSTEM32\CRYPTBASE.dll
0x74E40000 0x00058000 C:\WINDOWS\SYSTEM32\bcryptPrimitives.dll
0x76EC0000 0x0014F000 C:\WINDOWS\SYSTEM32\GDI32.dll
0x74380000 0x00147000 C:\WINDOWS\SYSTEM32\USER32.dll
0x6C340000 0x000B1000 c:\t-gtk\MinGW\bin\libgdk-win32-2.0-0.dll
0x74CD0000 0x0002B000 C:\WINDOWS\SYSTEM32\IMM32.DLL
0x773A0000 0x000EB000 C:\WINDOWS\SYSTEM32\OLE32.dll
0x758F0000 0x001BD000 C:\WINDOWS\SYSTEM32\combase.dll
0x75AB0000 0x013FF000 C:\WINDOWS\SYSTEM32\SHELL32.DLL
0x757B0000 0x00037000 C:\WINDOWS\SYSTEM32\cfgmgr32.dll
0x74750000 0x004F9000 C:\WINDOWS\SYSTEM32\windows.storage.dll
0x755A0000 0x00045000 C:\WINDOWS\SYSTEM32\shlwapi.dll
0x757F0000 0x0000C000 C:\WINDOWS\SYSTEM32\kernel.appcore.dll
0x75800000 0x0008D000 C:\WINDOWS\SYSTEM32\shcore.dll
0x75760000 0x00044000 C:\WINDOWS\SYSTEM32\powrprof.dll
0x77500000 0x0000F000 C:\WINDOWS\SYSTEM32\profapi.dll
0x6B0C0000 0x00019000 c:\t-gtk\MinGW\bin\libglade-2.0-0.dll
0x65340000 0x00037000 c:\t-gtk\MinGW\bin\libgdk_pixbuf-2.0-0.dll
0x685C0000 0x00106000 c:\t-gtk\MinGW\bin\libglib-2.0-0.dll
0x75130000 0x0005F000 C:\WINDOWS\SYSTEM32\WS2_32.dll
0x63A40000 0x00045000 c:\t-gtk\MinGW\bin\libgobject-2.0-0.dll
0x61780000 0x003BB000 c:\t-gtk\MinGW\bin\libgtk-win32-2.0-0.dll
0x74EA0000 0x000F2000 C:\WINDOWS\SYSTEM32\COMDLG32.DLL
0x65580000 0x00042000 c:\t-gtk\MinGW\bin\libpango-1.0-0.dll
0x77340000 0x0005E000 C:\WINDOWS\SYSTEM32\FirewallAPI.dll
0x755F0000 0x00013000 C:\WINDOWS\SYSTEM32\NETAPI32.dll
0x6A300000 0x00023000 c:\t-gtk\MinGW\bin\intl.dll
0x6D580000 0x000D1000 c:\t-gtk\MinGW\bin\libgio-2.0-0.dll
0x6D4C0000 0x00013000 c:\t-gtk\MinGW\bin\libpangocairo-1.0-0.dll
0x62940000 0x00020000 c:\t-gtk\MinGW\bin\libatk-1.0-0.dll
0x68DC0000 0x000F7000 c:\t-gtk\MinGW\bin\libcairo-2.dll
0x6DD00000 0x0000D000 c:\t-gtk\MinGW\bin\libgmodule-2.0-0.dll
0x70F40000 0x00112000 c:\t-gtk\MinGW\bin\libxml2-2.dll
0x72C90000 0x0016B000 C:\WINDOWS\WinSxS\x86_microsoft.windows.gdiplus_6595b64144ccf1df_1.1.10586.20_none_22adb5eaa762c7fa\gdiplus.dll
0x007F0000 0x0003C000 c:\t-gtk\MinGW\bin\libpng14-14.dll
0x65C40000 0x0000E000 c:\t-gtk\MinGW\bin\libgthread-2.0-0.dll
0x5EAB0000 0x00092000 C:\WINDOWS\WinSxS\x86_microsoft.windows.common-controls_6595b64144ccf1df_5.82.10586.0_none_811bc0006c44242b\COMCTL32.DLL
0x6B280000 0x00016000 c:\t-gtk\MinGW\bin\libpangowin32-1.0-0.dll
0x73E60000 0x00067000 C:\WINDOWS\SYSTEM32\WINSPOOL.DRV
0x714B0000 0x00084000 C:\WINDOWS\SYSTEM32\DNSAPI.DLL
0x774E0000 0x00007000 C:\WINDOWS\SYSTEM32\NSI.dll
0x6D700000 0x000E3000 c:\t-gtk\MinGW\bin\libpangoft2-1.0-0.dll
0x64F80000 0x00042000 c:\t-gtk\MinGW\bin\libfontconfig-1.dll
0x6A800000 0x00079000 c:\t-gtk\MinGW\bin\freetype6.dll
0x73080000 0x00006000 C:\WINDOWS\SYSTEM32\MSIMG32.DLL
0x62E80000 0x0001B000 c:\t-gtk\MinGW\bin\zlib1.dll
0x6F730000 0x00016000 C:\WINDOWS\SYSTEM32\USP10.DLL
0x73E40000 0x0001B000 C:\WINDOWS\SYSTEM32\bcrypt.dll
0x68F40000 0x0002D000 c:\t-gtk\MinGW\bin\libexpat-1.dll
0x72E00000 0x0000B000 C:\WINDOWS\SYSTEM32\DAVHLPR.DLL
0x73620000 0x0002C000 C:\WINDOWS\SYSTEM32\fwbase.dll
0x73650000 0x00075000 C:\WINDOWS\system32\uxtheme.dll
0x770B0000 0x0011F000 C:\WINDOWS\SYSTEM32\MSCTF.dll
0x62D40000 0x00014000 c:\t-gtk\MinGW\lib\gtk-2.0\2.10.0\engines\libwimp.dll
0x73090000 0x0001D000 C:\WINDOWS\system32\dwmapi.dll
0x02FD0000 0x0007F000 C:\WINDOWS\SYSTEM32\mscms.dll
0x6F890000 0x00019000 C:\WINDOWS\SYSTEM32\USERENV.dll
0x5F060000 0x0003C000 C:\WINDOWS\SYSTEM32\icm32.dll

Called from GTK_MAIN(0)
Called from GWINDOW:ACTIVATE(165) in gwindow.prg
Called from MAIN(53) in combomodel.prg
------------------------------------------------------------------------

Gracias.

Saludos,
Javier


Offline
 Profile Send private message  
 
 Post subject: Re: Autocompletar en controles
PostPosted: Sat Dec 12, 2015 12:14 am 

Joined: Thu Dec 30, 2010 12:18 am
Posts: 91
Ups!, si. No hice pruebas en Windows.

Efectivamente me provocó error en Windows. Luego de revisar un poco más, observé que el comboboxentry contiene el entry como DATA. Por lo que hice lo siguiente y funcionó bastante bien:

/* Ejemplo de Combobox con un modelo de datos TreeStore y ComboboxEntry.
   (c)2006 Rafa Carmona
   TODO: Se esta trabajando en ello.
  */

#include "gclass.ch"

#define GtkTreeIter  Array( 4 )

Function Main()

  local oWnd, oLbx, oBox, cVar , oCombo, oCombo3, cVar3
  local oCombo2, cVar2 := "ARA", aItems := { "1-Value","2-Dos","3-Well..." }
  Local oComboChange, cVarChange

  DEFINE WINDOW oWnd TITLE "T-Gtk Combobox TreeStore power!!"
     
   DEFINE BOX oBox VERTICAL SPACING 8 OF oWnd


     DEFINE LABEL PROMPT "Ups! Combobox with Data Model"  OF oBox EXPAND FILL   
     
     
     oLbx := Create_Model()
     
     DEFINE COMBOBOX oCombo VAR cVar ;
            MODEL oLbx ;
            OF oBox  ;
            ON CHANGE ( CambioArray( oComboChange ) )
                     
     DEFINE COMBOBOX ENTRY oCombo2  ;
                 VAR cVar2 ;
                 MODEL oLbx ;
                 OF oBox
                 // ITEMS aItems OF oBox
     
     DEFINE COMBOBOX ENTRY oCombo3  ;
                 VAR cVar3 ;
                 ITEMS aItems OF oBox
     oCombo3:oEntry:Create_Completion( aItems )
     
     
     DEFINE BUTTON oCombo TEXT "VALUE VARIABLE COMBOBOX" ;
            ACTION MsgInfo( "Model: "+ cVar + CRLF +;
                            "Combo_entry:" + cVar2 + CRLF +;
                            "Combo 3 := "  + cVar3  ) OF oBox
     
     DEFINE COMBOBOX oComboChange VAR cVarChange ;
            ITEMS {""} ;
            OF oBox

     
   ACTIVATE WINDOW oWnd CENTER
 
RETURN NIL         

STATIC FUNCTION Create_Model()
  local oLbx
  local aParent , aChild , aIter
  local x,j, y
  Local aProvincias := { { "Barcelona", "Girona", "Lleida", "Tarragona" },;
                         { "Castellon","Valencia", "Alicante" },;
                         { "Madrid" },;
                         { "A coruña", "Lugo", "Orense", "Pontevedra" } }
  Local aComunidad := { "Cataluña", "Valencia", "Madrid", "Galicia" }
  Local aPueblos := { "Bigues i Riells", "Sta.Perpetua de la moguda", "Sant Feliu de Codines" }

  DEFINE TREE_STORE oLbx TYPES G_TYPE_STRING
 
  For x := 1 To Len( aComunidad )
       APPEND TREE_STORE oLbx ITER aParent VALUES UTF_8( aComunidad[x] )
       For j := 1 To Len( aProvincias[x] )
          APPEND TREE_STORE oLbx PARENT aParent ;
                 ITER aChild ;
                 VALUES UTF_8( aProvincias[x,j] )
         
          if x = 1 .and. j = 1 // Solamente para Barcelona
             For y := 1 To Len( aPueblos )
                  APPEND TREE_STORE oLbx PARENT aChild ;
                         ITER aIter ;
                         VALUES UTF_8( aPueblos[y] )
             Next
          Endif   
       Next
  Next

 Return oLbx

 STATIC FUNCTION CAMBIOARRAY( oCombo )
     Local aArray1 := { "1","2","3" }
     Local aArray2 := { "4","5","6" }
     Local aArray3 := { "1","2","3", "4","5","6" }

     STATIC nCount := 0

     oCombo:RemoveAll()
     
     nCount++
     if nCount > 3
        nCount := 1
     endif
   
     if nCount = 1
        oCombo:SetItems( aArray1 )
     endif
     
     if nCount = 2
        oCombo:SetItems( aArray2 )
     endif
     
     if nCount = 3
        oCombo:SetItems( aArray3 )
     endif

RETURN NIL



Offline
 Profile Send private message  
 
 Post subject: Re: Autocompletar en controles
PostPosted: Tue Dec 15, 2015 8:13 pm 

Joined: Thu Feb 16, 2012 1:41 am
Posts: 34
Hola Riztan,

Con este cambio funciona bien.

Gracias.

Saludos,
Javier


Offline
 Profile Send private message  
 
Display posts from previous:  Sort by  
 Page 1 of 1 [ 5 posts ] 

All times are UTC


Who is online

Users browsing this forum: No registered users and 1 guest


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  

cron