Mas de Novato.
-
- Posts: 28
- Joined: Wed Dec 13, 2006 6:07 pm
Mas de Novato.
Hola a todos. Siguiendo con mi aprendizaje me surgen las siguientes dudas que os comento para ver si alguna alama caritativa me pone el el camino.
Estoy con un mantenimiento de clientes sobre un fold. cada vez que me muevo por un grid de la primera pestaña, podría pulsar la segunda pestaña y editar el registro. Bien. Como puedo refrescar _ de las pestañas, ya que siempre tengo el primer registro lo he probado con ON CHANGE de LISTBOX pero nada.
Me puede alguien facilitar un ejemplo de como funciona tbtnbmp, creo haber leido que se usa para habilitar y deshabilitar botones.
Muchas gracias de antemano
Estoy con un mantenimiento de clientes sobre un fold. cada vez que me muevo por un grid de la primera pestaña, podría pulsar la segunda pestaña y editar el registro. Bien. Como puedo refrescar _ de las pestañas, ya que siempre tengo el primer registro lo he probado con ON CHANGE de LISTBOX pero nada.
Me puede alguien facilitar un ejemplo de como funciona tbtnbmp, creo haber leido que se usa para habilitar y deshabilitar botones.
Muchas gracias de antemano
Hola,
1.- Si te refieres a refrescar los datos del mismo registro una vez editado el campo haz objeto:DrawSelect()
2.- .\samples\tutor12.prg
Debes de probasr todos los ejemplos de samples. Ahi lo tienes practicamente todo
1.- Si te refieres a refrescar los datos del mismo registro una vez editado el campo haz objeto:DrawSelect()
2.- .\samples\tutor12.prg
Debes de probasr todos los ejemplos de samples. Ahi lo tienes practicamente todo
Salutacions, saludos, regards
"...programar es fácil, hacer programas es difícil..."
https://modharbour.app
https://modharbour.app/compass
https://forum.modharbour.app
"...programar es fácil, hacer programas es difícil..."
https://modharbour.app
https://modharbour.app/compass
https://forum.modharbour.app
- Antonio Linares
- Site Admin
- Posts: 37481
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Contact:
-
- Posts: 28
- Joined: Wed Dec 13, 2006 6:07 pm
Fuente y preguntas
Antonio:
Necesitos estas respuestas si eres tan amable.
Preguntillas:
1 Existen 2 botones (grabar y cancelar) que quiero que se vean pero desactivados, ya que cuando se cambie algun campo se activarán entonces. He leido que se usa con tbtnbmp pero no se como trabajarlo, no se si hay ejemplos.
2 Cada vez que arranco la aplicación Indexo, Con el fin de no reindexar siempre ¿como abro un fichero de indices (si existe) y uso los indices. Lo he intentado pero cuando cambio de indice me dice que no existe.
3 La edición que comento, segun me comenta Carles con el ejemplo, claro! es desde un botón pero yo quiero que sea automático, esto es conforme me muevo en el grid, puedo ir a la pestaña donde está la ficha y editar.
4 Al arrancar la aplicación ¿como mando el foco al Grid?.
5 Se puede deshabilitar/habilitar pestañas de un fold???
Gracias.
#include "FWCE.ch"
FUNCTION Main()
local cAlias, nRecno
nRecno = 0
ctexto = space(20)
cSearch = ""
lNuevo = .F.
lEditando = .F.
* Control de programa
IF IsExeRunning( cFileName( HB_ArgV( 0 ) ) )
MsgInfo( "No puedes abrir dos veces el programa", SISTEMA)
Return Nil
ENDIF
DEFINE WINDOW oWnd TITLE "Clientes"
*Configuracion Inicial del sistema
Configura()
AbrirFicheros()
PonBotones()
***************************************************
* GRID
***************************************************
@ 2.2,0 FOLDER oFld PROMPTS "Indice", "Ficha", "Más datos", "Económicos" SIZE 240, 200
@ 0.5,0 LISTBOX oBrw FIELDS cprvcod,cprvome,cprvnom COLSIZES 50,200,200 ;
OF oFld:aDialogs[1] HEADERS "Código","Nombre Comercial","Nombre Fiscal" SIZE 235,200 ;
ON CHANGE DibujaFichas()
*****************************
* búsqueda incremental sobre el grid
oBrw:bKeyChar = { | nKey, nFlags | BusquedaIncremental(nKey, @cSearch), oBrw:Refresh()}
*****************************
ACTIVATE WINDOW oWnd
DbCloseAll()
RETURN nil
*****************************************
* Botonaje de edición
*****************************************
FUNCTION PonBotones
@ 0, 0 BTNBMP FILE CurDir() + "\bmp\nuevo.bmp" SIZE 25, 25
@ 0, 25 BTNBMP FILE CurDir() + "\bmp\buscar.bmp" SIZE 25, 25 ACTION BuscaCliente()
@ 0, 50 BTNBMP FILE CurDir() + "\bmp\delete.bmp" SIZE 25, 25
@ 0, 100 BTNBMP FILE CurDir() + "\bmp\ok.bmp" SIZE 25, 25
@ 0, 125 BTNBMP FILE CurDir() + "\bmp\cancelar.bmp" SIZE 25, 25
@ 0, 220 BTNBMP FILE CurDir() + "\bmp\close.bmp" SIZE 25, 25;
ACTION IF( MsgYesNo( '¿ Desea salir ?', 'Aviso' ), oWnd:End(), )
RETURN NIL
*****************************************
* Apertura de ficheros
*****************************************
FUNCTION AbrirFicheros
Request DbfCdx
Request DbfFpt
RddSetDefault ('DbfCdx')
Request Hb_Lang_PLWIN
Request Hb_CodePage_PLWIN
**********
* Clientes
**********
IF .NOT. USED("Efth010")
USE (CurDir()+"\Efth010") NEW
ELSE
SELECT Efth010
ENDIF
INDEX ON CprvCod TO CODIGO ADDI
INDEX ON CprvNom TO FISCAL ADDI
INDEX ON CprvOme TO COMERCIAL ADDI
Efth010->( OrdSetFocus( "CODIGO" ) )
Efth010->( DbGoTop() )
RETURN nil
********************************************
* Sets
********************************************
FUNCTION PonSets()
HB_LANGSELECT( "ESWIN" )
SET DELETED ON
SET DATE TO ITALIAN
SET SOFTSEEK ON
SET CENTURY ON
SET EPOCH TO 2000
SET CONFIR ON
RETU nil
********************************************
* Configuración inicial del sistema
********************************************
FUNCTION Configura()
PonSets()
HB_LANGSELECT("ESWIN")
*Hb_LangSelect ('PL')
*Hb_SetCodePage ('PLWIN')
REQUEST HB_LANG_ES // Para establecer español para Mensajes, fechas, etc..
REQUEST HB_CODEPAGE_ESWIN // Para establecer código de página a Español (Ordenación, etc..)
HB_LangSelect('ES')
HB_SetCodePage("ESWIN") // Para ordenación (arrays, cadenas, etc..)
RETURN nil
***********************************************
* Busca un cliente y se posiciona en el browse
***********************************************
FUNCTION BuscaCliente
LOCAL cValue
cValue = 'Nombre Comercial'
//RGB(155,255,200)
DEFINE DIALOG oBuscar TITLE 'Busqueda de cliente' SIZE 220,100 OF oWnd COLOR "N/G"
@ 0, 0 GET cTexto SIZE 98, 12
@ 0, 97 BTNBMP FILE CurDir() + "\bmp\ok.bmp" SIZE 14, 12 ;
ACTION(iif(.NOT. EMPTY(ctexto),BuscaCl(cValue, cTexto),msginfo("El campo no puede estar vacio","Aviso")))
@ 1, 1 SAY "Tipo de búsqueda" SIZE 100,15 of oBuscar COLOR "W/G"
@ 2.3, 1 COMBOBOX cValue ITEMS { "Nombre Comercial", "Nombre Fiscal", "Código Cliente" } SIZE 100, 60 ;
ON CHANGE MsgBeep() of oBuscar
ACTIVATE DIALOG oBuscar CENTERED
RETURN nil
***********************************************
* Busca por campo
***********************************************
FUNCTION BuscaCl(lpIndice, lpTexto)
SELECT Efth010
DO CASE
CASE lpIndice = "Nombre Comercial"
Efth010->(OrdSetFocus("COMERCIAL"))
CASE lpIndice = "Nombre Fiscal"
Efth010->(OrdSetFocus("FISCAL"))
CASE lpIndice = "Código Cliente"
Efth010->(OrdSetFocus("CODIGO"))
ENDCASE
* Cada vez que busco elimino la cadena de búsqueda incremental
cSearch = ""
Efth010->(DbSeek(lpTexto, .t.))
oBrw:refresh()
RETURN nil
***********************************************
* Aviso general
* Ej ->Avisa('Hola caracola', oWnd)
***********************************************
FUNCTION Avisa(lpTexto, lpVentana)
DEFINE DIALOG oAviso TITLE 'Aviso' SIZE 220,22 OF lpVentana
@ 0, 0 SAY lpTexto SIZE 98, 12
ACTIVATE DIALOG oAviso CENTERED
RETURN nil
***********************************************
* Diseño de las pestañas de datos
***********************************************
FUNCTION DibujaFichas
LOCAL ogetCodigo, ogetNC, ogetNF, lcCodigo, lcNombreC, lcNombreF
lcCodigo = ("Efth010")->cprvcod
lcNombreC = ("Efth010")->cprvOme
lcNombreF = ("Efth010")->cprvcod
@ 1, 1 SAY "Código:" OF oFld:aDialogs[2] SIZE 45, 15
@ 1, 8 GET ogetCodigo VAR lcCodigo OF oFld:aDialogs[2] SIZE 70, 18
ogetCodigo:bGotFocus := {|| ogetCodigo:SetColor(RGB( 0, 0, 0), RGB(155,255,200)),ogetCodigo:Refresh}
@ 2.5, 1 SAY "Nombre C:" OF oFld:aDialogs[2] SIZE 45, 15
@ 2.7, 8 GET ogetNC VAR lcNombreC OF oFld:aDialogs[2] SIZE 160, 18
ogetNC:bGotFocus := {|| ogetNC:SetColor(RGB( 0, 0, 0), RGB(155,255,200)),ogetNC:Refresh}
@ 4, 1 SAY "Nombre F:" OF oFld:aDialogs[2] SIZE 45, 15
@ 4.7, 8 GET ogetNF VAR lcNombreF OF oFld:aDialogs[2] SIZE 160, 18
ogetNF:bGotFocus := {|| ogetNF:SetColor(RGB( 0, 0, 0), RGB(155,255,200)),ogetNF:Refresh}
// @ 6, 2 BUTTON "Actualiza" OF oFld:aDialogs[2] SIZE 45, 15 ACTION Dale()
RETURN nil
//FUNCTION dale
//Efth010->cprvcod := "9999999"
//obrw:refresh()
//RETURN nil
FUNCTION BusquedaIncremental( nKey, cSearch )
IF nKey = 8
cSearch = SubStr( cSearch, 1, Len( cSearch ) - 1 )
ELSE
cSearch += Upper(Chr(nKey ) )
ENDIF
Efth010->(DbSeek(cSearch,.t.) )
return nil
//function salir
// DbCloseAll()
// oWnd:End()
// MsgYesNo( "¿Salir de clientes?" )
//return nil
//function mensaje
// DEFINE DIALOG oDlg TITLE 'Aviso' SIZE 200,200
// ACTIVATE DIALOG oDlg CENTERED
// @ 2,2 SAY 'Hola'
//return nil
Necesitos estas respuestas si eres tan amable.
Preguntillas:
1 Existen 2 botones (grabar y cancelar) que quiero que se vean pero desactivados, ya que cuando se cambie algun campo se activarán entonces. He leido que se usa con tbtnbmp pero no se como trabajarlo, no se si hay ejemplos.
2 Cada vez que arranco la aplicación Indexo, Con el fin de no reindexar siempre ¿como abro un fichero de indices (si existe) y uso los indices. Lo he intentado pero cuando cambio de indice me dice que no existe.
3 La edición que comento, segun me comenta Carles con el ejemplo, claro! es desde un botón pero yo quiero que sea automático, esto es conforme me muevo en el grid, puedo ir a la pestaña donde está la ficha y editar.
4 Al arrancar la aplicación ¿como mando el foco al Grid?.
5 Se puede deshabilitar/habilitar pestañas de un fold???
Gracias.
#include "FWCE.ch"
FUNCTION Main()
local cAlias, nRecno
nRecno = 0
ctexto = space(20)
cSearch = ""
lNuevo = .F.
lEditando = .F.
* Control de programa
IF IsExeRunning( cFileName( HB_ArgV( 0 ) ) )
MsgInfo( "No puedes abrir dos veces el programa", SISTEMA)
Return Nil
ENDIF
DEFINE WINDOW oWnd TITLE "Clientes"
*Configuracion Inicial del sistema
Configura()
AbrirFicheros()
PonBotones()
***************************************************
* GRID
***************************************************
@ 2.2,0 FOLDER oFld PROMPTS "Indice", "Ficha", "Más datos", "Económicos" SIZE 240, 200
@ 0.5,0 LISTBOX oBrw FIELDS cprvcod,cprvome,cprvnom COLSIZES 50,200,200 ;
OF oFld:aDialogs[1] HEADERS "Código","Nombre Comercial","Nombre Fiscal" SIZE 235,200 ;
ON CHANGE DibujaFichas()
*****************************
* búsqueda incremental sobre el grid
oBrw:bKeyChar = { | nKey, nFlags | BusquedaIncremental(nKey, @cSearch), oBrw:Refresh()}
*****************************
ACTIVATE WINDOW oWnd
DbCloseAll()
RETURN nil
*****************************************
* Botonaje de edición
*****************************************
FUNCTION PonBotones
@ 0, 0 BTNBMP FILE CurDir() + "\bmp\nuevo.bmp" SIZE 25, 25
@ 0, 25 BTNBMP FILE CurDir() + "\bmp\buscar.bmp" SIZE 25, 25 ACTION BuscaCliente()
@ 0, 50 BTNBMP FILE CurDir() + "\bmp\delete.bmp" SIZE 25, 25
@ 0, 100 BTNBMP FILE CurDir() + "\bmp\ok.bmp" SIZE 25, 25
@ 0, 125 BTNBMP FILE CurDir() + "\bmp\cancelar.bmp" SIZE 25, 25
@ 0, 220 BTNBMP FILE CurDir() + "\bmp\close.bmp" SIZE 25, 25;
ACTION IF( MsgYesNo( '¿ Desea salir ?', 'Aviso' ), oWnd:End(), )
RETURN NIL
*****************************************
* Apertura de ficheros
*****************************************
FUNCTION AbrirFicheros
Request DbfCdx
Request DbfFpt
RddSetDefault ('DbfCdx')
Request Hb_Lang_PLWIN
Request Hb_CodePage_PLWIN
**********
* Clientes
**********
IF .NOT. USED("Efth010")
USE (CurDir()+"\Efth010") NEW
ELSE
SELECT Efth010
ENDIF
INDEX ON CprvCod TO CODIGO ADDI
INDEX ON CprvNom TO FISCAL ADDI
INDEX ON CprvOme TO COMERCIAL ADDI
Efth010->( OrdSetFocus( "CODIGO" ) )
Efth010->( DbGoTop() )
RETURN nil
********************************************
* Sets
********************************************
FUNCTION PonSets()
HB_LANGSELECT( "ESWIN" )
SET DELETED ON
SET DATE TO ITALIAN
SET SOFTSEEK ON
SET CENTURY ON
SET EPOCH TO 2000
SET CONFIR ON
RETU nil
********************************************
* Configuración inicial del sistema
********************************************
FUNCTION Configura()
PonSets()
HB_LANGSELECT("ESWIN")
*Hb_LangSelect ('PL')
*Hb_SetCodePage ('PLWIN')
REQUEST HB_LANG_ES // Para establecer español para Mensajes, fechas, etc..
REQUEST HB_CODEPAGE_ESWIN // Para establecer código de página a Español (Ordenación, etc..)
HB_LangSelect('ES')
HB_SetCodePage("ESWIN") // Para ordenación (arrays, cadenas, etc..)
RETURN nil
***********************************************
* Busca un cliente y se posiciona en el browse
***********************************************
FUNCTION BuscaCliente
LOCAL cValue
cValue = 'Nombre Comercial'
//RGB(155,255,200)
DEFINE DIALOG oBuscar TITLE 'Busqueda de cliente' SIZE 220,100 OF oWnd COLOR "N/G"
@ 0, 0 GET cTexto SIZE 98, 12
@ 0, 97 BTNBMP FILE CurDir() + "\bmp\ok.bmp" SIZE 14, 12 ;
ACTION(iif(.NOT. EMPTY(ctexto),BuscaCl(cValue, cTexto),msginfo("El campo no puede estar vacio","Aviso")))
@ 1, 1 SAY "Tipo de búsqueda" SIZE 100,15 of oBuscar COLOR "W/G"
@ 2.3, 1 COMBOBOX cValue ITEMS { "Nombre Comercial", "Nombre Fiscal", "Código Cliente" } SIZE 100, 60 ;
ON CHANGE MsgBeep() of oBuscar
ACTIVATE DIALOG oBuscar CENTERED
RETURN nil
***********************************************
* Busca por campo
***********************************************
FUNCTION BuscaCl(lpIndice, lpTexto)
SELECT Efth010
DO CASE
CASE lpIndice = "Nombre Comercial"
Efth010->(OrdSetFocus("COMERCIAL"))
CASE lpIndice = "Nombre Fiscal"
Efth010->(OrdSetFocus("FISCAL"))
CASE lpIndice = "Código Cliente"
Efth010->(OrdSetFocus("CODIGO"))
ENDCASE
* Cada vez que busco elimino la cadena de búsqueda incremental
cSearch = ""
Efth010->(DbSeek(lpTexto, .t.))
oBrw:refresh()
RETURN nil
***********************************************
* Aviso general
* Ej ->Avisa('Hola caracola', oWnd)
***********************************************
FUNCTION Avisa(lpTexto, lpVentana)
DEFINE DIALOG oAviso TITLE 'Aviso' SIZE 220,22 OF lpVentana
@ 0, 0 SAY lpTexto SIZE 98, 12
ACTIVATE DIALOG oAviso CENTERED
RETURN nil
***********************************************
* Diseño de las pestañas de datos
***********************************************
FUNCTION DibujaFichas
LOCAL ogetCodigo, ogetNC, ogetNF, lcCodigo, lcNombreC, lcNombreF
lcCodigo = ("Efth010")->cprvcod
lcNombreC = ("Efth010")->cprvOme
lcNombreF = ("Efth010")->cprvcod
@ 1, 1 SAY "Código:" OF oFld:aDialogs[2] SIZE 45, 15
@ 1, 8 GET ogetCodigo VAR lcCodigo OF oFld:aDialogs[2] SIZE 70, 18
ogetCodigo:bGotFocus := {|| ogetCodigo:SetColor(RGB( 0, 0, 0), RGB(155,255,200)),ogetCodigo:Refresh}
@ 2.5, 1 SAY "Nombre C:" OF oFld:aDialogs[2] SIZE 45, 15
@ 2.7, 8 GET ogetNC VAR lcNombreC OF oFld:aDialogs[2] SIZE 160, 18
ogetNC:bGotFocus := {|| ogetNC:SetColor(RGB( 0, 0, 0), RGB(155,255,200)),ogetNC:Refresh}
@ 4, 1 SAY "Nombre F:" OF oFld:aDialogs[2] SIZE 45, 15
@ 4.7, 8 GET ogetNF VAR lcNombreF OF oFld:aDialogs[2] SIZE 160, 18
ogetNF:bGotFocus := {|| ogetNF:SetColor(RGB( 0, 0, 0), RGB(155,255,200)),ogetNF:Refresh}
// @ 6, 2 BUTTON "Actualiza" OF oFld:aDialogs[2] SIZE 45, 15 ACTION Dale()
RETURN nil
//FUNCTION dale
//Efth010->cprvcod := "9999999"
//obrw:refresh()
//RETURN nil
FUNCTION BusquedaIncremental( nKey, cSearch )
IF nKey = 8
cSearch = SubStr( cSearch, 1, Len( cSearch ) - 1 )
ELSE
cSearch += Upper(Chr(nKey ) )
ENDIF
Efth010->(DbSeek(cSearch,.t.) )
return nil
//function salir
// DbCloseAll()
// oWnd:End()
// MsgYesNo( "¿Salir de clientes?" )
//return nil
//function mensaje
// DEFINE DIALOG oDlg TITLE 'Aviso' SIZE 200,200
// ACTIVATE DIALOG oDlg CENTERED
// @ 2,2 SAY 'Hola'
//return nil
- Antonio Linares
- Site Admin
- Posts: 37481
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Contact:
- Antonio Linares
- Site Admin
- Posts: 37481
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Contact:
Andrés,
Por favor prepara un ZIP con tu ejemplo, incluyendo las DBFs, índices, y los bitmaps usados, y súbelo a www.uploading.com y pon aqui la dirección que te dé de descarga, gracias
Por favor prepara un ZIP con tu ejemplo, incluyendo las DBFs, índices, y los bitmaps usados, y súbelo a www.uploading.com y pon aqui la dirección que te dé de descarga, gracias
- Antonio Linares
- Site Admin
- Posts: 37481
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Contact:
Andres,
No te habia entendido bien el tema de la edicion (ahora creo q si).
La manera correcta de trabajar es:
Crear ventana
Crear folder
Crear Dialogos de folder
A partir de aqui la idea es que si tengo un browse en una pestaña, quiero q se actualicen los datos de otra pestaña. La solucion esta en REFRESCAR los controles de la 2 pestaña.
Si tu tienes definidos los controles de la 2 pestaña p.e.
@1,1 GET oGet1 VAR cVar1 OF oFld:aDialogs[2]
En el browse bastaria hacer:
ON CHANGE ( cVar1 := nuevo valor, oGet1:refresh() )
Lo que haces tu es crear cada vez controles nuevos.
Espero q te sirva.
Siau.
No te habia entendido bien el tema de la edicion (ahora creo q si).
La manera correcta de trabajar es:
Crear ventana
Crear folder
Crear Dialogos de folder
A partir de aqui la idea es que si tengo un browse en una pestaña, quiero q se actualicen los datos de otra pestaña. La solucion esta en REFRESCAR los controles de la 2 pestaña.
Si tu tienes definidos los controles de la 2 pestaña p.e.
@1,1 GET oGet1 VAR cVar1 OF oFld:aDialogs[2]
En el browse bastaria hacer:
ON CHANGE ( cVar1 := nuevo valor, oGet1:refresh() )
Lo que haces tu es crear cada vez controles nuevos.
Espero q te sirva.
Siau.
Salutacions, saludos, regards
"...programar es fácil, hacer programas es difícil..."
https://modharbour.app
https://modharbour.app/compass
https://forum.modharbour.app
"...programar es fácil, hacer programas es difícil..."
https://modharbour.app
https://modharbour.app/compass
https://forum.modharbour.app
-
- Posts: 28
- Joined: Wed Dec 13, 2006 6:07 pm
fuente
Aquí va la ubicación:
http://www.uploading.com/files/GOF9MIZV/Clientes.zip
Antonio:
Gracias por las respuestas.
http://www.uploading.com/files/GOF9MIZV/Clientes.zip
Antonio:
Gracias por las respuestas.
-
- Posts: 28
- Joined: Wed Dec 13, 2006 6:07 pm
Grid
Carles
Muy agradecido. lo pruebo.
Muy agradecido. lo pruebo.