Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Gráficos (https://www.clubdelphi.com/foros/forumdisplay.php?f=8)
-   -   Un form dentro de otro (https://www.clubdelphi.com/foros/showthread.php?t=49660)

Ubed 26-10-2007 12:56:25

Un form dentro de otro
 
Hola no se si esto va aqui o no va a qui o si lo que pregunto esta bien, pero alla voy.

Yo tengo un Form1 que quiero que sea el principal y quiero que el resto de forms, que se abren en funcion de que parte del arbol pulso, se muestren en un espacio del form que tengo reservado. No se si me entendeis pero ¿Como lo puedo y que debo hacer? ¿Que objetos uso?

Gracias de antemano

Lepe 26-10-2007 16:08:12

Lo que quieres es algo así como la interfaz del emule, pulsas un botón (o un árbol) y "la ventana" se muestra en todo el área, sin posibilidad de cerrar, minimizar y maximizar.

Hay varias formas, pero yo me decantaría por TFrames. Son como paneles prefabricados que puedes crearlos y cerrarlos a voluntad. Pero cada uno los diseñas como si fueran ventanas diferentes.

También se puede hacer con TForms de toda la vida, creando un hijo y asignando su propiedad Parent, aunque verás la barra de título, etc.

Código Delphi [-]
  Application.CreateForm(TFormHijo, FormHijo);
  FormHijo.Parent := FormPadre;
  FormHijo.Show;

Saludos

Puberta 31-10-2007 08:16:13

Frame en un PageControl -- No tengo la menor idea
 
Hola Lepe, tengo un problema muy parecido....

Tengo un Form principal y cerca de 15 Form secundarios (hijos), ahora quiero mejorar la presentación pues como lo acabas de escribir se ve demasiado bulgar, pues es demasiado obvio que hay un form dentro de otro form, así que le quite el borde, pero aun así me muestra la barra de titulos; después segui tu consejo, cree un frame y lo inserte en un PageControl y se veía de maravilla, es como si se tratara de un solo form :), pero la duda que surge es ¿Puedo ingresar todos los frames a el Pagecontrol?:confused:, sé que tiene la opción de ingresar varias páginas, pero no encontre como asignar un frame a cada página y la verdad es que lo que quiero hacer es que mediante una función yo le asigne el Frame a el Pagecontrol y cuando necesite que se visualice otro Frame, oculte el primero y muestre el que le indique, no tengo la menor idea si se pueda....como es obvio no tengo lógica y es mi segundo día en Delphi 7.

De antemano gracias, por cierto lo poco que sé de Delphi lo aprendí gracias a ustedes.:D

Lepe 31-10-2007 12:23:09

Si vas a usar un PageControl, sólo podrás ver un frame al mismo tiempo, y tener 15 frames cargado en memoria (si son complejos) puede ser un derroche de recursos.

Lo que puedes hacer es crear el frame en tiempo de ejecución al cambiar de páginal (evento OnPageChanging si no recuerdo mal).

Puedes hacer uso de una variable global que indica el frame actual que se está mostrando en un momento, se utiliza para liberar el frame y cargar el nuevo. Ejemplito ¿no?
Código Delphi [-]

uses Ufruno, // frame1 definido en esta unidad
       Ufrdos; // lo mismo
{
Nomenclatura:
  Ufruno es la unidad .pas donde está el frame
  Tfruno sería el tipo de ese frame lo ves en su definición:
"  type Tfruno = class(TFrame)"
}
Type FrameClass = class of TFrame; 
// guarda la clase de un TFrame para poder crearlo.

type TForm  = class (Tform) // el principal
private 
  actual :TFrame;
  frames : array [0..15] of TFrame;

  procedure OpenFrame( idx : integer);
end;

procedure TForm.Create(..);
begin
  // cargamos los tipos de frames que vamos a tener
 // como ves lo que se pone es el tipo (type) del frame
  frames[0] := Tfruno; 
  frames[1] := Tfrdos;

{  El índice 0 del array, lo hacemos corresponder con el TabSheet 0
  El índice 1 del array, lo hacemos corresponder con el TabSheet 1

  Así el Tabsheet 0 mostrará el frame de tipo Tfruno
}
 ...
end;


// si no recuerdo mal, en este evento te dice la página actual
// del TPageControl y la página nueva que se va a mostrar
Procedure TForm.PageControlChanging( oldIndex, NewIndex:integer);
begin
  freeAndnil (actual); //eliminamos de RAM el frame que se está mostrando ahora.


// creamos el nuevo frame, dependiendo del TabSheet al que se quiere cambiar. 
  actual := frames[NewIndex].Create(nil); 

  //situamos el frame dentro del TabSheet
  actual.Parent := PageControl.Pages[NewIndex];
  actual.align := alclient;
  actual.visible := true;
  // sería conveniente tener la propiedad visible de cada frame a false en
  // tiempo de diseño, así al alinearla al client, no se vería el cambio de tamaño
end;

procedure Tform.Close(...);
begin
  // no olvidemos liberar el frame actual:
  freeandnil(actual);
end;

Saludos

Puberta 01-11-2007 00:26:29

No me funciona
 
Hola Lepe, muchas garcias por tu ayuda.

Mira intente lo que dijiste, pero no me acepta el evento PageControlChanging, así que intente con el PageControlChange pero no funciona, además de que no me deja cargar los tipos de Frames...de verdad lo intente, pero no encuentro la forma de hacerlo.:(

Lepe 01-11-2007 11:39:16

¿qué errores te da?

Puberta 01-11-2007 20:20:02

Me dice que el evento PageControlChanging no existe, y no me deja asignar valores a los Frames, me dice que no es valido.

egostar 01-11-2007 21:07:06

Cita:

Empezado por Puberta (Mensaje 242920)
Me dice que el evento PageControlChanging no existe, y no me deja asignar valores a los Frames, me dice que no es valido.

No es el nombre propiamente, en los eventos del PageControl hay uno que se llama OnChange, dale doble click y delphi te creará el evento.

Código Delphi [-]
procedure TForm1.PageControl1Change(Sender: TObject);
begin

end;

Salud OS


La franja horaria es GMT +2. Ahora son las 20:35:10.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi