FoxPro/Visual FoxPro - busqueda de un # cualquiera en un textbox

   
Vista:

busqueda de un # cualquiera en un textbox

Publicado por jose luis (35 intervenciones) el 21/05/2014 19:06:15
hola amigos

miren tengo un problema en un textbox y es que necesito en tiempo de ejecucion saber si existen el numero de carnet de una persona cualquiera y claro valido de que mi textbox no este vacio, pero me dice en cuanto entro el valor que el numero existe y es mentira pq en realidad estoy alimentando de cero mi base de datos en fin no se como lograr que cuando termino de introdicir mis 11 digitos el me diga si existe o no en la base de datos.

aqui pongo el codigo:

1
2
3
4
5
6
7
8
9
10
IF LEN(ALLTRIM(THISFORM.NOCARNETDEIDENTIDAD1.Value)) = 11 then
   SET FILTER TO despachadores.NOCARNETDEIDENTIDAD = THISFORM.NOCARNETDEIDENTIDAD1.Value
   GO top
   IF despachadores.NOCARNETDEIDENTIDAD = THISFORM.NOCARNETDEIDENTIDAD1.Value then
      WAIT WINDOW [existe]
   endif
-
-
-
endif

de antemano les doy mil gracias por su colaboracion.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

busqueda de un # cualquiera en un textbox

Publicado por VICTOR MANUEL (278 intervenciones) el 21/05/2014 19:35:04
Hola Jose Luis,

Si usas VFP 9, no se, creo que te complicas mucho...

En el Valid del TEXTBOX pones

1
2
3
4
5
6
7
8
If len(xxx) =11
   Select  TABLE (la tabla de tus DESPACHADORES INDEXADA POR EL CAMPO NODECARNETDEIDENTIDAD
       SEEK (ALLTRIM(THIS.VALUE)
       if found()
         messagebox("Existe")
         Return 0
       endif
endif

Con este codigo, se busca el numero introducido en el campo TEXTBOX dentro de la Tabla Indexada. Si lo encuentra te despliega la informacion de que ya EXISTE, si no lo encuentra, pues sigue ejecutando las rutinas que siguen.

El Return 0, hace que el foco regrese nuevamente al TEXTBOX.

Espero te halla quedado claro.

Saludos,

Victor
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

busqueda de un # cualquiera en un textbox

Publicado por jose luis (35 intervenciones) el 21/05/2014 19:49:44
gracias amigo victor probare y le dire y muy agradecido
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

busqueda de un # cualquiera en un textbox

Hola

Incluso lo que te ha mando Víctor Manuel, puedes hacerlo mas comprimido, usando la función SEEK() en vez del comando.

La función seek, le pasas 3 parámetros:

1º Valor a buscar
2º Tabla a Buscar (coo ves va como literal, y no hace falta que te posiciones en ella.
3º Numero del indice de la tabla por el que vas a buscar.

If len(xxx) =11
If SEEK (ALLTRIM(THIS.VALUE, 'DESPACHADORES' , nX )
messagebox("Existe")
Return 0
endif
endif


Un saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

busqueda de un # cualquiera en un textbox

Publicado por jose luis (35 intervenciones) el 22/05/2014 16:22:14
hola juan gracias por ayudarme tambien lo estoy probando, es que cuando lo hago en los dos casos me dice que no existe no se si estare haciendo algo bien o estare metiendo bien dentro la pata
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

busqueda de un # cualquiera en un textbox

Lo que no entiendo es porquemiras si al longitud es igual a 11, si en realidad lo que quieres es saber si lo que han tecleado esta o no en la base de datos. te valdria con:

Dentro del valid del textbox (vamos a suponer que el textbox se llama DESPACHADOR, lo único que tienes que asegurarte es que el indice que usas esta ordenado por ese campo (DESPACHADOR, o como lo llames)

Revisa el indice, y si el campo de la tabla tiene la misma longitud de entrada que el textbox, puede quitar en principio el alltrim, y ademas me imagino que ese campo sera tipo caracter no ?

If SEEK (Thsoform.DESPACHADOR.value, 'DESPACHADORES' , nX )
messagebox("Existe")
Return 0
else
messagebox("NO Existe")
endif
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

busqueda de un # cualquiera en un textbox

Publicado por VICTOR MANUEL (278 intervenciones) el 22/05/2014 17:09:06
Hola Jose

Mira, te envio otra forma de hacer tu consulta. En realidad la longitud de caracteres del campo textbox lo puedes definir en las propiedades cuando insertas la infomracion. Asi, por ejemplo, cuando entras los datos del Nodecarnet te aseguras que sea 11 la longitud maxima y que no te deje seguir si no se cumple ese requisito. Alli es donde, en el VALID al captar la informacion pones la condicion de que LEN debe ser obligatoriamente 11.

Creo que no te funciona porque para que SEEK() funcione la TABLA o ALIAS debe estar abierta en el Init del Form o en alguna parte.

Use Despachadores in 0 alias Despachadores
SET ORDER TO TAG XXX (este XXX es el nombre que le pusiste al index que te ordena los registro por NoDeCarnet).
Si no abres la tabla en memoria en algun lado, pues el SEEK no funciona. Yo lo probe, el codigo, y si no lo hago por supuesto no me funciona.

Si no quieres abrir la TABLA entonces prueba el siguiente codigo en el VALID del TEXTBOX, suponiendo que la Tabla se llame Despachadores y que el campo que contiene el NodeCarnet es Carnet.

1
2
3
4
5
6
7
8
SELECT CARNET FROM DESPACHADORES;
              WHERE CARNET=ALLTRIM(THIS.VALUE);
              INTO CURSOR _CARNET
 
IF RECCOUNT()<>0  &&  SIGNIFICA QUE EL NODECARNET YA EXISTE
   MESSAGEBOX("CARNET EXISTENTE...")
   RETURN 0
ENDIF


Pruebalo y nos avisas.


Victor
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

busqueda de un # cualquiera en un textbox

Publicado por jose luis (35 intervenciones) el 22/05/2014 18:47:24
En todo momento lo estoy manejando como caracter y lo controlo por la cantidad que sean 11 por el motivo de evitar que falten algun digito pq nuestras identificaciones son de 11 digitos y es por el que estoy validando si existe o no pq si existe muestro los datos de ese despachador y sino lo incorporo como nuevo alumno.

el caso es que es un formulario generado y en unos de los pasos le di cual es el campo a indexar de todas maneras lo voy a verificar como ud mi dijo ahora a ver si ambos tienen la misma longitud.

y disculpeme que no le haya respondido antes es que me llamaron por un problema con una pc por aca.

gracias por tratar de comprender mi sencillo problema y de ayudarme a lo mejor me toque a mi ayudar pq no siempre tiene que ser para uno sino tambien pa los demas.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

busqueda de un # cualquiera en un textbox

Publicado por Fidel José (558 intervenciones) el 22/05/2014 20:34:19
1) Tu código problamente falla porque no se indica la tabla ( IN despachadores)
Aunque generalmente es preferible
SELECT DESPACHADORES
SET FILTER TO NOCARNETDEIDENTIDAD = THISFORM.NOCARNETDEIDENTIDAD1.Value
GO TOP

Y para lo que pretendes hacer tienes mejores recursos. En general evita el uso de SET FILTER, salvo que sean tablas locales o cursores. Puedes usar LOCATE si no tienes índice sobre el campo de búsqueda; SEEK, Seek() o Indexseek() si el campo de búsqueda tiene una etiqueta de índice. LOCATE es muy rápido si el campo está indexado. En cualquier caso también puedes utilizar SELECT-SQL (que también será mucho más rápido si tienes índices sobre los campos de la condición).

Para solucionar el tema, necesitas que la tabla despachadores esté abierta (y supongo que lo está).

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
*<TextBox.valid>
LOCAL lcCedula
lcCedula=ALLTRIM(this.value)
IF !EMPTY(lcCedula)                                && evitar testear un valor vacío y permite cerrar el form.
	IF LEN(lcCedula)  # 11
		MESSAGEBOX("Debe contener 11 dígitos")
		RETURN 0
	ENDIF
	SELECT despachadores
	LOCATE FOR NOCARNETDEIDENTIDAD==lcCedula
	IF FOUND()
		MESSAGEBOX("Número de Carnet Grabado")
                this.value=""
		RETURN 0
	ENDIF
 
ENDIF
*</TextBox.valid>
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

busqueda de un # cualquiera en un textbox

Publicado por jose luis (35 intervenciones) el 22/05/2014 22:45:48
mire hice la prueba en otro formulario y me sigue diciendo que existe a pesar de estar la tabla vacia ahora si no comprendo nada amigo fidel mire aqui le pongo lo que esta en el valid:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
LOCAL lcCedula
lcCedula=ALLTRIM(this.value)
IF !EMPTY(lcCedula) && evitar testear un valor vacío y permite cerrar el form.
   IF LEN(lcCedula) # 11 
      MESSAGEBOX("Debe contener 11 dígitos, rectifique")
      RETURN 0
   ENDIF
   SELECT despachadores
   LOCATE FOR NOCARNETDEIDENTIDAD==lcCedula
   IF FOUND()
      MESSAGEBOX("Número de Carnet Grabado")
      this.value=""
      sigue = 0
      RETURN 0
   ELSE
      MESSAGEBOX("Procesar Número de Carnet:"+ALLTRIM(this.value))
      sigue = 1
   ENDIF
ENDIF

nota: sigue es una bandera para que en el caso de que no exista procese las demas informaciones mire ahi le pongo el codigo que va despues de que valid da su visto a insertar otro carnet:

si el valid da visto bueno esto es lo que hago al inicio.

es simple en base al # de carnet calculo la edad de la persona y a la vez cojo el antepenultimo valor y por ahi saco si es mujer o hombre, comprende y despues ya sigo con los demas valores a llenar.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
IF sigue = 1 then
   **********************declaracion de variables
   par = [2468]
   imp = [13579]
   CARNET = []
   CARNET = THISFORM.NOCARNETDEIDENTIDAD1.Value
   * finaliza todo el proceso
   fin    = .f.
   TOTAL = 0
   ****************************fin de declarar variables
   * aqui va el # del carnet de identidad
   Ncarnet = substr(THISFORM.NOCARNETDEIDENTIDAD1.Value,10,1)
   edades = 0
   edades = INT(YEAR(DATE( ))- VAL(substr(THISFORM.NOCARNETDEIDENTIDAD1.Value,1,2)))+1900
   thisform.embossedfield2.Value = RIGHTC(STR(edades), 2)
   buscar = []
   STORE par TO buscar
   buscaen = []
   buscaen = [h]
   * un ciclo hasta que fin sea verdadero
   Do while fin <> .t.
      total = LENC(buscar)
      for i= 1 to total
          * si es par
          if Ncarnet = SUBSTR(buscar,i,1)
             thisform.sEXO1.Sorted = .T.
             IF buscaen = [h] then
                thisform.seXO1.ListIndex = 2
                thisform.sexo1.Refresh
                fin = .t.
                  i = total
             ELSE
                IF buscaen = [m] then
                   thisform.seXO1.ListIndex = 1
                   thisform.sexo1.Refresh
                   fin = .t.
                     i = total
                endif
             ENDIF
          ENDIF
      endf
      if fin <> .t.
         STORE imp TO buscar
         total  = LENC(buscar)
         buscaen = [m]
         fin = .f.
         i = 1
      endif
   ENDDO
endif

y por si las moscas como decimos por aca en init pongo esto:

THISFORM.NOCARNETDEIDENTIDAD1.Value = []

y asi y todo me sigue diciendo que existe el numero x: 25896347854

llevo rato en esto y no se si soy yo que hago algo mal en fin aconsejenme pq parece que no estoy ya viendo bien o que se yo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

busqueda de un # cualquiera en un textbox

Publicado por Fidel José (558 intervenciones) el 23/05/2014 02:11:37
Prueba de la siguiente forma y fijate en el Mensaje que aparece, a ver qué dato tira cuando dice que lo encuentra.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
*<TextBox.valid>
LOCAL lcCedula
lcCedula=ALLTRIM(this.value)
IF !EMPTY(lcCedula)
	 IF LEN(lcCedula) # 11 
 		MESSAGEBOX("Debe contener 11 dígitos")
 		RETURN 0
 	ENDIF
 	SELECT despachadores
 	LOCATE FOR NOCARNETDEIDENTIDAD==lcCedula
 	IF FOUND()
 		MESSAGEBOX("Número de Carnet Grabado"+CHR(13);
 			+"Registro "+TRANSFORM(RECNO())+CHR(13);
 			+"Valor="+noCarnetdeIdentidad +chr(13);
                        +"Tabla="+Alias())
 		this.value=""
 		RETURN 0
	ENDIF
ENDIF
*</TextBox.valid>
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

busqueda de un # cualquiera en un textbox

Publicado por jose luis (35 intervenciones) el 23/05/2014 15:27:29
buenos dias fidel

mire ahora mismo probe su propuesta y en verdad no se el pq sigue diciendo que existe, inclusive le hice zap para que no hubiera casualidad de algo y sigue diciendo eso mire esto es lo que ocurre a la verdad mi amigo esto es de pelicula, por si usted no ve bien la imagen le escribo aqui el resultado:

registro -1
valor: aqui aparece el # x que puse
tabla: despachadores

digame usted que que pudiera estar pasando es como si estuviera perdido en fin aconsejeme y mil millones de disculpas por molestarlo y mil millones de gracias de ayudarme
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

busqueda de un # cualquiera en un textbox

Publicado por VICTOR MANUEL (278 intervenciones) el 23/05/2014 15:40:07
Amigo,

No veo el por que tienes el problema. Si la base de datos esta sin registro entonces algo anda mal en tu codigo de programacion. La propuesta que te hemos hecho las he probado y todas funcionan pues no varian mucho las una de las otras. Yo te aconsejaria usar el SELECT pues es de las sentencias que hacen a VFP 9. una mejor herramienta.

Lo que puedes hacer es enviarme el formulario a mi direccion de correo y puedo revisarte. Yo uso algo parecido a lo que tienes en el programa de mi clinica. No soy programador de profesion, soy medico pero creo que te puedo ayudar.

Mandame el Formulario y la base de datos en un archivo Zip (formulario e indices, etc) y hacemos la prueba a ver si encontramos donde esta el problema.

Mi dirección de correo es vperezr@cableonda.net


Saludos,

Victor
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

busqueda de un # cualquiera en un textbox

Publicado por jose luis (35 intervenciones) el 23/05/2014 17:02:41
mire amigo victor mi problema es que no tengo cuenta de correo internacional yo pude registrarme por un amigo que hizo de puente que en estos momentos no esta ahi pues esta de viaje por las provincias en fin ojala pudiera enviarle todo total no tiene nada de secreto con tal de descubrir el misterio, soy un simple programador que comenzo este año a programar en visual foxpro 9 ya que antes lo hacia en foxpro para windows y mentira el visual fox es mil millones mas facil de programar que el otro por eso es que me e enredado, disculpeme no poderle enviar algo de lo que tengo por aca y no es para nada de desconfianza pq al fin al cabo todos nos ayudamos y lo que estoy haciendo no tiene nada de extraordinario.

no se por donde hacer que funcione, sabes yo siempre digo que el que mucho mira poco ve y eso me paso anoche estuve hasta las 3 am buscandole variantes al dilema y nada y el otro compañero fidel jose tambien me a ayudado cantidad como usted y nada jajajajja no es facil pero bueno sigo ahi pues a mi me tienen que dar candela pa vencerme y asi y todo tampoco.

tendre que romper el formulario y hacerlo de nuevo de cero y ademas ya me da pena con ambos por molestarlos y se que todas las ayudas estan geniales, en cuanto construya de nuevo el form y pruebo a ver si las propuestas de ambos me funciona, gracias por ayudarme amigos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

busqueda de un # cualquiera en un textbox

Publicado por victor perez (137 intervenciones) el 24/05/2014 04:59:35
Hola,

No te preocupes. Nosotros estamos para ayudar. A mi me ha tocado enviar codigo, archivos e inclusive permitir acceso a mi computadora para lograr que me ayuden. Aqui todos nos ayudamos. Yo apenas llevo 4 años en VFP y empece desde cero. Me ayudaron y me enseñaron desde Peru...un buen amigo que conoci en los forums.

No se por que no tienes cuenta de correo internacional. Debe ser que esta prohibido en tu pais.

Un saludo y espero que puedas enviar el archivo para poder ayudarte a resolver el dilema.

Victor,
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

busqueda de un # cualquiera en un textbox

Publicado por jose luis (35 intervenciones) el 30/05/2014 20:38:42
amigos fidel jose, victor manuel

parece que logre con estas intrucciones que hiciera lo que deseaba si exitia no lo volviera a poner y sino existe lo agregara a las informaciones, ahora creen ustedes que esta bien asi? por favor aconsejenme y aprovecho esta comunicacion para preguntarles a ambos pq cuando salgo del sistema me dice que un objerto esta en uso, existe la forma de destruir todos los objetos de mi formularios digase imagenes y demas objetos.

LOCAL lcCedula
lcCedula=ALLTRIM(this.value)
IF !EMPTY(lcCedula) && evitar testear un valor vacío y permite cerrar el form.
IF LEN(lcCedula) # 11
MESSAGEBOX("Debe contener 11 dígitos, rectifique")
RETURN 0
ENDIF
SELECT despachadores
SELECT * FROM despachadores WHERE despachadores.nocarnetdeidentidad = lccedula INTO CURSOR curso4
IF RECCOUNT() > 0
LOCATE FOR despachadores.nocarnetdeidentidad = lccedula
MESSAGEBOX([Ya existe: El Carnet de Identidad No. ]+lccedula)
this.Value = []
sigue = 0
RETURN 0
ELSE
*MESSAGEBOX("No existe, a incorporarlo ahora")
sigue = 1
endif
ENDIF
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

busqueda de un # cualquiera en un textbox

Publicado por Fidel José (558 intervenciones) el 30/05/2014 21:58:23
José Luis:
Lo que está comentado no va.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
LOCAL lcCedula
lcCedula=ALLTRIM(this.value)
IF !EMPTY(lcCedula) && evitar testear un valor vacío y permite cerrar el form.
	IF LEN(lcCedula) # 11
		MESSAGEBOX("Debe contener 11 dígitos, rectifique")
		RETURN 0
	ENDIF
*	SELECT despachadores
*	SELECT * FROM despachadores WHERE despachadores.nocarnetdeidentidad = lccedula INTO CURSOR curso4
	SELECT * FROM despachadores ;
		WHERE nocarnetdeidentidad = lccedula ;
		INTO CURSOR curso4
*	IF RECCOUNT() > 0
	IF _tally >0
*		LOCATE FOR despachadores.nocarnetdeidentidad = lccedula
		MESSAGEBOX([Ya existe: El Carnet de Identidad No. ]+curso4.nocarnetdeidentidad)
		this.Value = []
*		sigue = 0
 
		RETURN 0
*	ELSE
*		*MESSAGEBOX("No existe, a incorporarlo ahora")
*		sigue = 1
	ENDIF
ENDIF
 
* Al cerrar el form
IF USED("CURSO4")
	SELECT CURSO4
	USE
ENDIF
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

busqueda de un # cualquiera en un textbox

Publicado por jose luis (35 intervenciones) el 30/05/2014 22:20:35
amigo fidel aqui ahora casi no me da tiempo pues hoy por aca terminamos a las 4:30 pero por aqui ya ahorita apagan los servers en fin es una odisea asi que el lunes le dire como quedo aunque se que va quedar mejor que a mi, estuve perdido por eso amigo es que ya me daba pena darles dolor de cabeza por algo tan simple, jajajaj amigo y tenia yo tambien que generar algo verdad? mi otra pregunta pq cuando cierro el sistema desde un boton que tiene una imagen que al dar click en el mando a cerrar el programa y me dice que la image5 que es la que puse esta siendo usando como puedo destruir todo el form para que salga por completo sin darme aviso de algo abierto y disculpeme por favor de molestarlo ya que gracias a ambos a ud y a victor manuel me han ayudado a vencer mi ignorancia ya que yo vengo del mundo de foxpro y hace poco me meti de atrevido al visual y indiscutiblemete es lo maximo en todo los sentidos amigos.

bueno mil millones de gracias por la gran ayuda
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

busqueda de un # cualquiera en un textbox

Publicado por Fidel José (558 intervenciones) el 31/05/2014 00:43:17
José Luis.
Antes que nada y, disculpa mi modo, te recomiendo que consigas un teclado que tenga puntos y comas. Me parece estar leyendo "El otoño del Patriarca".
1) No sé qué es Image5. Es un control image?. Es un archivo de imágen (bmp, jpg, png, ico)?. Cuenta algo de eso.
2) No dices cómo es tu entorno: trabajas con un form principal (ShowWindow=2) o trabajas con el Screen visible?
3) Tienes una rutina de cierre del sistema?.
4) Qué código tiene ese objeto al que le das click para que cierre la aplicación.

