FoxPro/Visual FoxPro - pasar texto a un texbox que esta en otro formulario.

   
Vista:

pasar texto a un texbox que esta en otro formulario.

Publicado por lorena lorenaferrai@latinmail.com (13 intervenciones) el 05/11/2015 00:46:33
Hola gente , yo de nuevo .
Mi problema lo e visto en un millon de preguntas en varios foros , incluso aca pero no es mi caso o no la entiendo

paso explicar
tengo un formulario inicial , de ahi voy a dos diferentes
el primero es un form. que tiene un texbox donde le voy escribiendo texto . cuando finalizo de escribir tengo un boton que guarda todas las palabras nuevas . hasta aca sin problemas .
Ahora tengo una variable que carga las palabras repetidas y esto lo hace perfecto .
lo que quiero es que a medida que va encontrando palabras repetidas quiero que las mande a otro texbox que esta en otro formulario , entonces cuando dejo este formulario , voy al inicial de nuevo y ahi paso a el otro a ver cuantas palabras tengo en el texbox .
Es medio raro este trabajo pero es un deber que tengo que hacer para la proxima semana .

yo hice algo asi :

formulario_destino.texbox.value = formulario_destino.texbox.value + Var_palabra_repetida
error no me da pero en el texbox del otro form no aparece nada .
En resumen solo necesito que el contenido de una variable se vaya acumulando en un texbox de otro form

Muchas gracias desde ya .
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

pasar texto a un texbox que esta en otro formulario.

Publicado por Juan R. (100 intervenciones) el 05/11/2015 00:54:26
Buenas Lorena

Puedes probar a guardarlo en la propiedad .Caption del _Screen. Entonces sería algo así:

_Screen.Caption.Value = Var_palabra_repetida

Después en tu formulario destino lo recuperarías así:

ThisForm.textbox.value = _Screen.Caption

Digo esto porque normalmente los ejecutables no suele verse la Ventana de FoxPro, entonces porque variase no debería haber problemas, no?

Un saludo y espero que te sirva
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

pasar texto a un texbox que esta en otro formulario.

Publicado por lorena (13 intervenciones) el 05/11/2015 01:38:14
eso podria ser si fuese un solo palabra pero si son 20 o 30 o mas de una no se podria
no te olvides que se van acumulando y al finalizar recien abriria el form donde llegaron todas las palabras repetidas .
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

pasar texto a un texbox que esta en otro formulario.

Publicado por Juan R. (100 intervenciones) el 05/11/2015 17:32:53
Siempre podrías ir sumándolas así:

_Screen.Caption.Value = _Screen.Caption + Var_palabra_repetida;

Eso sí, si son muchísimas puede ser que no te sirva porque no recuerdo ahora cual es el límite de caracteres de un Caption.

De todas formas, prueba como te dice Abel que lo mismo si sólo te falta un Refresh, no tienes que añadir una sola línea más.

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
Imágen de perfil de Abel

pasar texto a un texbox que esta en otro formulario.

Publicado por Abel (23 intervenciones) el 05/11/2015 13:54:16
Podrías hacer lo siguiente..

El el método Init del formulario destino (Form_final) podrías escribir lo siguiente:

thisform.addproperty("Sumpalabras",'')

luego en el textbox o editbox (que también está en form_final) donde verás la totalidad de palabras; en la propiedad "ControlSource" escribes Thisform.Sumpalabras

En tu formulario de origen, donde se forman las nuevas palabras escribes ..

Form_final.sumpalabras = form_final.sumpalabras + var_palabra_nueva

con esto estarás haciendo referencia a la propiedad del formulario final desde tu formulario inicial.

Con esto será automática la carga de un valor y reflejada en el otro, aunque posiblemente debes usar el método refresh para verlo inmediatamente, por ej.

form_final.refresh
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

pasar texto a un texbox que esta en otro formulario.

Publicado por lorena (13 intervenciones) el 05/11/2015 18:47:25
Probe con este codigo y no me dio error pero tampoco funciono .
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
Imágen de perfil de Abel

pasar texto a un texbox que esta en otro formulario.

Publicado por Abel (23 intervenciones) el 06/11/2015 13:57:28
Si quisieras podría ayudarte más Lorena, solo dime que error te da ese código, por que lo he probado y funciona perfecto. Pero necesitaría más inforamación.

Por otro lado la forma que lo estabas haciendo está bien solo deberías hacer un refresh de tu formulario de destino y estaría.
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
Imágen de perfil de Abel

pasar texto a un texbox que esta en otro formulario.

Publicado por Abel (23 intervenciones) el 05/11/2015 14:04:44
Perdona Lorena, leí muy deprisa tu mensaje y respondí del mismo modo lo que veo es que lo que hiciste está bien, deberías ver reflejado el valor/valores; posiblemente te haga falta usar el Refresh solamente.
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

pasar texto a un texbox que esta en otro formulario.

Publicado por Fidel José (319 intervenciones) el 06/11/2015 18:27:42
A) Lo que se necesita saber es:
1) Si el form donde está la consulta de palabras repetidas se lanza antes o después del conteo de palabras
2) Si el form donde está la consulta de palabras repetidas se lanza desde un command de menu o desde otro sitio (procedure de menu, método de form, etc)
3) Si el form no tiene un scx y se crea al vuelo (ver Modelo Simple, más abajo.)

Si se lanza antes, podés atacar el .Value del cuadro pertienente en el form de consulta solamente si sabés qué nombre toma este formulario, lo que también depende de cómo se lo llame.
1) Asignanando un nombre al form:
Addproperty(Thisform,"oformDestino",null)
DO FORM Formulario_Destino NAME Thisform.oFormDestino

2) Detectando el nombre que toma, utilizando el array _Screen.Forms() y sabiendo que cada form que se crea se coloca como primer elemento de dicho array:
ADdproperty(Thisform,"oFormDestino",null)
lnFormCount = _Screen.formCount
DO FORM Formulario_Destino
if _Screen.FormCount > lnformCount
thisform.oFormDestino = _Screen.Forms(1)
endif

* Luego, para actualizar el valor del objeto
Thisform.oFormDestino.Edit1.value = lcPalabrasRepetidas


Si se lanza después del conteo de palabras, puede ocurrir que el form de consulta sea modal o no, pero de todos modos lo correcto sería usar un parámetro.
DO FORM formulario_destino with lcPalabraRepetidas
* INIT del form Formulario_Destino
LPARAMETERS tcPalabrasRepetidas
This.Edit1.Value = tcPalabrasRepetidas


B) Sugerencia:
1) La forma más clara de mostrar palabras repetidas es con un EditBox, para lo cual, la variable de acumulación deberá utilizar separadores CHR(13):

2) Aunque se puede usar la propiedad .Text de un EditBox para detectar el contenido, me parece mejor idea utilizar una propiedad o variable de acumulación, o incluso un archivo de texto plano creado con StrTofile(lcString,lcNameFile , 1)

Para actualizar el valor de un control con el contenido de un archivo plano:
Thisform.Control.Value = FileToStr(lcNameFile)

Modelo Simple
1 Form con un EditBox para ingresar el texto y un botón de llamada a la consulta
En el form agregamos las propiedades "Nuevas" y "Repetidas".
En el form agreagamos un método llamado "ContarPalabras"

Código para el Editbox:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
* GotFocus
IF EMPTY(this.Text)
	thisform.nuevas=""
	thisform.repetidas=""
ENDIF
 
* KeyPress
LPARAMETERS nKeyCode, nShiftAltCtrl
IF nKeyCode = 13
	thisform.Contarpalabras(This)
ENDIF
 
* LostFocus
thisform.Contarpalabras(This)

Método Contar Palabras
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
* ContarPalabas (Method)
LPARAMETERS toEdit
*<DefineConstants>
#DEFINE _TAB_		CHR(9)
#DEFINE _CL_		CHR(10)
#DEFINE _CR_		CHR(13)
#DEFINE _SPA_		CHR(32)
#DEFINE _COMA_		","
#DEFINE _PUNTO_		"."
#DEFINE _PUNCOMA_	";"
#DEFINE _DOSPUN_	":"
#DEFINE _COMID_		CHR(34)
#DEFINE _COMIS_		CHR(39)
#DEFINE _PAROP_		CHR(40)
#DEFINE _PARCLO_	CHR(41)
#DEFINE _BRAKOP_	CHR(91)
#DEFINE _BRAKCLO_	CHR(93)
*</DefineConstants>
 
