A Cerca De Controles En Distintos Formularios


Objetivo: A Cerca De Controles En Distintos Formularios
Hola, hace poco tiempo que migré a Linux y lo que más de adapta a mis necesidades es gambas. Pues bien, tengo dos formularios, el primer formulario sirve para especificar el contenido de un Label y un Socket de un formulario distinto, entonces lo que quiero es establecer el valor de esos dos desde otro formulario, pero cuando intento hacerlo salta un error diciendo Unknown symbol 'Socket1' in class 'Form1'.
El formulario principal es FMain y el secundario Form1.
Tengo éste codigo:

PUBLIC SUB Button1_Click()
Form1.Socket1.Host = Val(TextBox2.Text)
ME.hide
Form1.Show
END

Edit:
Uso gb.gui, Gnome, gambas 2.21, y mi sistema operativo es Ubuntu 10.10

última edición por messerschmitt el Sabado, 16 Abril 2011, 11:54; editado 2 veces
Perfil MP  
Objetivo: Re: A Cerca De Controles En Distintos Formularios
Hola.

¿has activado en las propiedades del proyecto, que los controles son públicos en todos los formularios?

última edición por pittusa el Sabado, 16 Abril 2011, 11:58; editado 1 vez
Objetivo: Re: A Cerca De Controles En Distintos Formularios
No
Muchas gracias, ya está resuelto

Perfil MP  
Objetivo: Re: A Cerca De Controles En Distintos Formularios
De todas formas hay algo que conviene tener claro.

En gambas por defecto los controles no son públicos y eso tiene una razón. No es nada conveniente usar controles públicos porque lleva a una programación mal estructurada.

¿Como solucionar eso?
Pues hay varias maneras. Te explico rápidamente como pasar parámetros de un formulario a otro

Crear un formulario y pasarle unos parámetros con los que tiene que operar
Supongamos que tengo un formulario con los datos de conexión. Son un conjunto de textboxes donde el uuario escribe lo que quiera y luego hay un botón CONECTAR.

El objetivo es que al darle a conectar se cree otro formulario con los parámetros apropiados y se establezca la conexión.
private sub Conectar()
Dim F as NEW FormConexion(textbox1.text, textbox2.text,textbox3.text)
F.showmodal()
end

Creo la instancia enviando el contenido de tres textboxes como parámetros. El método especial _new se inicia al iniciarse el formulario y puede recibir parámetros (en este caso tres)

En el formulario FormConexion tengo lo siguiente para recibir esos parámetros
private S as new socket
private Mensaje as string
public sub _new(direccion as string, puerto as string, mens as string)
S.Host=direccion
S.port=puerto
Mensaje=mens
if conectar() then
enviar(mensaje)
endif
end

Al iniciarse el formulario se crea un socket, se le dan los parámetros apropiados y se llama a una función conectar que se ocupa de eso. Esa función devuelve true o false. Si es true se envía el mensaje.

En este caso es muy probable que queramos que al cerrar el formulario formConectar se cierre la conexión creada. El método especial _free se inicia al descargarse el formulario.
public sub _free()
S.close
end


Crear un formulario y crearle unas propiedades específicas y un método para enviar
Volvamos al caso de antes. Unos textboxes para escribir los parámetros y un botón conectar. Al pulsar el botón se envían esos parámetros, se establece la conexión y se envía el mensaje
private sub Conectar()
Dim F as new FormConectar 'esta vez no le envío parámetros
F.Direccion=textbox1.text 'a la propiedad Direccion le doy el primer valor
F.Puerto=textbox2.text 'a la propiedad puerto le doy el segundo valor
F.enviar(textbox3.text) 'llamo al método enviar y le paso como parámetro el mensaje a enviar
end


En el formulario FormConectar()
'definir variables a nivel de formulario
private Dir as string
private Puer as string

'definir las propiedades
property Direccion as string 'en el write ponemos Dir=value
property Puerto as string 'en el write ponemos Puer=value

'definir el método enviar
public sub Enviar(Mensaje as string)
private S as new socket
S.Host=Dir
S.Port=Puer
if Conectar(S) then
EnviarMensaje(S,Mensaje)
endif
end

La función Conectar intenta realizar la conexión y la rutina enviar envía el mensaje

private function Conectar(S as socket) as boolean
dim valido as boolean
S.connect()
...
return valido
end


La rutina enviar se ejecuta solo si el socket está conectado y lo que hace es envier el mensaje
private EnviarMensaje(S as socket, Mensaje as string)
write #S,Mensaje,len(Mensaje)
end


En este segundo caso podría haber definido S a nivel de formulario. Como no lo hice lo declaro en una función y solo existe ahí así que se lo tengo que pasar como parámetro a las funciones de conectar y enviar.

Es para que se vean distintas maneras de conseguir lo mismo.

En vez de enviar datos se pueden envier clases. Ejemplo, en vez de enviar el text de cada textbox yo podría haber enviado los tres textboxes.
Dim F as new FomConectar(textbox1, textbox2, Textbox3)

En ese caso en el _new debería poner
public sub _new(t1 as textbox, t2 as textbox, t3 as textbox)
...
end


Y por poder podría haber enviado el formulario entero
Dim F as new FormConectar(me)

Y en el _new haber recibido al formulario
public sub _new(F as FormConectar)
...
end


Diversas alternativas para pasar datos, controles, formularios o cualquier clase nativa o propia de un formulario a otro. De hecho no es para pasar cosas de un formulario a otro. Un formulario es una clase y estas técnicas sirven para pasar de una clase a otra, incluídas las clases de tipo form.

Un saludo

Perfil MP  

Página 1 de 1


  
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas
No puede adjuntar archivos
Puede descargar archivos
No puede publicar eventos en el calendario

   

Está utilizando la versión (Lo-Fi). Para ver la versión completa del foro, haga clic aquí.

Powered by Icy Phoenix based on phpBB
Design by DiDiDaDo

Página generada en:: 0.2203s (PHP: -36% SQL: 136%)
Consultas SQL: 31 - Debug off - GZIP Activado