En el siguiente ejemplo muestro como se muestra y se cierra una aplicación basada en un form principal.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
* MAIN.PPRG
* Configuración General
* Prevención de Cierre
ON SHUTDOWN DO Shut_Thp
 
* Crea el formulario principal (desde la clase "thBackup")
ADDPROPERTY(_screen,"objBack",NEWOBJECT("frmBack",ADDBS(_screen.classdir)+"thbackup","",_screen.dapli,_Screen.Classdir))
_screen.objback.show()       && Muestra el form principal
 
READ EVENTS                       && inicia el bucle de eventos
ENDPROC
 
* Esto está en el mismo main.prg
*----------------------------
procedure Shut_Thp
*----------------------------
ON SHUTDOWN
CerrarForms()
SET COVERAGE TO
CLOSE ALL
SET PRINTER TO
CLOSE DATABASES
CLEAR EVENTS
QUIT
ENDPROC
 
 
PROCEDURE CerrarForms()
*----------------------------------------
* Cerrar cualquier formulario que quede abierto
************************************************
LOCAL lni,lnLoop
LnLoop=0
lni=_Screen.FormCount
DO WHILE _screen.FormCount > 0
	CloseForm(_Screen.FormCount)
	lnLoop=m.lnLoop+1
	IF m.lnLoop > m.lni
		EXIT
	ENDIF
