https://foro.gambas-es.org/viewtopic.php?f=4&t=369
-----------------------------------
pikas
Sabado, 23 Enero 2010, 14:05

Coleccion Formularios
-----------------------------------
Hola gente, estoy intentando hacer una enumeración de los formularios de mi proyecto, pero no doy con la manera de hacerlo.

He googleado bastante y no encuentro la solución a mi problema, supongo que algo me estoy planteando mal. Vengo de visual basic, y condicionado por ello, os expongo en código lo que tengo en mente. El código es completamente erróneo, ya que la colección forms, sirve para VB, y lo que busco es el equivalente en gambas que no logro encontrar:

for each form in forms
  message(form.name)
next form

Por lo que he leído, creo que tengo que crear yo mismo la colección de formularios, pero me encuentro algo perdido, porque me extraña que gambas no facilite la colección de formularios de una manera sencilla. Gracias a todos!


-----------------------------------
fabianfv
Sabado, 23 Enero 2010, 17:48

Re: Coleccion Formularios
-----------------------------------
Tal vez deberías contarnos cuál es realmente tu necesidad, en vez de cómo pensaste que podías satisfacerla.

Al menos yo no recuerdo que Gambas lleve una colección de los formularios abiertos, de modo que deberías crear una colección y agregas una referencia de cada formulario a la colección a medida que se abren. Si tienes muchos clases de formularios diferentes lo que puedes hacer es establecer la propiedad Group de cada formulario a un valor común y luego crear un manejador para los eventos Open de ese grupo (en esa rutina escribes el código para añadir la referencia del formulario a la colección).

Saludos cordiales.


-----------------------------------
soplo
Sabado, 23 Enero 2010, 18:41

Re: Coleccion Formularios
-----------------------------------
Concido con Fabian que indiques lo que quieres hacer porque en Gambas no hay colección de forms como en VB pero tampoco hacen falta. Hay muchas cosas que se pueden hacer en Gambas de manera bastante mejor.

Caes (yo también caí en ello) en el error de hacer una traslación directa de VB. Gambas es mucho mas rico que VB.

 :mryellow:


-----------------------------------
pikas
Sabado, 23 Enero 2010, 20:02

Re: Coleccion Formularios
-----------------------------------
Bueno, pues os explico lo que quiero hacer. Tengo un workspace donde salen formularios, en cada formulario hay un  panel con todos los controles. Estos paneles, son mas pequeños que el formulario que los contiene. Lo que quiero hacer, es que al cambiar el tamaño de la ventana principal, los paneles se centren en los formularios. El como centrarlos, ya se como hacerlo, lo que me falta es que el programa compruebe que formularios hay en el workspace.

Para llevar a cabo esta comprobacion queria usar algo del estilo:

for each formulario
  if workspace.children.find(formulario) = 0 then centrar_panel()
next


-----------------------------------
soplo
Sabado, 23 Enero 2010, 23:48

Re: Coleccion Formularios
-----------------------------------
Para eso tienes que jugar con la propiedad arrangement que decide como se ajustan los controles de un container (en tu caso un form). Es decir como se ajustan los children de un container cualquiera.

Solo es cuestión de probar a ver cual de las posibilidades te queda mejor. Por lo que dices entiendo que será arrange.horizontal

No tienes que codificar nada. Solo poner la propiedad con su valor adecuado.


-----------------------------------
pikas
Domingo, 24 Enero 2010, 01:42

Re: Coleccion Formularios
-----------------------------------
El rollo no va por ahi Soplo. No quiero parecer borde, pero es que la cuestion se esta complicando. Simplemente quiero saber como hacer una coleccion de todos los formularios del proyecto, esten o no en el workspace, o como segunda opcion, enumerar los formularios que contiene el workspace. Pasarse a otros temas es desviar mi pregunta. Que haya metodos mejores o peores es otra cosa, pero por lo que he visto en otros foros de cualquier tipo de programacion, hay gente que pregunta cosas muy por el aire, y la gente experta responde "por favor concreta tu pregunta". En este caso yo estoy preguntando algo super concreto y me estais derivando a otros temas. Vuelvo a insistir en que no quiero parecer borde, pero mi pregunta esta enfocada a un punto, aun que no sea la mejor manera de hacerlo, quiero saber como hacerlo, si estoy en un error os aseguro que practicando por mi mismo me dare cuenta, pero por el momento quiero saber como hacer esto en particular, gracias a todos por vuestra colaboracion.


-----------------------------------
soplo
Domingo, 24 Enero 2010, 03:55

Re: Coleccion Formularios
-----------------------------------
Haces bien en insistir si estás preguntando bien y somos los demás los que no te comprendemos, no te preocupes por eso.

Te decía que en gambas no hay una colección directa de forms como en vb, pero es que no hace falta para nada. A mí también me costó un poco hasta que le pillé el nervio a Gambas y desde entonces no he vuelto a necesitar esa coleccción. Por eso te pregunté lo que quieres hacer.

Se&#501;ún yo entiendo tu tienes un workspace con varios form y una pestaña para cada uno de manera que los form son independientes entre si y todos están dentro de un workspace común. Tu problema es que si cambia de tamaño el workspace tu quieres que tus form hijos se reajusten y por tanto los controles que estos contienen.

¿Es eso?

Como nunca he trabajado con workspace no puedo decirte las cosas sin probarlas y ahora no puedo, pero si me confirmas que este es exactamente tu problema mañana lo habré probado, pero según yo entiendo con arrange haces que tus forms hijos (que deben tener expand true) se adapten. Por tanto ahora el problema es el mismo dentro de cada formulario. Debe tener arrangement  y sus controles hijos debieran estar agrupados en containers que pudieran adaptarse al nuevo tamaño. Cada uno de estos containers contienen a su vez controles que se adaptarán al tamaño de su frame (o el  que sea).

No te preocupes por insistir. Mañana probaré esto y ya está.

La lista de forms debería estar en children. Al fn y al cabo children es un array de object[] razón por la cual en children.count debería estar la cantidad de forms y recorrerlos sería algo como
for each f in wkspc.children.count
f.delete (o lo que sea, esto eliminaría ese form del workspace)
next

Mañana pruebo estas cosillas que el workspace me incita alguna curiosidad
 :mryellow:


-----------------------------------
jguardon
Domingo, 24 Enero 2010, 13:42

Re: Coleccion Formularios
-----------------------------------
Hola pikas

Quizás aquí tengas la respuesta, aunque no lo he probado:

http://gambasdoc.org/help/comp/gb.form.mdi/workspace/children

La propiedad 'Children' devuelve un array de los objetos de tipo Form que son hijos del Workspace. Luego sólo tienes que enumerarlos o recorrerlos con un bucle.

Lo que no me queda claro es cuando dices:

[quote user="pikas" post="2093"] Lo que quiero hacer, es que al cambiar el tamaño de la ventana principal, los paneles se centren en los formularios. El como centrarlos, ya se como hacerlo, lo que me falta es que el programa compruebe que formularios hay en el workspace.t[/quote]

Entiendo que tal como dice soplo, deberías usar los contenedores y sus propiedades relacionadas como se explica en [url=http://foro.gambas-es.org/viewtopic.php?p=1455#p1455]este hilo.

Si ya lo has probado y no te funciona, quizás sea un problema de tu implementación.

Saludos


-----------------------------------
soplo
Domingo, 24 Enero 2010, 17:52

Re: Coleccion Formularios
-----------------------------------
Efectivamente tal como dije he podido hacerlo sin ninguna dificultad de esta manera
[code linenumbers=false syntax=gambas]
public sub form_open()
dim wk as new workspace(me) 'el workspace
dim w as window, w1 as window, w2 as window, w3 as window
dim b1 as button, b2 as button, b3 as button

me.arrangement=arrange.fill 'que el workspace llene el formulario

w1 = NEW window
w1.text = "uno"
w1.arrangement=arrange.fill 'que esta ventana haga lo mismo con lo que contenga

w2 = NEW window
w2.text = "dos"
w2.arrangement=arrange.fill 'que esta ventana haga lo mismo con lo que contenga

w3 = NEW window
w3.text = "tres"
w3.arrangement=arrange.fill 'que esta ventana haga lo mismo con lo que contenga

'crear un botón en cada ventana
b1=new button(w1)
b2=new button(w2)
b3=new button(w3)

wk.Add(w1) 'añadir las tres ventanas
wk.Add(w2)
wk.Add(w3)

Ahora recorrer las tres ventanas y cambiarles el texto
FOR EACH w IN wk.Children 'bucle que recorre las ventanas
  w.Text &= "*"  'a cada título le añade un *
NEXT 

end[/code]


-----------------------------------
fabianfv
Domingo, 24 Enero 2010, 18:10

Re: Coleccion Formularios
-----------------------------------
[quote]
Simplemente quiero saber como hacer una coleccion de todos los formularios del proyecto, esten o no en el workspace
[/quote]

Pikas, esto ya te fue respondido. Sólo resta aclarar que los formularios no poseen propiedad group como la mayoría de los controles ( ;-)  ¡ups!).

[code linenumbers=false syntax=gambas]
PUBLIC FormsCollection AS Collection

PUBLIC SUB Form_Open()
  FormsCollection = NEW Collection
END

'Podrías modificar esta función según tu necesidad, por ejemplo agregarle argumento de tipo object
'que recibirá un formulario de un tipo específico previamente diseñado (FCliente, FProveedor...)
PRIVATE FUNCTION CrearFormulario(SufixName AS String) AS Object
DIM f AS Form
    'FIncrustado seria el formulario que diseñaste con el panel que se centra...
    f = NEW FIncrustado
    f.Name = f.Name & SufixName
    FormsCollection.Add(f, f.Name)
    RETURN f
END

PRIVATE SUB RecorrerTodosFormularios(Forms AS Collection)
DIM obj AS Object
  IF Forms.Count > 0 THEN 
    FOR EACH obj IN Forms
      PRINT obj.name
    NEXT 
  ENDIF 
END
[/code]

[quote]
, o como segunda opcion, enumerar los formularios que contiene el workspace.
[/quote]

Pikaaaasss, la mesa está servidaaa:

[code linenumbers=false syntax=gambas]
PRIVATE SUB RecorrerFormulariosIncrustados()
DIM obj AS Object
  WITH Workspace1
    FOR EACH obj IN .Children
      PRINT obj.name
    NEXT 
  END WITH  
END
[/code]

[quote]
Pasarse a otros temas es desviar mi pregunta.
[/quote]

Eso suena a que quieres que te resolvamos tu problema. Bien... creo ya lo hemos hecho, así que al menos nos debes unas cervezas  :cool: 

[quote]
Que haya metodos mejores o peores es otra cosa, pero por lo que he visto en otros foros de cualquier tipo de programacion, hay gente que pregunta cosas muy por el aire, y la gente experta responde "por favor concreta tu pregunta". En este caso yo estoy preguntando algo super concreto y me estais derivando a otros temas.
[/quote]

Tu pregunta fue muy concreta y mal orientada porque como mencioné antes no expone cuál es tu necesidad, sino cómo estás pensando en que podrías resolverla. Además, en tu segundo mensaje desviaste tú el tema innecesariamente hacia lo de centrar el panel en el formulario. Por las dudas:

[code linenumbers=false syntax=gambas]
PUBLIC SUB Form_Resize()
  WITH Panel1
    .X = (.Parent.ClientWidth - .Width) / 2
    .y = (.Parent.ClientHeight - .Height) / 2
  END WITH 
END
[/code]

Aún después de este diálogo contigo, que lleva varios mensajes de respuesta, no sabemos concretamente cuál es tu necesidad. Eso nos conduce ha responderte un poco a ciegas y nos hace perder tiempo (y eso no nos gusta).

Saludos.

(no te olvides de las cervezas) :cool:


[b]Edición[/b]:

soplo no había visto tu respuesta. Hasta hace unos días, si estabas escribiendo una respuesta y entraba un nuevo mensaje al hilo, se mostraba un mensaje de advertencia. Pero en mis últimos dos mensajes esto ya no ocurrió.


-----------------------------------
pikas
Lunes, 25 Enero 2010, 23:39

Re: Coleccion Formularios
-----------------------------------
Gracias a todos por las respuestas. Hoy he llegado un poco tarde a casa y no me da tiempo a probar, pero Soplo, creo que con lo que me has puesto me vale. Mañana intentaré ponerme manos a la obra y os cuento el resultado.

En cuanto a lo de las birras, soy gallego, de Santiago de Compostela, si alguno de vosotros se pasa por aquí gustosamente invitaré a unas birrillas, la primera ronda la invito por este post y las siguientes a cambio de dislumbramiento sobre Gambas :D

Un abrazo a todos.


