PDA

Ver la Versión Completa : Ventana principal o contenedora de forms?


daragor
03-09-2012, 16:26:09
Hola comunidad... aclaro que soy novato en el entorno lazarus y realmente ando bastante perdido por la poca documentacion, guias y manuales disponibles en la web. Vengo de Visual Foxpro..

Mi pregunta es: Como se crea, aplica o activa una ventana principal de una aplicacion, es decir necesito hacer un sistema con varios formularios y no me agrada esta situacion de tener los forms flotando en el escritorio, espero me entiendan, necesito una ventana para mi sistema, con menus, backgrounds, opciones y demás en donde se abran mis formularios. Esto es posible?

Muchas gracias!!

dec
03-09-2012, 16:32:21
Hola,

Hablamos de "SDI" (Single Document Interface) o de "MDI" (Multiple Document Interface). Fíjate en la propiedad "FormStyle" de los formularios. Esta por defecto vale "fsNormal". En el formulario principal de tu aplicación cambia dicha propiedad a "fsMDIForm", y, en el resto de formularios, cambia la propiedad a "fsMDIChild". Hecho esto los formularios "secundarios" aparecerán dentro del principal. Puedes buscar más información en estos foros o en internet sobre "MDI".

daragor
03-09-2012, 16:41:34
Gracias dec, es la guia q necesitaba..

daragor
03-09-2012, 17:49:54
Los distintos formularios se crean como unidades? osea yo hago: nuevo -> formularios, se crea en mi proyecto una unidad nueva. es asi el metodo a usar? xq.. setteando los FormStyle no se abren dentro del principal. sigue todo igual..

dec
03-09-2012, 17:54:43
Hola,

Cuando creas un proyecto nuevo cuentas con un solo formulario, que, será el formulario principal de tu aplicación. Este formulario es el que tiene que tener la propiedad "FormStyle" a "fsMDIForm". El resto de formularios podrán tener su propiedad "FormStyle" a "fsMDIChild". Sólo con esto estos formularios "hijos" aparecerán dentro de tu formulario principal. Si no te funciona prueba creando un nuevo proyecto (a modo de ejemplo) y así poder empezar de cero.

daragor
03-09-2012, 21:45:30
Muy bien dec, entendido... ahora como creo nuevos formularios para usarlos como child?

otra cosa, tengo q desarrollar todo un sistema, aunq sea chico.. en una sola unidad?

dec
03-09-2012, 22:49:10
Hola,


Muy bien dec, entendido... ahora como creo nuevos formularios para usarlos como child?


No es preciso hacer nada especial. Al cambiar la propiedad de que venimos hablando, digamos que todo surte efecto por sí solo. Cuando crees un formulario cuya propiedad "FormStyle" valga "fsMDIChild", este se mostrará dentro del formulario "fsMDIForm" de tu aplicación. Si inicias un proyecto nuevo, y, simplemente, añades un formulario (además del principal), cambiando sus propiedades "FormStyle" como hemos dicho, verás que sin más cuando tu aplicación arranque se mostrarán ambos formularios, sin que tú tengas que hacer nada.


otra cosa, tengo q desarrollar todo un sistema, aunq sea chico.. en una sola unidad?
[/QUOTE]

No necesariamente tienes que desarrollar una aplicación en una sola unidad. De hecho puede no ser una buena idea, si pensamos que es bien separar el código lo mejor posible. ¿Por qué te surge esta cuestión?

daragor
03-09-2012, 23:12:12
Vengo de foxpro en donde, por defecto, todo ocurre dentro de una ventana principal, y en el diseño de mi sistema voy creando forms .. los cuales se ejecutaran, todos, dentro de la misma ventana formateable.. aqui en lazarus veo que esa ventana "contenedora" no existe por defecto, entonces pienso.. voy creando los forms.. Ej. Articulos, Compras, Ventas, Clientes.. cada uno es una unidad diferente.. y los voy llamando a medida q me haga falta, hasta aqui todo bien.. pero cuando termine mi proyecto los forms estaran en el escritorio "volando", por eso es q queria tener una ventana contenedora, creo como la mayoria de los sistemas! pasa q ignoro muchas cosas todavia de lazarus y no consigo buenas guias, o manuales online..

He creado un form principal, y pongo la propiedad FormStyle fsMDIFrom, luego creo otros formularios y setteo la propiedad fsMDIChild, pero cuando los llamo salen arriba del principal, los puedo mover fuera de el.. entonces no entiendo.. repito pido disculpa por mi ignorancia..