ENDDO
 
RETURN _SCREEN.FormCount
ENDPROC
 
PROCEDURE closeForm(xnIndex)
*------------------------------------------------
_sCreen.Forms(xnIndex).Hide()
_sCreen.Forms(xnIndex).release()
RETURN
ENDPROC
 
 
* Formulario_Principal
* Se cierra con la [x] del ControlBox.
* Si cierras desde un control con Thisform.Release, no se ejecuta el evento QueryUnload
* Si cerras desde la [x] del formulario, no se ejecuta el método Release.
 
*<QueryUnLoad>
	LOCAL lnMess
	lnMess=MESSAGEBOX("Desea salir del sistema?",4,"ThBackUp Query")
	IF lnMess#6
		NODEFAULT
		RETURN
	ENDIF
*</QueryUnLoad>
 
*<Destroy>
	* Código de limpieza que se necesite
*</Destroy>
 
*<Unload>
	QUIT
*</Unload>
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

busqueda de un # cualquiera en un textbox

Publicado por jose luis (35 intervenciones) el 02/06/2014 18:34:03
buenas tardes es que llegue hace rato pero por aca los lunes son complicados eso es normal en cualquier trabajo.

jajajaja hermano fidel jose disculpeme el problema es sencillo yo soy malisimo con la ortografia no es que el teclado tenga o no punto y coma es que en realidad ya ni me acuerdo donde es que se ponen,