*<DeclareLocals>
LOCAL lcNuevas,;
		lcRepetidas,;
		lcReempla,;
		lnWords,;
		i,;
		lctype,;
		lcString,;
		loReturn as Object
 
LOCAL ARRAY laWords(1)
*</DeclareLocals>
 
*<CheckParameters>
lcType = VARTYPE(toEdit)
DO CASE
	CASE m.lctype = "O"
               * May be an Editbox Object
		lcString = toEdit.Text
	CASE m.lcType ="C"
		IF FILE(m.toEdit)
			* May be a file
			lcString = FILETOSTR(m.toEdit)
		ELSE
			* May be a Character Variable
			lcString = m.toEdit
		ENDIF
	OTHERWISE
		lcString = ""
ENDCASE
*</CheckParameters>
 
*<AssignValues>
lcNuevas = CHR(13)
lcRepetidas = CHR(13)
lcReempla = _COMA_+_PUNTO_+_PUNCOMA_+_DOSPUN_+_COMID_+_COMIS_ + _PAROP_ + _PARCLO_ + _BRAKOP_ + _BRAKCLO_
*</AssignValues>
 
*<DetectWords>
lnWords = ALINES(laWords, LOWER(CHRTRAN(m.lcString , m.lcReempla , _SPA_ )) , 1+4 , _TAB_,_CL_,_CR_,_SPA_ )
IF lnWords > 0
	ASORT(laWords)
ENDIF
FOR i=1 TO lnWords
	IF ATC(_CR_ + laWords[i] + _CR_ , m.lcNuevas ) = 0
		lcNuevas = m.lcNuevas ;
			+ laWords[i] + _CR_
	ELSE
		IF ATC(_CR_ + laWords[i] + _CR_ , m.lcRepetidas ) = 0
			lcRepetidas = m.lcRepetidas ;
				+ laWords[i] + _CR_
		ENDIF
	ENDIF
NEXT
*</DetectWords>
 
*<CreateReturnValue>
lcNuevas = SUBSTR(m.lcNuevas,2)
lcRepetidas = SUBSTR(m.lcRepetidas,2)
IF PEMSTATUS(Thisform,"nuevas",5) AND PEMSTATUS(Thisform,"repetidas",5)
	WITH thisform
		.nuevas = .nuevas + m.lcNUevas
		.repetidas = .repetidas + m.lcRepetidas
	ENDWITH
 
ENDIF
 
* Return an object with 3 Properties: "Nueva","Repetidas" y "Count"
loReturn = NEWOBJECT("empty")
ADDPROPERTY(loReturn,"Nuevas",m.lcNuevas)
ADDPROPERTY(loReturn,"Repetidas",m.lcRepetidas)
ADDPROPERTY(loReturn,"Count",m.lnWords)
*</CreateReturnValue>
 
RETURN loReturn

Código del botón que llama a la consulta:
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
oForm = NEWOBJECT("Form")
WITH oform
	.Caption = "Palabras Repetidas"
	.Height = 300
	.Width = 400
	.MaxWidth = 400
	.MinWidth = 400
	.MinHeight = 100
	.backcolor = RGB(184,201,197)
	.AutoCenter = .t.
ENDWITH
oform.newobject("edt_Repetidas","Editbox")
oform.newObject("edt_Nuevas","Editbox")
WITH oform.edt_Repetidas
	.top = 3
	.left = 3
	.Height = 280
	.Width = 190
	.SpecialEffect = 1
	.BorderColor = RGB(114,136,141)
	.Readonly = .t.
	.DisabledBackcolor=RGB(255,255,255)
	.Value = thisform.repetidas
	.visible=.t.
	.Anchor = 5
ENDWITH
WITH oform.edt_Nuevas
	.top = 3
	.left = 203
	.Height = 280
	.Width = 190
	.SpecialEffect = 1
	.BorderColor = RGB(114,136,141)
	.Readonly = .t.
	.DisabledBackcolor=RGB(255,255,255)
	.Value = thisform.nuevas
	.Visible = .t.
	.Anchor = 5
ENDWITH
 
oform.Show(1)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
3
Comentar

pasar texto a un texbox que esta en otro formulario.

Publicado por Juan R. (100 intervenciones) el 07/11/2015 00:45:12
Qué crack Fidel! Lo del archivo es lo más sencillo que se le puede ocurrir a uno y no se me había pasado ni por la cabeza.
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

pasar texto a un texbox que esta en otro formulario.

Publicado por lorena (13 intervenciones) el 07/11/2015 02:16:59
Amigo Fidel Es usted un FENOMENO con mayusculas . El codigo que se mando , por dios .
Creo que interpreto el problema como mas dificil de lo que es .
Lo que no se si habia leido es que yo soy estudiante y ese codigo que me mando me supera por todos lados y no se como agradezerle la molestia que se tomo .

El asunto es mas sencillo de lo que parece solo que no lo se hacer yo jaja .
Tengo un formulario que analiza un texto que le pego , supongamos una cancion .
Entro al texbox pego la cancion .
Luego tengo un boton que que va leyendo las palabras de la cancion hasta que encuentra un espacio o punto o algo que no sea letra .
Un vez que detecto que se termino la palabra que a su vez se fue cargando en una variable va a una tabla a ver si la palabra existe .
"voy a cambiar para que sea mas claro lo que quiero "

si la palabra esta
todo bien
seguir con la proxima
si no
en vez de darle de alta , la envio a otro lugrar que a mi se me ocurrio podria ser otro form con un texbox , por que despues que
deje de pegar texto o meter palabras voy a ir a ese lugrar donde las guarde y voy a selecionar cuales doy de alta .
Lo ideal podria ser un grid donde ir marcando las que me interesan grabar . peroese es un tema para despues .
Por que esto? por que puede haber palabras con faltas de ortografia que se interpreto que eran nuevas y en realidad no lo son

Fin

Despues , el problema de los puntos espacios y demas me animo a resolverlos y si no preguntare jaja .
DESDE YA MUCHAS 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

pasar texto a un texbox que esta en otro formulario.

Publicado por Fidel José (319 intervenciones) el 07/11/2015 18:01:40
Lorena
Acá te envío un parser, al que le podés pasar como parámetro una cadena para anlizar o el nombre de un archivo de texto plano.
Sería bueno que lo metas en algún método de un form o clase, o un prg y analices sus partes y lo que determina. Fijate que la función Alines() consigue hacer muy fácil lo que estás buscando.

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
PROCEDURE WORD_PARSER
LPARAMETERS tcString
 
* tcString may be a Text File or a String
 
IF VARTYPE(tcSTring)#"C"
	RETURN ""
ENDIF
 
IF FILE(tcString)
	tcSTring = FILETOSTR(tcString)
ENDIF
 
 
LOCAL lcString,lcLetras,lcSpecial,lcPut,i,;
	lnDim,;
	lnWords,;
	lnMaxLenght,;
	lnMaxCount
 
LOCAL ARRAY laUsedWords(1,2),laWords(1)
lnDim = 0
 
*<Determinar las letras>
lcLetras=""
* UpperCase
FOR i = 65 TO 90
	lcLetras = lcLetras + CHR(i)
NEXT
 
* LowerCase
FOR i= 97 TO 122
	lcLetras = lcletras + CHR(i)
NEXT
 
* Ñ ñ
lcLetras = lcLetras + CHR(209) + CHR(241)
 
FOR i = 192 TO 197
	lcLetras = lcLetras + CHR(i)
NEXT
 
FOR i = 200 TO 207
	lcLetras = lcLetras + CHR(i)
NEXT
 
FOR i = 210 TO 214
	lcLetras = lcLetras + CHR(i)
NEXT
 
FOR i = 217 TO 220
	lcLetras = lcLetras + CHR(i)
NEXT
 
FOR i = 224 TO 228
	lcLetras = lcLetras + CHR(i)
NEXT
FOR i = 232 TO 235
	lcLetras = lcLetras + CHR(i)
NEXT
 
FOR i = 236 TO 239
	lcLetras = lcLetras + CHR(i)
NEXT
 
FOR i = 242 TO 246
	lcLetras = lcLetras + CHR(i)
NEXT
 
FOR i = 249 TO 252
	lcLetras = lcLetras + CHR(i)
NEXT
*</Determinar las letras>
 
*<Determinar caracteres especiales>
lcSpecial = ""
FOR i=1 TO 8
	lcSpecial = lcSpecial + CHR(i)+CHR(11)+CHR(12)
NEXT
 
FOR i= 14 TO 31
	lcSpecial = lcSpecial + CHR(i)
NEXT
 
FOR i = 33 TO 255
	lcChar = CHR(i)
	IF AT(lcChar,m.lcLetras) = 0
		lcSpecial = lcSpecial + lcChar
	ENDIF
NEXT
*</Determinar caracteres especiales>
 
* Reemplazamos todosl los caracteres especiales por espacio en blanco.
lcString = CHRTRAN(tcSTring , m.lcSpecial, CHR(32) )
 
* Generamos una array (laWords) donde cada elemento es una palabra
lnWords = ALINES(laWords , LOWER( m.lcString ) , 1 + 4 ,CHR(9) ,CHR(10),CHR(13),CHR(32) )
 
*<Armar una cadena para devolución>
lcWords = ""
lnMaxLenght = 0
lnMaxCount = 0
FOR i= 1 TO lnWords
	lcWords = lcWords ;
		+laWords[i]+ CHR(13)
 
	lnAscan = ASCAN(laUsedWords , laWords[i],1,0,0,7)
	IF lnAscan = 0
		lnDim = lndim + 1
		DIMENSION laUsedWords(lnDim,2)
		laUsedWords[lnDim,1]=laWords[i]
		laUsedWords[lnDim,2]= 1
		lnMaxLenght = MAX(lnMaxLenght , LEN(laWords[i]))
	ELSE
		laUsedWords[lnAscan + 1 ] = laUsedWords[lnAscan + 1 ] + 1
		lnMaxCount = MAX(lnMaxCount , laUsedWords[lnAScan + 1] )
	ENDIF
 
NEXT
 
*</Armar una cadena para devolución>
 
*<Generar Texto de Informe>
lcPut = "<tcString>"+CHR(13);
	+tcString + CHR(13) ;
	+"</tcString>"+CHR(13)+CHR(13) ;
	+"<lcString>" + CHR(13);
	+lcString + CHR(13);
	+"</lcString>"+CHR(13)+CHR(13);
	+"<Words>"+CHR(13)
 
FOR i=1 TO m.lnWords
	lcPut = lcPut + CHR(9) + laWords[i] + CHR(13)
NEXT
lcPut = lcPut + "</Words>"+CHR(13)+CHR(13);
	+"<UsedWords>"+CHR(13);
	+ CHR(9)+"<Count>"+TRANSFORM(m.lnDim)+"</Count>"+CHR(13);
	+ CHR(9)+"<List>"+CHR(13)
 
FOR i=1 TO m.lndim
	lcPut = lcPut ;
		+ REPLICATE(CHR(9),2);
			+PADR(laUsedWords[i,1],lnMaxLenght+1, CHR(32)) ;
			+TRANSFORM(laUsedWords[i,2],REPLICATE("9",lnMaxCount)) ;
			+CHR(13)
NEXT
lcPut = lcPut ;
	+CHR(9)+"</List>" + CHR(13);
	+"</UsedWords>" + CHR(13)
 
 
*</Generar Texto de Informe>
 
STRTOFILE(m.lcPut ,"WordParser.txt")
 
MODIFY FILE WordParser.txt NOEDIT
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

pasar texto a un texbox que esta en otro formulario.

Publicado por lorena (13 intervenciones) el 09/11/2015 19:02:39
Amigo Fidel
Sus respuestas son exelentes y muy sofisticadas pero exeden mi conocimiento .
Yo ya tengo echo la parte que analiza el texto , y no lo puedo cambiar por que fue echo en la clase , bien .
la parte que arma la palabra hasta que la carga en una varianble la tengo echa
Luego con esa variable veo si esta esa palabra dentro del archivo de palabras hasta ahi bien .
ahora : yo podria hacer dentro de este mismo formulario un texbox que fuera guardando las palabras nuevas
texbox = texbox + variable . pero esto texbox no lo puedo mostrar en mi form por que no tiengo espacio donde colocarlo .
Aqui va el problema que me surge . donde lo pongo y como lo visualiso .
Se me ocurre otro form , pero como mando el contenido del texbox para trabajarlo , ese es mi problema .
en principio intente mandar el contenido de la varible directo al texbox del formulario nuevo , pero no pude ,
Supongo que es una pavada , pero no e podido .
De todas formas no se como agradecer todo lo que me has enviado .

Muchas 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

pasar texto a un texbox que esta en otro formulario.

Publicado por Fidel José (319 intervenciones) el 10/11/2015 00:00:19
Si tienes un form (en scx, "MiForm_Repetidas") con un EditBox para mostrar las palabras repetidas, necesitarás hacer dos cosas:
1) Conformación de la variable que se enviará al Editbox: lista separada por CHR(13). Esto es necesario para que las palabras se muestren una debajo de otra.

lcStringRepetidas = ""

* Cuando, según tu método determinas que hay una palabrar repetida: (lcPalabraRepetida)
lcStringRepetidas = lcStringRepetidas + lcPalabraRepetida + CHR(13)

2) Cómo enviar la variable al form:
2.1) Detectando la referencia de objeto al crear el form:
lnFormCount = _SCREEN.FORMCOUNT && guardo cuantos forms hay abiertos
DO FORM Miform_Repetidas && instancio el form
if _screen.FormCount > lnFormCount && si aumentó la cantidad de forms es porque se instanció el llamado
oReference = _screen.Forms(1) && guardo la referencia al objeto form instanciado
oReference.Edit1.Value = lcStringRepetidas && uso la referencia para actualizar el Edit1 (Editbox)-
endif


2.2) Creando (diseñador de formularios) un parámetro en el form MiForm_repetidas
*[Init del form ]
LPARAMETERS tcString
Thisform.Edit1.Value = EVL( tcString , "")
* Si se omite enviar el parámetro, tcString tomará el valor (.F.). Se utiliza EVL() para evitar que produzca un error, porque el value del EditBox no acepta un valor que no sea cadena. También se puede hacer lo siguiente:
LPARAMETERS tcString
IF VARTYPE(tcString) # "C" && SI el tipo de valor no es character, asignar la cadena vacía.
tcString = ""
ENDIF

* Al instanciar el form, enviamos el parámetro con la cláusula WITH

DO FORM MIForm_Repetidas WITH lcStringRepetidas
* No hay otra forma de enviar un parámetro al INIT de un form creado como SCX.

Cualquiera de las dos formas funciona, aunque generalmente resulta más clara la segunda. La primera responde más a la programación orientada a objetos. La segunda a la programación estructurada.

NOTA:
Tenés que tener en cuenta dos cosas:
a) que, cuando se instancia un form se ejecutan sucesivamente los siguientes eventos:
Load && en este evento no hay ningún objeto creado, pero si propiedades y métodos del form
Init && se corren los Init de todos los objetos incrustados y luego el Init del form, por lo que todos los objetos son
&& atacables desde el Init del form.
Show && muestra el formulario, salvo que se instancie con la cláusula NOSHOW
Activate && disparado en la instanciación por Show, pero este evento puede ocurrir muchas veces.

b) Que cuando ejecutas un DO FORM talFormulario desde un procedure, method, event, etc, y cualquier otro punto que no sea un command de Menú, el formulario no tendrá el nombre del archivo scx.
No obstante el nombre se puede asignar al instanciar el form:
Por ejemplo:

Addproperty(thisform,"Mis_repetidas", null) && agrega una propiedad al form en tiempo de ejecución.
DO FORM MiForm_Repetidas NAME Thisform.Mis_repetidas NOSHOW && No se muestra el form

Luego, en cualquier punto del formulario puedes poner:
Thisform.Mis_Repetidas.Edit1.Value = lcStringRepetidas && donde Thisform.Mis_Repetidas es la referencia de objeto del otro form.
Thisform.Mis_Repetidas.Show() && ahora muestro el formulario.

Thisform.Mis_Repetidas.Release && libera el form (dispara los métodos Destroy y Unload)

Fijate que, suponiendo que el formulario creado no tenga modo (WindowType=0), éste podría quedar abierto al cerrar el formulario que lo llamó. Entonces, el Destroy del formulario que llama, podemos poner:
IF VARTYPE(thisform.Mis_repetidas)= "O" && primero verificamos que aún esté instanciado.
thisform.Mis_repetidas.release
ENDIF

También debes tener en cuenta que, si cierras un formulario con la cruz de cierre, se ejecuta el método QueryUnLoad y no se ejecuta el método Release(). Siempre se ejecutan Destroy y Unload en ese orden.




Por eso, para enviar un parámetro a l init del form, se debe hacer en el momento de la instanciación. Si el formulario ya está instanciado, la única manera es guardar la referencia de objeto.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar