Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Redimensionar Form fsMDIChild desde código (https://www.clubdelphi.com/foros/showthread.php?t=69172)

Lenny 30-07-2010 20:07:29

Redimensionar Form fsMDIChild desde código
 
Buenas Maestros, tengo un pequeño problema, intento redimencionar una ventana fsMDIChild desde código, pero no me deja, me da error, trato de hacerlo de dos maneras:

Clientes.ClientHeight:= 160;
ó
Clientes.Height:= 160;

Me da error, que estoy haciendo mal???

Delphi 2010, ZEOS 7.0.0, MySQL, de antemano gracias!!!

delphi.com.ar 30-07-2010 20:15:14

Te faltó un pequeño dato importantísimo..... ¿Que error te da?...

PD: Tienes intanciado el objeto Clientes ?

Lenny 30-07-2010 20:21:27

me da este error:

"Acces violation at address 004CC6BF in module 'JJSoft'. Read of address 0000054"

Intanciada??? a que te refieres??? eso, cualquier dato que falte me avisan...

delphi.com.ar 30-07-2010 21:15:16

Cita:

Empezado por Lenny (Mensaje 372146)
me da este error:

"Acces violation at address 004CC6BF in module 'JJSoft'. Read of address 0000054"

Intanciada??? a que te refieres??? eso, cualquier dato que falte me avisan...

Viendo el error mis sospechas parecen estar acertadas. Ahora si no comprendes el concepto de Instancia no se como te voy a ayudar.

Supongo:
Clientes es una variable del tipo TClientes, TClientes es una clase heredada de TForm. Ahora Clientes por si sola no deja de ser un puntero tipado a una dirección de memoria, y si esa dirección de memoria no tiene una intancia de TClientes, seguramente producirá una violación de memoria, ya que creerá que en ese espacio hay información de un TCliente pero ese área de memoria puede haber sido ocupada por cualquier otra cosa, o bien puede apuntar a 0 (nil).

Pregunto: ¿En qué momento haces asignas algo a la variable Cliente?.. ¿Solo creas un form a la vez del tipo TCliente?... ¿Si este se destruye limpias la asignación de la variable Clientes?

santiago14 19-09-2010 21:21:27

Cita:

Empezado por Lenny (Mensaje 372139)
Buenas Maestros, tengo un pequeño problema, intento redimencionar una ventana fsMDIChild desde código, pero no me deja, me da error, trato de hacerlo de dos maneras:

Clientes.ClientHeight:= 160;
ó
Clientes.Height:= 160;

Me da error, que estoy haciendo mal???

Delphi 2010, ZEOS 7.0.0, MySQL, de antemano gracias!!!

No se si mi post llega en momento apropiado pero supongo que todo se soluciona poniendo:
Código Delphi [-]
//En lugar de poner
Clientes.ClientHeight:= 160;
//Ponemos
Self.ClientHeight:=160;
Yo a esto lo pondría en el evento Show del formulario Clientes, está claro que primero hay que crearlo y luego manipularlo.

No lo he probado pero me parece que con eso bastaría.
Luego podrías buscar por ahí algún manual para entender la Teoría de Objetos.
Bueno, luego me dicen que onda.

Saludos.

ecfisa 21-09-2010 20:42:11

Hola Lenny.

Tál como dice Federico, ese error te sale por que estás intentando usar un recurso que no has asignado, ejemplificando:

Si hacemos la creación el el evento OnShow del MDIForm queda:
Código Delphi [-]
procedure TMDIForm.FormShow(Sender: TObject);
begin
  Clientes:= TClientes.Create(nil);
  Clientes.Show;
end;



Luego de estar creado, podés redimensionarlo como y cuantas veces quieras. Para probar poné un ComboBox en MDIForm, agregale los valores 100,200,300,...N y usá este código en el evento OnChange del Combo:
Código Delphi [-]
procedure TMDIForm.ComboBox1Change(Sender: TObject);
begin
  Clientes.Height:= StrToInt(ComboBox1.Text);
end;





Una forma que se puede inducir el error que mencionas, es cambiando el código de FormShow de este modo:
Código Delphi [-]
procedure TMDIForm.FormShow(Sender: TObject);
begin
  with TClientes.Create(nil) do Show;
end;

Y luego intentar:
Código Delphi [-]
procedure TMDIForm.ComboBox1Change(Sender: TObject);
begin
   Clientes.Height:= StrToInt(ComboBox1.Text); // No!!!! Clientes no es un puntero válido 
end;

En este caso Clientes no ha sido instanciado...


Saludos. :)

Lenny 22-09-2010 17:51:34

Muchisimas gracias!!!
 
SANTIAGO14 y ECFISA, Muchisimas gracias!!! no llegaron tarde, aun tenia ese problema pendiente, muchas gracias por los comentarios, en esto momentos probare lo que me dicen y les cuento, gracias nuevamente.

PD: Acabo de probar lo que me dice SANTIAGO14 y funciona a la perfeccion!!! muchas gracias!!!, ECFISA, estudiare lo que me dices tu, muchas gracias a ambos, un abrazo!!!

ecfisa 22-09-2010 21:30:06

Hola Lenny.

Me alegro que te haya servido lo que hemos escrito Federico, Santiago y yo.

Quisiera agregarte que se puede parametrizar la creación y muestra de ventanas MDIChild.

Mirá este procedimiento:
Código Delphi [-]
procedure TMDIForm.CrearChild(ClassForm: TFormClass);
var
  i: Integer;
begin
  for i:= 0 to MDIChildCount do  // Buscamos si está creada
   if Screen.Forms[i].ClassName = ClassForm.ClassName then // ¿ Ya existe ?
   begin
     Screen.Forms[i].WindowState:= wsNormal;  // restaurar
     Screen.Forms[i].BringToFront;            // Traer al frente
     Exit;                                    // Salir;
   end;
  with ClassForm.Create(nil) do Show; // No existe, crearla
end;

Ejemplo de lamada:
Código Delphi [-]
    CrearChild(TMDIChild);

El comportamiento por defecto al cerrarse de los Forms MDIChild, es minimizarse. Por lo que, si querés cerrarlos, deberás incluir esta línea en el evento OnClose de cada MDIChild:
Código Delphi [-]
   Action:= caFree; // Cerrar;
   Nombre_del_form:= nil; // línea opcional, se libera el recurso de inmediato, si no windows lo hará después


Espero que te ayude.

Saludos. :)


La franja horaria es GMT +2. Ahora son las 05:31:22.

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