perdone ud se que es dificil de creer pero la asignatura de español jamas me entro, me gustaba mas la computacion, mire si era asi que yo no tuve que hacer prueba final para la misma pq a todas las alumnas de mi aula yo les hice su trabajo de discusion de fin de año, solo que siempre ponian en codigo de maquina una firma y por ahi mi profe se dio cuenta y me dio los 100 puntos que validaban el curso.

bueno le explico:

Mi sistema consta de varias ventanas:

1.- control de entrada
donde pido:
usuario: X
clave: XX

despues que valido el usuario es que me entra mi ventana principal del sistema ahi le pongo la imagen para que vea:



vera que tengo a la mano derecha en la parte inferior dos imagenes la imagen que tiene una cruz para mi es thisform.image5.pinture = [figura a mostrar: en este caso la bola con la x roja],

aqui le pongo el codigo que esta en el metodo click de dicho objeto:

IF wexist("Form1")
messagebox("Debe UD. primero cerrar el formulario abierto para salir.",48,"Error")
ELSE
cMessageTitle = 'Salida del programa'
cMessageText = 'Terminar por el día de Hoy?'
nDialogType = 4 + 32 + 256
* 4 = Botones Si y No
* 32 = Icono Interrogación
* 256 = Segundo botón como predeterminado
nAnswer = MESSAGEBOX(cMessageText, nDialogType, cMessageTitle)
DO CASE
* en caso de que la respuesta sea [ SI ]
CASE nAnswer = 6
CLOSE ALL
use entradas
APPEND BLANK
set filter to Ucontrol = 1
go top
replace timesalida with datetime()
replace Ucontrol with 0
release form portada
close all
*************************************************************** ojo
CLEAR all
***************************************************************
SET HELP TO
SET DEFAULT TO [d:\sistema de control de despachadores_dbf]
cancel
*quit
* no
CASE nAnswer = 7
ENDCASE
endif

nota: en donde dice ojo es donde me dice:

No se puede borrar el objeto image5 pq esta en uso

Y es cuando se chiva todo pq no sale como debe de ser, por eso le preguntaba si existe alguna forma de destruir todos los objetos de un form para poder salir del mismo sin problemas, comprende.

mis agradecimientos por adelantados por su atención y por la paciencia con mi ortografia, nuevamente le pido humildemente mis disculpas.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

busqueda de un # cualquiera en un textbox

Publicado por Fidel José (558 intervenciones) el 03/06/2014 01:49:20
José Luis:
Hay dos cosas que no veo en el cierre de programa:
1) Donde se cierra el form principal (pantalla)
2) Donde termina el bucle de eventos (CLEAR EVENTS)
Lo que te aparece como error es totalmente lógico, porque estás ejecutando una rutina de cierre dentro de un objeto que está contenido en un form activo. Y se borrará solamente si se descuelga el programa. No puedes quitar un objeto desde dentro del objeto.

Fijate en el modelo que te envié:
Con ON SHUTDOWN DO rutina_de_Cierre, obligas al sistema a ejecutar "Rutina_de_Cierre" cuando se ejecuta un QUIT (o cualquier otra cosa que lo quite).
Todo lo referente al cierre de la aplicación debe ir en la Rutina de Cierre, incluido el CLEAR EVENTS.
Entonces, justo antes de lanzar el formulario principal
ON SHUTDOWN DO Cierre
do form miformPrincipal
READ EVENTS

PROCEDURE Cierre
ON SHUTDOWN
* Registro de salida
* Control de formularios abiertos
* Cierre de todas las tablas
* Cierre de impresiones
* Etc.
CLEAR EVENTS
QUIT && si no pones este QUIT, el programa quedará boyando e inactivo.

ENDPROC


Yo intentaría lo siguiente:
a) En la image5.click(), pondría solamente:
if _screen.formcount > 1
Messagebox("Debe cerrar los formularios abiertos")
return
endif
thisform.release

b) Y en el UNload del formulario principal:
QUIT && al ejecutarse Quit, se llamara a la rutina designada en ON SHUTDOWN


Fijate también en la rutina de cierre de todos los formularios abiertos.
Recuerda que Wexist() es una función que apunta a ventanas creadas con define Window, browse, etc. En VFP tienes dos propiedades de screen: _Screen.FormCount (cantidad de forms abiertos) y _Screen.Forms(nroForm) con los cuales puedes controlar bastante. No utilices "Form1". Seguramente tu form principal no se llamará así, salvo que lo instancies con NAME. Y si lo instancias con NAME, tu name debería ser otro, por ejemplo:

public frmPrincipal
DO FORM MyFormPpal NAME frmPrincipal
Si lo haces así, puedes referirte desde cualquier punto de la interfase (excepto desde el mismo form ppal, donde es this o thisform, según la posición) como frmPrincipal.image5.Visible=.f. (por ejemplo).
Si no quieres utilizar ni una sola variable global, tienes otra solución:
Addproperty(_Screen,"frmPrincipal",null)
DO FORM myFormPPal name _screen.frmPrincipal
Donde la referencia al objeto, será _screen.frmPrincipal.Image5.visible=.T.

Lo que puedes estar seguro, si ejecutas un método o evento de un formulario, es que ese formulario existe y además está disponible (aún cuando no esté activo).
Particularmente, cuando implementas la interface en base a un form principal, ese form principal es
objFormPpal = _Screen.Forms(_screen.FormCount). Ello porque el array _Screen.Forms() desplaza las posiciones con cada formulario que se abre, de modo tal que el último abierto es el item 1 (_screen.forms(1)). Y el primero abierto, será siempre el último, que es igual a la cantidad de forms abiertos, o sea, _Screen.FormCount

Por último, recuerda que un formulario, en tiempo de ejecución, coincidirá su referencia de objeto con el nombre del archivo scx, solamente si lo lanzas desde un Command de Menu. En otro caso, el nombre será un nombre interno de Visual Fox. Puedes cambiar esto apelando a instanciar con NAME o te las tienes que rebuscar de otro modo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

busqueda de un # cualquiera en un textbox

Publicado por jose luis (35 intervenciones) el 04/06/2014 20:35:48
amigo fidel jose no veo el modelo que me envio si puede enviemelo a la cuenta daylan@fcontinuas.com.cu y en el asunto ponga para jose luis y el que recibe el correo me reenviara a mi cuenta de correo lo que ud me envie, ya que no yo no tengo cuenta internacional.

y luego le dire como nos quedo la explicacion que me acaba de dar.

gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

busqueda de un # cualquiera en un textbox

Publicado por jose luis (35 intervenciones) el 11/06/2014 21:44:22
hola amigo fidel jose todo lo ultimo que ud me explico salio maravillosamente perfecto todo esta ok mejor no pudo salir aunque ud no lo crea en el acerca de mi programa puse que gracias a la colaboracion de ud y de victor dos grandes genios de este sitio en logrado lo impensable que saliera mi primer programa de visual fox, pero amigo fidel cuando genero el punto exec y lo corro se me pierde y se mantiene vivo en los procesos pero no me corre, a ver para que me entienda el sistema comienza con el control de usuarios y claves y luego es que inicia el sistema todo ok cuando genero el exe o el app se me cuelga no sale se queda en los procesos de windows vivos pero no hace nada que creee ud que sea antes en fox yo hacia el ejecutable y listo pero aqui me e quedado sorprendido por favor alumbreme a ver cual es la metedura de pata la mia, y como siempre amigo fidel mil millones de gracias por su atencion y al mundo de la web del programador si este sitio tan magnifico nada seria mas perfecto
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

