fdominguezs wrote:Probando
Adicionalmente como usar en este mismo ejemplo la clausula seek del tbuscador
Aqui tienes la ayuda que realice en su dia..
******************************************************************************
Documentacion de uso de la clase TBuscador
******************************************************************************
Tbuscador es una clase pensada en agilizar el tema de montaje de una lista
para seleccionar un elemento en concreto y devolver un valor.
A traves del fichero .\include\buscador.ch , tenemos a disposicion la clase
en base a comandos , siendo mas facil su manejo.
La clase puede funcionar de dos maneras distintas:
1.- Creacion/Activacion y espera retorno
2.- Creacion y posterior activacion, posibilitando la incrustacion de
controles , no contenidos en la clase.
Veremos a continuacion los comandos para aplicar las distintas formas de
operar.
1.- Creacion/Activacion y espera retorno
DEFINE BUSCADOR VAR <uBuscador> ;
[ ARRAY ] ;
[ TITLE <cTitle> ] ;
[ DBF <cDbfTxt> ] ;
[ DATABASE <oDbf> ];
[ <head:HEAD,HEADER,HEADERS> <aHeaders,...> ] ;
[ <field:FIELDSNAMES,FIELDS,COLUMNS> <aColumns,...> ] ;
[ <sizes:FIELDSIZES, SIZES, COLSIZES> <aColSizes,...> ] ;
[ RETURN <cField> ];
[ SIZE <nWidth>, <nHeight> ]
VAR <uBuscador>
Sera la variable que almacena el contenido del retorno.
ARRAY
Le indica que sera un array lo que vamos a tratar.
TITLE <cTitle>
El titulo del dialogo.
DBF <cDbfTxt>
Contiene que dbfs y indices tiene que abrir y los tabs que tiene
que montan.
DATABASE <oDbf>
Si pasamos un objeto database, este sera usado en vez de abrir la dbf
de <cDbfTxt>. Es util para hacer antes un filtro a la dbf, y pasarlo a
la clase, y veremos el browse ya filtrado.
De todas maneras, cuando pasamos <oDbf> , el contenido de <cDbfTxt>,
lo sigue teniendo en cuenta para montar los indices de busqueda,
ignorando el tener que abrir la dbf que se le indica.
HEADERS <aHeaders...,>
Cabecera del Browse. Internamente el paso de parametros sera convertido
a un array :
HEADERS "Codigo","Nombre", se transforma en { "Codigo","Nombre" }
COLUMNS <aColumns,...>
Columnas del browse. Aqui se permite 2 funcionamientos basados en dbf,
y uno en ARRAY.
* Columnas basadas en dbf:
1.- Paso de parametros del nombre de _ en texto.
COLUMNS "Codigo","Descri","Apel", sera transformado en { "campos"}
2.- Paso de paramentros en forma de codeblocks.
COLUMNS {||oDbf:Codigo},{||If(lState,"Hla","JJ")} , sera transforma-
do en { codeblocks }
No se permite, la mezcla de ambos, o texto o codeblock.
* Columnas basadas en arrays.
Cuando declaramos la clausula ARRAY, simplemente debemos pasarle el
array multidimensional como parametro.
COLUMNS aMiArray , donde mi array podria ser:
aMiArray := { { "Primer Campo", "Este es el primer" },;
{ "Segundo", "Seguro Segundo" } }
COLSIZES <aColsSizes,...>
Tamaño de las columnas expresado en numerico.
COLSIZES 40,50,100 , se transformara en una array: { 40,50,100 }
RETURN <cField>
Es el nombre del campo que queremos que retorne.
SIZE <nWidth>, <nHeight>
Si queremos expandir el ancho,alto del dialogo , de esta manera podemos
reservar espacio para poner says,bitmaps, buttons, etc...
El alto del browse es inamovible, el ancho se adaptara al tamaño del
dialogo, y los botones de aceptar/cancelar, se adaptaran al alto pasado,
consiguiendo con esto una proporcion coherente.
La segunda opcion nos brinda mas potencia de controlar el Buscador.
2.- Creacion y posterior activacion, posibilitando la incrustacion de
controles , no contenidos en la clase.
Para la creacion y activacion se usa la misma estructura que lo
anterior, con la unica diferencia:
DEFINE BUSCADOR <oBuscador> , donde antes era:
DEFINE BUSCADOR VAR <uBuscador>
La diferencia es que desde aqui nos devuelve el objeto, y antes nos
devolvia el valor de retorno.
¿ Y donde recojo el valor de retorno ? Muy facil, en la activacion.
ACTIVATE BUSCADOR <oBuscador> VAR <cReturn> ;
[ SIZE <nWidth>, <nHeight> ]
oBuscador es el objeto en cuestion que queremos activar.
VAR <cReturn>
cReturn contendra el valor de retorno.
SIZE <nWidth>, <nHeight>
Desde aqui tambien podemos definir el tamaño, y este ultimo es el
que tendra preferencia.