2010-11-29 19 views
6

¿Qué tiene de especial con los marcos que al crearlos en tiempo de ejecución se le asigna un nombre automáticamente? Esto causa un problema cuando se utilizan en un bucle, es decir:Nombres de fotogramas asignados automáticamente

for i := 0 to 3 do 
    TMyFrame.Create(self); //Error on 2nd pass 

En la primera pasada, el marco que se llame explicityl 'MyFrame'. En la segunda pasada, intentará volver a nombrarlo 'MyFrame', que causará una excepción obviamente, ya que ya existe un componente con dicho nombre.

Los demás componentes o formularios están felices de crearse sin asignarles un nombre. Lo que da ?

Esto está en Delphi 2006 por cierto.

Saludos

Respuesta

1

que está tratando de crear el mismo período de 4 veces, cada vez que se crea el marco que tendrá el mismo nombre, una forma de evitar es

... 
var 
    i: Integer; 
    lFrame: TFrame; 
begin 
    for i := 0 to 3 do begin 
    lFrame := TFrame.Create(Self); 
    // assign a unique name to the frame 
    lFrame.Name := Format('MyFrame%d', [i]); 
    // set the parent, align, etc... 
    end; 
end; 
+2

Creo que su pregunta es _por qué_ él tiene que hacer esto con marcos, cuando no tiene que hacerlo con otros componentes. –

+0

Me sale ese Dorin. Estoy seguro de que hay formas de evitarlo. Pero la pregunta es ¿por qué? Delphi está de acuerdo con esto: para i: = 0 a 5 do TButton.Create (self); – Rick

+1

porque el marco es descendiente de tu clase personalizada ?! – ComputerSaysNo

3

Si está utilizando TFrame para crear tu Frame, entonces no generará ese error.

es decir, si su código es el siguiente, usted no tendrá ningún problema

for i := 0 to 3 do 
    Frame1 := TFrame.Create(self); 

porque aquí la propiedad Name está sin asignar. Si lo desea, puede verificar utilizando la instrucción ShowMessage(Frame1.Name);

Pero si utiliza TMyFrame, es decir, el marco que obtuvo de TFrame, entonces dará el problema.

Creo que el motivo es que Delphi asignó explícitamente el mismo nombre cada vez que creaste el nombre TMyName.

+0

gracias para aclarar esto, estaba tan adormilado ;-) muy buena respuesta! – ComputerSaysNo

0

Coincidentalmente me topé con esto yo mismo (otra vez).

Si se toma el nombre de su componente de cuadro a continuación, Delphi se queja de que "la raíz de componentes debe tener un nombre" - supongo que porque en algún lugar Delphi está llamando RegisterClass(RootComponentName) y luego a crearlo (o un descendiente) que está llamando Findclass(RootComponentName) o similar. Como puede hacer esto usted mismo para crear componentes que realmente no conoce el nombre de clase de un tiempo de diseño, ¿por qué Delphi no haría lo mismo?

Mientras que con un TButton etc. ya es una clase registrada.

Cuestiones relacionadas