busqueda de un # cualquiera en un textbox

Publicado por Fidel José (558 intervenciones) el 11/06/2014 23:01:53
Vaya José Luis, te voy a enviar una bolsa con puntos y comas!!!
Quisiera saber si tu problema es que no genera el ejecutable o si el ejecutable no corre (o corre pero no se ve).

Si el ejecutable se genera y al correrlo queda en las sombras, intenta lo siguiente (en el main.prg)

* Donde llamas a tu form principal
ON SHUTDOWN DO Cierre
Addproperty( _Screen ,"FrmPpal" , null )
do form miformPrincipal NAME _screen.frmPpal
READ EVENTS

Bueno, el nombre del form principal que sea. Tambien la propiedad de Screen puede tener un nombre que más te guste con tal que no sea conflictivo. El nombre de la propiedad de Screen no tiene importancia, solo tiene el sentido de convertir el form en un objeto público. Tampoco necesita tener un valor, pues cuando se cargue el form tendrá como valor la referencia de objeto del formulario, por lo que desde cualquier sitio del programa puedes usar una propiedad o método del form con (por ejemplo):
lcCaption=_Screen.frmPpal.Caption
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

busqueda de un # cualquiera en un textbox

Publicado por jose luis (35 intervenciones) el 11/06/2014 23:18:14
jajajaajja amigo fidel jose tiene ud razon parece que todos quieren darme puntos y comas pero amigo mio es tan dificil comprender como ponerlas cuando uno tiene en la cabeza como arreglar otras jajajaj pero prometo antes de este fin de año aprender a colocarlas en su lugar.

mire si es que se queda colgado y no sale probare ahorita o sea mas tarde en casa su opcion y se como siempre que sera genial la respuesta amigo fidel.

gracias y disculpe a este probe por ser comelon de punto y comas
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

busqueda de un # cualquiera en un textbox

Publicado por jose luis (35 intervenciones) el 12/06/2014 17:51:15
amigo fidel salio barbaro ademas logre que el ambiente de fox se ocultara con la instruccion _screen.visible=.f. y asi logre que el splash saliera lindisimo y la clave tambien lo logre tambien tuve que copiar todas las dll del vfp 9 al system32 pq hubo un momento de que ya logre hacerlo pero pedia las dll y se las puse ahi en fin amigo fidel somos unos mostruos en eso de ud profesor y yo de alumno en serio en verdad ud es medico caramba amigo mio es increible lo que ud sabe yo le hubiera dado de ya el titulo de master en programacion en serio sin broma pq es asi quizas le diseñe un titulo y se lo envie a su correo para que lo cuelgue en la sala de su casa.

pero le pregunto e visto por aca por el forum hablando del camino y no se como hacer que el sistema corra en cualquier unidad y carpeta como es?

y a partir de hoy lo nombrare maestro mayor del sitio.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

busqueda de un # cualquiera en un textbox

Publicado por Fidel José (558 intervenciones) el 12/06/2014 21:07:42
José Luis
Ya déjate con eso de Maestro!!!

Te digo dos cosas:
1) Te conviene utilizar el archivo config.fpw , que aunque sea, tenga una linea.
SCREEN = OFF
2) Necesitas crear una tabla local donde conservas la ruta de datos, si es que distribuyes la aplicación que es lo más recomendable.

Lo puedes crear en el main.prg con algo así:
Revisa el código. La mayor parte está copiado de alguna aplicación, pero yo no revisé este envío.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
*<Main.prg después de los SET command>
 
* Con esto determinas la carpeta de arranque del sistema con su path
* Por ejemplo, lcDir=MiCurdir()
* ? lcDir ->  "c:\develop\sistema1"
 
Addproperty(_Screen,"dapli",MiCurdir())
AddProperty(_Screen,"Datos","")                  && creas esta propiedad. Luego le asignarás un valor
TestConfig()                                                      && verifica si existe config.fpw
GetWay()                                                            && obtiene la ruta donde están las tablas y dbc.
 
* Ahora siguen las instrucciones ON SHUTDOWN y lo demás
 
 
* A partir de acá, las tablas las debes abrir con el path completo
* Use Addbs(_screen.datos)+TalTabla in 0 EXCLUSIVE
* Generalmente vas a usar un programa que abra las tablas, por ejemplo
lREsult = AbrirDbf( _screen.datos , "clientes")
 
*<AbrirTablas>
*---------------------------------------------------------
PROCEDURE AbrirDbf
LPARAMETERS tcPath, tcTabla, tlExclusive
* --------------------------------------------------------
* tcPath: Ruta de la tabla
* Podrá ser _Screen.Datos, pero también cualquier otra
* por ejemplo _Screen.dapli
* tcTabla: Nombre de la tabla dbf
* tlExclusive: Si se necesita abrir en modo exclusivo, .T.
 
* si se omite el primer parámetro toma _screen.datos como valor
IF VARTYPE(tcPath)#"C" OR EMPTY(TcPath)
	tcPath=_screen.datos
ENDIF
 
* programación defensiva
IF EMPTY(tcTabla)
	MESSAGEBOX("debe indicar el nombre de la tabla")
	RETURN .f.
ENDIF
 
 
local lcPath,lcUse
lcUse=ADDBS(tcPath)+tcTabla
IF USED(tcTabla)
	RETURN .t.
ENDIF
IF !FILE(FORCEEXT(lcUse,"dbf")
	MESSAGEBOX("La tabla "+lcUse+" no existe")
	RETURN .f.
ENDIF
 
TRY
	LOCAL loex as Exception
	if tlExclusive
		USE (lcUse) IN  0 EXCLUSIVE
	ELSE
		USE (lcUse) IN 0 SHARED
	ENDIF
CATCH TO loEx
	loEx.UserValue=PROGRAM()
	lReturn=.f.
	* ShowError(LoEx)	Rutina que muestra errores
FINALLY
 
ENDTRY
 
RETURN lReturn
 *<AbrirTablas>
 
 
*<Determinar directorio del programa>
***************************
PROCEDURE MiCurdir
***************************
LPARAMETERS lVerbose
* lVerbose .t. informa
* Determinar el directorio actual por Wscript
**********************************************
LOCAL cdir , objShell
objShell=CreateObject("Wscript.Shell")
cDir=objShell.CurrentDirectory
if lVerbose
	Messagebox(cDir,0,"Directorio Actual")
endif
objShell=null
IF RIGHT(cdir,1)="\"
	cdir=SUBSTR(cdir,1,LEN(cdir)-1)
endif
return cDir
ENDFUNC
*</Determinar directorio del programa>
 
*<Crear archif config.fpw si no existe>
PROCEDURE TESTCONFIG
*---------------------------------------
local crf , nfop
crf=addbs(_SCREEN.dapli)+"config.fpw"
if !file(crf)
	nfop=fcreate(crf)
	=fputs(nfop,"* CONFIG.FPW for \THEOCALC\")
	=fputs(nfop,"SCREEN = OFF")
	=fputs(nfop,"TITLE = Theodore Calculadora")
	=fputs(nfop,[_STARTUP = ""])
	=fputs(nfop,[_BROWSER = ""])
	=fputs(nfop,[_SPELLCHK = ""])
	=fputs(nfop,[_GENMENU = ""])
	=fputs(nfop,[_GENGRAPH = ""])
	=fputs(nfop,[_GENXTAB = ""])
	=fputs(nfop,[_COVERAGE = ""])
	=fputs(nfop,[_SCCTEXT = ""])
	=fputs(nfop,[_CONVERTER = ""])
	=fputs(nfop,[_TRANSPORTER = ""])
	=fputs(nfop,[_BUILDER = ""])
	=fputs(nfop,[_WIZARD = ""])
	=fputs(nfop,"MVCOUNT = 1025")
	=fputs(nfop,"OUTSHOW = ON")
	=fputs(nfop,"RESOURCE = OFF")
	=fputs(nfop,"_THROTTLE = 0")
	=fputs(nfop,"TALK = OFF")
	=fputs(nfop,"MULTILOCKS = ON")
	=fputs(nfop,"EXCLUSIVE = OFF")
	=fputs(nfop,"SAFETY = OFF")
 
	=fclose(nfop)
ENDIF
*</Crear archif config.fpw si no existe>
 
*<Ruta de tablas y bases de datos>
* PROCEDURE GETWAY
****************************
* Supongamos que tenemos una tabla llamada "Accedat.dbf"
* en la cual guardamos la ruta de acceso a datos
LOCAL lcTabla,lcDir
lcTabla=ADDBS(_screen.dapli)+"Accedat.dbf"
IF !FILE(lcTabla)
	CREATE TABLE &lcTabla FREE ;
	("RUTADATOS" C(100))
	SELECT ACCEDAT
	USE
ENDIF
USE (LcTabla) IN 0 EXCLUSIVE
SELECT accedat
GO top
IF EOF()
	APPEND BLANK
ENDIF
IF EMPTY(RUTADATOS)
	lcDir=GETDIR(FULLPATH(""),"Carpeta de Datos","Inicio del Sistema",48)
	IF EMPTY(lcdir)
		SELECT accedat
		USE
		MESSAGEBOX("No podrá usar la aplicación")
		QUIT
	ENDIF
 
	SELECT accedat
	replace rutadatos WITH lcDir
ENDIF
LcDir=ALLTRIM(rutadatos)
IF !DIRECTORY(lcDir)
	MESSAGEBOX("La Ruta de datos ha desaparecido o es incorrecta")
	replace rutadatos WITH ""
	USE
	QUIT
ENDIF
SELECT ACCEDIR
USE
* Acá se puede poner algún test para ver si la ruta es correcta
* Generalmente se testea si existe un archivo típico.
_screen.datos=lcDir
ENDPROC
*</Ruta de tablas y bases de datos>
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

busqueda de un # cualquiera en un textbox

Publicado por jose luis (35 intervenciones) el 13/06/2014 20:36:58
hola fidel jose hoy fue que pude ver tu explicacion pq ayer se nos fue la luz y menos mal que fue despues de que brasil ganara ya te podras imaginar si hubiera sido al reves amigo mio mataba a los de la compañia electrica jajajajajajaajaj ya el lunes le contare y disculpe por lo de maestro es que soy muy justo y agradecido pero tranquilo amigo mio le pormeto no decirle mas maestro mayor mis respetos y aprecio bueno de seguro le contare el lunes, que pase un buen fin de semana y nada a divertise con el mudial del brasil ojala que hubiera podido ir pero ese es otra historia mas de la odisea cubana.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar