Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Como Asignar Variable Tipo Array de Tform a otro Array del Mismo tipo (https://www.clubdelphi.com/foros/showthread.php?t=13366)

morfeo21 17-08-2004 00:39:20

Como Asignar Variable Tipo Array de Tform a otro Array del Mismo tipo
 
Hola a todos, amigos(as) del Foro.Necesito una ayuda con algo que se me presento y que lo necesito urgente..pues veran les explico:
Desde la unidad Proyecto.Dpr realizo lo sgte:
..
...
begin
Application.Initialize;
Application.ShowMainForm:=False;
Application.CreateForm(TFrmMenu, FrmMenu);
Application.CreateForm(TFrm01010201,Frm01010201);
Application.CreateForm(TFrm01010202,Frm01010202);

FrmMenu.Ventanas([Frm01010201]);
Application.ShowMainForm := true;
Application.Run;
End.
Ahora les detallo:
ventana es un procedimiento publico, que recibe los formularios ingresados atravez de su parametro de tipo array de TForm y lo que pretendo es pasar esos formularios a otro array declarado como privado en la unidad Menu con nombre Forma, como lo podran obsevar en las lineas posteriores. My pregunta es porque razón me emite error al querer asignarlo de esa manera?.Me pueden ayudar en esto o derrepente estoy haciendo mal las cosas.Gracias por todo de antemano.
..
....
Private
Forma:=Array of Tform;

procedure Ventanas(const Formularios: Array Of TForm);
var i :Integer;
begin
SetLength(Forma, High(Formularios));
for i:=Low(Formularios) to High(Formularios) do
Begin
Forma[i]:=Formularios[i];
End;
end;

roman 17-08-2004 02:41:50

Cita:

Empezado por morfeo21
My pregunta es porque razón me emite error al querer asignarlo de esa manera?

¿Qué error te emite? ¿En qué momento? ¿Al compilar o al ejecutar?

// Saludos

Lepe 17-08-2004 15:13:25

Independientemente de que el proceso esté bien o mal, yo comprobaría el tamaño de Formularios antes de hacer el SetLength(Forma, ...), ya que si High(Formularios) está vacio, te dará error al asignarlo

For empty arrays, High returns –1.

morfeo21 17-08-2004 16:53:03

Me muestra el siguiente Error
 
Project proyecto.exe raised exception class EAccessViolation with Message ' Access violation at address 40543B20'.Process stoped.Use Step or Run to continue
Pero me parece que tiene que ver algo con la funcion High para saber el tamaño maximo del array
:p

roman 17-08-2004 17:09:43

Además de lo que dice Lepe lo cierto es que tu forma de asignar la longitud del arreglo es incorrecta; no me había percatado anteriormente.

En arreglos abiertos (como el que pasas como parámetro al procedimiento Ventanas) los índices siempre están basados en 0 de manera que High será la longitud del arreglo - 1.

Tal como tienes el ejemplo que pones, al haber sólo un elemento High es igual a 0 lo que provoca la violación de acceso ya que el arreglo dinámico tendrá longitud 0.

Puedes arreglar todo esto muy fácilmente cambiando High por Length pero haciendo la verificación que te indica Lepe:

Código Delphi [-]
if Length(Formularios) > 0 then
begin
  SetLength(Forma, Length(Formularios));

  for i := Low(Formularios) to High(Formularios) do
    Forma[i] := Formularios[i];
end;

// Saludos

morfeo21 17-08-2004 17:39:51

Tenia mucha razón
 
Se los agradesco mucho amigos , ahora me doy cuenta del error que cometía
; pero con su ayuda ya puedo continuar :p


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

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