sebamawa
04-09-2012, 06:44:38
Compañero daragor, creo que lo que tú estás buscando es el uso de Frames. Déjame buscar algún hilo del foro para pasártelo y así despejar tus dudas.
Saludos.

Entra aquí mejor http://wiki.lazarus.freepascal.org/Frames

dec
04-09-2012, 13:59:32
Hola,

Adjunto a este mensaje tienes un ejemplo de aplicación MDI, mejor dicho, se trata de un proyecto "nuevo" al que se le han añadido un par de formularios. Como verás "Form1" tiene su propiedad "FormStyle" a "fsMDIForm" y el resto de formularios a "fsChildForm". Verás que no he hecho nada más, no he escrito nada de código. A ver si es más o menos lo que necesitas... o tal vez el compañero vaya por mejor camino al referirte a "las Frames". ;)

daragor
04-09-2012, 14:56:14
Compañero sebamawa, gracias.. estoy investigando lo de frames. De todas maneras adjunto una imagen para que vean lo que necesito:

http://i.imgur.com/bsx6l.jpg

En esta imagen se ve una ventana principal del sistema, con fondo azul.. y en ella un menu con botones, y un form abm de articulos abierto y arriba un abm de usuarios.
Todo se ejecuta dentro de la misma ventana, con fondo azul.. eso es lo q necesito hacer, q mis forms en lazarus tengan una ventana contenedora.


Dec! podrias pasarme el ejemplo en lazarus?

dec
04-09-2012, 15:11:46
Hola,


Dec! podrias pasarme el ejemplo en lazarus?

Me he dado cuenta y lo he preparado con Delphi. Ahora bien, he descargado Lazarus y he podido comprobar que el asunto no funciona como se espera, y, es que parece que las aplicaciones MDI no están implementadas en Lazarus, aunque los formularios cuenten con la propiedad correspondiente y nosotros las cambiemos, la aplicación no se comporta como una aplicación MDI.

* Aquí puede leerse que MDI no está soportado aún en Lazarus (http://www.lazarus.freepascal.org/index.php?topic=8480.0)

* Y aquí un artículo en la wiki de Lazarus con una posible alternativa (http://wiki.freepascal.org/MultiDoc/es)

Echa un vistazo a ver si puedes sacar algo en claro. ;)

daragor
04-09-2012, 15:35:16
Asi es dec, no se comporta como esperamos. No me sirve MDI para lo q necesito y los frames me parece q tampoco, aunq ya entendi y son utiles a la hora de repetir ciertas estructuras de objetos en los diseños. Como dije en el post anterior, necesito una ventana contenedora para mi programa, q se pueda maximizar, minimizar, tener un titulo, etc. (como se ve en la imagen), y que dentro de ella suceda todo, no quiero los formularios volando en el escritorio.. solo eso compañeros!

dec
04-09-2012, 16:03:13
Hola,

¿Echaste un vistazo al artículo en la wiki de Lazarus con una posible alternativa (http://wiki.freepascal.org/MultiDoc/es)?

daragor
04-09-2012, 16:37:16
Si dec, lo vi.. lo baje.. la ultima version es 0.3.1 y no sirve para lazarus RC2..

dec
04-09-2012, 17:59:44
Hola,

La verdad es que no se me ocurre otra cosa que no sea usar "paneles" simulando formularios de alguna manera, pero, además de no demasiado elegante, creo que esto pdoría podría complicar las cosas. No sé. A ver si algún otro compañero puede ofrecer otra posible solución...

sebamawa
04-09-2012, 20:09:56
Viendo la imagen que adjuntó el compañero daragor y la explicación dada, me queda claro cuál es su objetivo. Yo hace poco que inicié el uso de Lazarus, y efectivamente las propiedades MDI de los Forms no dan resultado (en principio).
Me parece un tema para seguir discutiendo, pues cualquier sistema - aplicación con una interfaz medianamente estética y prolija tendría que tener disponible este tipo de características.
Saludos.

daragor
05-09-2012, 00:07:19
Asi es compañeros, hace varios años que uso visual foxpro y he decidido dejarlo xq como sabran es un producto discontinuado, ademas de querer alejarme un poco de lo q es microsoft... lo que si puedo decir, es un programa potente, robusto y muy completo. Como veran en la imagen ese es un producto desarrollado x mi en fox.
Ahora lazarus me interesa y quiero usarlo, mas aun al ser un producto GPL.. es lo q busco.

Con lo poco q voy aprendiendo de la interfaz, creo q se podria usar un Form como ventana principal y luego dentro de el usar Paginas y dentro de ellas Frames en donde se cargarian las distintas pantallas que un sistema requiere (articulos, compras, ventas, etc.) todas creadas como frames y con sus respectivos procedimientos y funciones. Adjunto una imagen para que me entiendan y de paso.. me ayuden con alguna idea que surja de los que saben mas.. "cuando mas se conocen las herramientas disponibles mas ideas hay"

http://i.imgur.com/K4F4v.png

Saludos compañeros! espero que alguien mas sume ideas a esta situacion..

dec
05-09-2012, 01:29:52
Hola,

Es una posible alternativa. ;)

daragor
05-09-2012, 02:07:29
Ahora tengo un problema.. ya he buscado informacion, pero no doy en la tecla. Si bien en el form principal me carga el frame, con sus editbox, botones, etc. Cuando trabajo en el frame en cuestion con un boton por ej. NUEVO articulo.. en el form principal no me toma ese procedimiento... es como que son 2 botones distintos!! se entiende?

En el evento Click de boton NUEVO del frame creo el alta de articulo.. pero en el form principal este evento esta vacio.. si tengo q trabajar los botones en el form principal haria que el codigo se haga muy largo. no es la idea verdad? no hay herencia en este caso? Muchas gracias por responder!

Encontre la Solucion:
Solucionado el problema, directamente tengo q trabajar con los eventos del los botones en el form prinicipal. configurando por ej. NombreDelFrame.NomBoton.Click

Fallas de novato. :/ igual suma a la causa de este post.

mightydragonlor
05-09-2012, 02:30:57
Lo puedes hacer perfectamente con Frames y paneles, así que cuando requieras creas el frame en el panel deseado.

sebamawa
05-09-2012, 08:58:54
Hola a todos.
Creo que encontré una muy buena alternativa a los que buscan formularios contenidos en uno principal al estilo MDI.
Usando un panel sobre el Form principal, se cargan los restantes Forms sobre el Panel y así se obtiene el resultado buscado. El video lo muestra en Delphi, pero ya está probado en Lazarus por mi.
Pueden verlo aquí http://www.youtube.com/watch?v=0VnPR4HHGTU
Saludos.

daragor
05-09-2012, 14:56:23
En definitiva creo q frames, paneles.. cumplen con el objetivo. Igual a lazarus le falta esto.. una ventana contenedora. Gracias por el interes sebamawa

sebamawa
05-09-2012, 19:18:43
En definitiva creo q frames, paneles.. cumplen con el objetivo. Igual a lazarus le falta esto.. una ventana contenedora. Gracias por el interes sebamawa

Es así, ya no hay mucho que hacer, inclusive la última alternativa que publiqué, si bien visualmente está bien, el comportamiento de los Forms contenidos no es el ideal al maximizarlos o minimizarlos.
Habrá que adaptarse a no usar ventanas MDI.
Ahora, una pregunta al compañero daragor. ¿Puedes explicarme el órden en que usas los componentes para lograr el efecto que muestras en la imagen anterior que publicaste (Artículos, Compras, Ventas...)?. Pues distingo paneles, frames y menús, pero no logro obtener el efecto de que cuando se elige un item (por ejemplo artículos) se muestre el panel - frame correspondiente.
Saludos.

daragor
05-09-2012, 22:18:23
Compañero seba, como no... primero no uso paneles, por lo mismo que dijiste vos, es mas complicado con el tema forms en cuanto al diseño. Asi que solo estoy usando TPageControl, con las paginas necesarias (articulos, compras,ventas,etc.) dentro de cada pagina pongo un frame, ese frame esta creado aparte, con todos los objetos y procedimientos necesarios para por ejemplo un ABM de articulos. Incluso con los valores SQL, conexion, transicion, y datasource y querys que vaya a usarse. Cuando ejecutas ves el form principal voy navegando por las paginas. Pense en un menu para otras cosas, que si podrian ser forms volando por ahi.. un login, un manejo de mysql, etc. Espero me entiendas...

http://i.imgur.com/ic9Cy.png

Saludos

sebamawa
06-09-2012, 02:35:33
Gracias daragor por la información, hasta cualquier momento.
Saludos.

mightydragonlor
06-09-2012, 04:40:06
Yo uso TFrames, sólo que los creo en tiempo de ejecución con el TPanel como padre, y todo el código lo manejo en el TFrame.

sebamawa
06-09-2012, 07:08:32
Yo uso TFrames, sólo que los creo en tiempo de ejecución con el TPanel como padre, y todo el código lo manejo en el TFrame.

Hola mightydragonlor.
Pero cómo haces para manejar los paneles, por ejemplo maximizar o minimizar ventanas con ellos, usar menús, etc?
Puedes plantear un ejemplo?
Saludos.

mightydragonlor
06-09-2012, 15:48:41
Nunca hago nada de eso, si necesito una ventana, pues uso una ventana, todo depende del look que le quiera dar a mi aplicación, pero en definitiva, nunca he usado formularios MDI, me parece que son horribles, ademas, para eso están las ventanas modales, Tabs, Notebook, paneles y demás, ahora si lo que quieres es que un panel pueda cambiar de tamaño y pocisión, no es muy dificil.

procedure TPanel.MouseDown(Button: TMouseButton; Shift: TShiftState; X,
Y: Integer);
begin
inherited MouseDown(Button, Shift, X, Y);
lastPos := ClientToScreen(point(X,Y));
isMouseDown := true;
end;

procedure TPanel.MouseMove(Shift: TShiftState; X, Y: Integer);
var
diff,newPos:TPoint;
newRect:TRect;
begin
inherited MouseMove(Shift, X, Y);
newPos := clientToScreen(point(X,Y));
if isMouseDown then begin
diff.x := newpos.x-LastPos.x;
diff.y := newpos.y-LastPos.y;
if panelMode in [pmMoveSelf] then
begin
newRect := BoundsRect;
OffsetRect(newRect, diff.x, diff.y);
BoundsRect := newRect;
end else begin
newRect := parent.BoundsRect;
case panelmode of
pmMoveSelf: OffsetRect(newRect, diff.x, diff.y);
pmMoveParent: OffsetRect(newRect, diff.x, diff.y);
pmResizeParent:
begin
inc(newRect.right,diff.x);
inc(newRect.bottom,diff.y);
end;
pmResizeParentLeft: inc(newRect.left,diff.x);
pmResizeParentRight: inc(newRect.right,diff.x);
pmResizeParentTop: inc(newRect.top,diff.y);
pmResizeParentBottom: inc(newRect.bottom,diff.y);
end;
parent.BoundsRect := newRect;
end;
end;
LastPos := newPos;
end;

procedure TPanel.MouseUp(Button: TMouseButton; Shift: TShiftState; X,
Y: Integer);
begin
inherited MouseUp(Button, Shift, X, Y);
IsMouseDown := false;
end;

{$R *.lfm}

{ TForm1 }

procedure TForm1.FormDblClick(Sender: TObject);
begin
application.Terminate;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
wLeft.PanelMode := pmResizeParentLeft;
wright.PanelMode := pmResizeParentRight;
wTop.PanelMode := pmResizeParentTop;
wBottom.PanelMode := pmResizeParentBottom;

panel1.PanelMode := pmMoveSelf;
panel2.PanelMode := pmResizeParent;
panel3.PanelMode := pmMoveParent;
Self.DoubleBuffered:=True;
end;

Esto debería servirte.

sebamawa
06-09-2012, 18:13:33
Gracias mightydragonlor, hace poco que uso Lazarus y todo tipo de idea nueva es bienvenida.
Saludos.

pedrolazarus
05-10-2012, 18:41:10
Me intera mucho este tema, yo lo que hago es crear los formularios y los oculto y cuando los necesito los vuelvo a mostrar

form.hide

form.show

Pero esto no se si es lo correcto.

mightydragonlor
05-10-2012, 19:41:36
Me intera mucho este tema, yo lo que hago es crear los formularios y los oculto y cuando los necesito los vuelvo a mostrar

form.hide

form.show

Pero esto no se si es lo correcto.
Sin importar si es lo correcto o no, lo que importa es que te sirva, si es cuestión de mejorar el rendimiento y consumir menos recursos, lo mejor es crear y destruir los formularios conforme los vas necesitando.

Saludos.

pedrolazarus
15-06-2013, 23:24:45
Pues yo en ves de Utilizar el panel como el ejemplo del Compañero sebamawa (http://www.clubdelphi.com/foros/member.php?u=80941) Pues decidi utilzar el mismo Form1 y de hecho se abre el form2 dentro del form1 pero cuando el form2 o hijo se maximiza (en el caso de ser mas pequeño q el form padre) queda como una imagen mezclada (no se si es a mi que me pasa o que)
http://www.subeimagenes.com/img/mdi-666294.jpg

Dejo el codigo, y para que quede el form hijo centrado en la propiedad position colocar poMainFormCenter

Ahora si el form hijo se inicia maximizado no hay problema