Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Estoy atascado en el siguiente código (https://www.clubdelphi.com/foros/showthread.php?t=36074)

David 01-10-2006 10:06:17

Estoy atascado en el siguiente código
 
Hola

Como no me sale el código que pondré acontinuación , lo que he hecho es hacer una aplicación simple y simplificarlo , pero me sigue dando error .

Tengo 2 formularios del tipo MDIChild (Form2) . Habró el primer formulario MDIChild , que tiene un botón para crear el segundo formulario MDIChild (Form3).

En el Form3 , hay un procedimiento ,de nombre Ver , declarado en public. En este procedimiento , en este código da error : label1.Visible := True; .

llamo a este procedimiento , en el Form2 , así :

Código Delphi [-]
TForm3.Create(application); // aquí no hay problemas

with Form3 do // recuerdo este código esta en el Form2
Ver;

pues bien , cuando depuro , y pongo el punto de ruptura en el Form3 , en el procedimiento Ver , cuando llego a label1.Visible := true ; (en diseño he pueso label1 visible false) , Me sale el siguiente error :

Project ejemplo.exe raised exception class EAccessViolation with message 'Access violation at address 00450712 in module 'ejemplo.exe'.Read of address 00000002D8 . Process stopped .Use Stept or Run to continue.

El caso es que primero pensaba que habria un error por otro lado , por eso he hecho una sencilla aplicación , para ver si pasaba y pasa , da error , así que he concluido que desde otro form , no puedes llamar a un procedimiento en el que haya un campo boolean , pero claro , yo necesito poner los labels , visibles , cuando genero el Form3 , desde el Form2.

Un saludo

dec 01-10-2006 10:55:31

Hola,

Las "violaciones de acceso" tienen que ver con tratar de acceder a la instancia de un objeto que, o bien no ha sido creado aún, o bien ya fue destruido. Ahora bien, ya que dices que has hecho una aplicación "de prueba" (estupenda idea, en mi opinión), ¿porqué no adjuntas en este mismo Hilo, en otro mensaje, el código fuente de la misma?

Es sencillo adjuntar archivos a un mensaje. Fíjate en el formulario que te sirve para publicar y/o editar tus mensajes: abajo de los botones "Enviar" o "Editar" encontrarás unas "Opciones adicionales". Ahí encontrarás un botón de nombre "Manegar archivos adjuntos". A partir de ahí no creo que tengas problemas.

Únicamente ten en cuenta que no puedes adjuntar archivos "muy grandes", así que, sitúa en una carpeta los archivos "pas" y "dpr" de la aplicación de prueba y comprímelos luego en formato ZIP, por ejemplo. Generalmente algo así ocupará 2 ó 3 KB y no te tendrás problemas en adjuntar el archivo de marras. ¿Qué te parece?

David 01-10-2006 11:24:17

1 Archivos Adjunto(s)
Adjunto el ejemplo fácil que he realizado , que da el mismo error , la aplicación principal no la pongo claro , por que ocupa varios megas . Pero se ve claro , donde falla la cosa .

Formulario principal , voy al formulario 1 , y de ahí quiero ir al otro formulario , y que el label sea visible .

dec 01-10-2006 11:32:15

Hola,

Bueno. Pues el tema está en que tratas de acceder a un objeto (el Label) que se encuentra en el "Formulario 3" y, este último, no está creado, o, por mejor decir, no está correctamente "referenciado"... ¿Cómo que no está creado si tú te encargas de hacer lo siguiente?

Código Delphi [-]
procedure TForm2.BitBtn1Click(Sender: TObject);
begin
    TForm3.Create(Application);
    with Form3 do
        Verlabel;
   {
     Si lo pongo así tambíen da error
    with (ActiveMDIChild as TForm3) do
     Verlabel;  }
end;

Bueno. Fíjate que estás creando una instancia de "TForm3", pero, ¿a quién estás "asignando" dicha instancia? ¿Qué variable tendrá la referencia a dicha instancia? Para que fuera "Form3" (la variable) tendrías que hacer algo así, sencillamente:

Código Delphi [-]
procedure TForm2.BitBtn1Click(Sender: TObject);
begin
    Form3 := TForm3.Create(Application);
    with Form3 do
        Verlabel;
   {
     Si lo pongo así tambíen da error
    with (ActiveMDIChild as TForm3) do
     Verlabel;  }
end;

Y ya está... ya no tendrás problemas en hacer lo que precisas, como podrás comprobar tú mismo. :)

David 01-10-2006 11:45:45

Gracias, que fácil es la solución .

Ayer estuve horas , probando de todo , y esta mañana , daba vueltas a la cabeza , y me he levantado bastante temprano , al final la cosa era más fácil de lo que parece .

Un saludo


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

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