Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Error al cargar formularios con TFrm_name.Create(self) (https://www.clubdelphi.com/foros/showthread.php?t=89237)

theheriko 21-10-2015 04:50:23

Error al cargar formularios con TFrm_name.Create(self)
 
Buenas comunidad,

Luego de pasar un buen rato buscando en el foro algún problema similar al mío decidí iniciar este hilo. Siempre cuando me enfrento a problemas que desconozco abro un nuevo proyecto en blanco y hago test.

Uso Delphi 7 enterprise
form1(uni1)main
Código Delphi [-]
uses
  unit2;

procedure TForm1.Button1Click(Sender: TObject);
begin
  //form2.ShowModal; 
  with TForm2.Create(Self) do
    try
      showModal;
    finally
      Free;
  end;
end;

//form1 = formulario principal donde esta el menu y desde aquí se accede a todos los demás forms.
//Pulsando el botoncillo, llamo al form2.

form2(unit2)
Código Delphi [-]
uses
unit3;

procedure TForm2.Button1Click(Sender: TObject);
begin
  with TForm3.Create(Self) do
    try
      showModal;
    finally
      Free;
  end;
end;
//en este form tengo un edit1 y button1
//pulsando el boton, llamo al form3

form3(unit3)
Código Delphi [-]
uses
  unit2;
procedure TForm3.Button1Click(Sender: TObject);
begin
  form2.Edit1.Text := edit1.Text;
end;

//Ingreso un valor cualquiera al edit1 de este form3 y quiero que se muestre 
//en el edit1 del form2

Cuando le hago click al boton que esta en el form3, error.
Código Delphi [-]
...raised exception class EAccessViolation...
Access violation at address...

ESCENARIO 01
auto-create forms : form1
available forms : form2,form3
Error, muestra el mensaje de error: ...raised exception class EAccessViolation... Access violation at address...

ESCENARIO 02
auto-create forms : form1,form2,form3
available forms : ninguno
No muestra ningun mensaje de error, pero el valor que paso del form3 al form2, no funciona.

ESCENARIO 03
auto-create forms : form1,form2,
available forms : form3
Quito y dejo de llamar al form2 con with TForm2.Create(Self) do... y más bien llamo al form2 con form2.ShowModal y todo funciona bien, ya no hay errores y el valor del form3 se pasa correctamente al form2.

PREGUNTAS
01 ¿Porque el error del escenario 01?
02 ¿Es valido trabajar de la forma mostrada en el escenario 03?
03 ¿Es propenso a errores pasar los datos así directamente, cual es la forma ideal?
-form2.edit1.text, o crear una variable publica. Para guardar ahí el dato y luego volver a asignarlo desde donde se requiera.


---
Soy nuevo en el foro, y volviendo a usar Delphi 7 después de 10 años. Me entero que Delphi esta en la versión 10 Seatle, al leer a todos mencionar que usan XE, X3, etc yo siento que estoy usando una herramienta ya obsoleta (aunque no lo creo, algo me dice que Delphi 7 no esta mal y yo feliz), he leído que Delphi 8 es el comienzo a .NET y de ahí para adelante hubieron muchos cambios.

Tengo muchas dudas, que las haré en su momento y en los lugares respectivos.
Saludos y gracias.

mamcx 21-10-2015 05:19:20

Si haces un paso-a-paso entenderas el error del escenario 1. Los otros son variaciones del 1 y el porque si/no saca error te debe quedar claro si haces el paso-a-paso.

---
Con respecto a las versiones de Delphi: Usa la ultima de poder (que es la recomendación estándar sobre cualquier herramienta). Lo unico es que Delphi 8 fue un experimento fallido y no hay Delphi para .NET. Lo mas cercano es http://www.elementscompiler.com/elem...e/default.aspx

theheriko 21-10-2015 05:45:15

Gracias, mamcx.

Será que estoy días, metido frente a la computadora. Recordando y volviendo a entender sobre muchas cosas. Necesito desarrollar una aplicación (beta) y estoy a contra reloj, en el 2005 leí casi al completo la cara oculta de Delphi 6 un gran libro por cierto. Y si voy a tener que documentarme mucho sobre .create(self), nil, etc. De momento estoy haciendo algo que funcione, a nivel beta luego tendré que volver a hacer optimizando y mejorando por iteraciones.

Expuse mi problema, porque se que hay alguien experimentado que viendo ese código en 5 seg, daría con ese error, justo antes de tener este problema tuve otro con las consultas sql y los tipos de datos, luego antes con los commit de las transacciones, es gracioso pero avanzo un poco y paralizado con algún problema que escapa a mi entendimiento, claro eso es momentáneo porque se resuelven uno a uno, el problema que plantee en este hilo lo estoy rodeando y sigo adelante pero es algo que tengo que entender. Confío en que alguien con un poco de tiempo y buen humor se de el tiempo de explicar sobre el problema del escenario 01.

Seguramente yo lo responderé también, pero cuando entienda el porque del error.

Una vez más gracias. mamcx. ^\||/

AgustinOrtu 21-10-2015 06:32:58

Consejo de amigo: No uses el with. Te aviso ahora con tiempo antes de que vayas por la mitad de tu aplicacion :)

ElKurgan 21-10-2015 07:33:22

Creo que el problema del escenario 1 se explica por si mismo:

Código Delphi [-]
with TForm2.Create(Self) do
  try
    showModal;
  finally
    Free;
end;

Aquí etás creando un objeto de la clase TForm2, pero ¿Es la variable Form2? Yo creo que no, sino que es una creada al vuelo por Delphi.

En los otros escenarios no te da porque al ser formularios "Autocreate"... ¡¡¡ La variable Form2 se está creando al vuelo !!!

Asi debería funcionar:

Código Delphi [-]
If not Assigned(Form2) then
  Form2 := TForm2.Create(Self);
try
  Form2.showModal;
finally
    Form2.Free;
end;

Saludos

olbeup 21-10-2015 08:44:08

Como dice, ElKurgan

El error es porque estas creando la clase TFrom2 y TFrom3 pero no el objecto de la variable que es Form2 o Form3.

Estas creando en memoria la clase de TFrom2 o TFrom3 pero el nombre del objecto no es Form2 o Form3, es uno que delphi le ha dado por defecto, como por ejemplo, Form2_1 o Form3_1, pero estos objectos que ha creado delphi no lo puedes utilizar porque no existen, sólo es interno del TFrom2 o TFrom3 al crear su clase.

Yo utilizo mucho, pero mucho los with, pero si estas empezando con el with tienes que entender su funcionamento, si no sabe como es su comportamiento, te recomiendo que lo utilices poco a poco, amenos que sepas como funciona.

Un saludo.

theheriko 23-10-2015 01:12:28

Cita:

Empezado por ElKurgan (Mensaje 498179)

Asi debería funcionar:

Código Delphi [-]
If not Assigned(Form2) then
  Form2 := TForm2.Create(Self);
try
  Form2.showModal;
finally
    Form2.Free;
end;

Saludos

:eek:

Si lo explicas de esa forma tan clara, es cómo para no olvidarlo nunca jamas. Si leí en otros post del foro hablaban de hacer referencia a variables que no existen. Se que me falta mucho por leer y tengo tanto que aprender.
Muchas gracias, no sabes cuanto te lo agradezco.
Gracias por tu tiempo.

theheriko 23-10-2015 01:21:06

Cita:

Empezado por olbeup (Mensaje 498181)
Como dice, ElKurgan

El error es porque estas creando la clase TFrom2 y TFrom3 pero no el objecto de la variable que es Form2 o Form3.

Estas creando en memoria la clase de TFrom2 o TFrom3 pero el nombre del objecto no es Form2 o Form3, es uno que delphi le ha dado por defecto, como por ejemplo, Form2_1 o Form3_1, pero estos objectos que ha creado delphi no lo puedes utilizar porque no existen, sólo es interno del TFrom2 o TFrom3 al crear su clase.

Yo utilizo mucho, pero mucho los with, pero si estas empezando con el with tienes que entender su funcionamento, si no sabe como es su comportamiento, te recomiendo que lo utilices poco a poco, amenos que sepas como funciona.

Un saludo.

Nuestro amigo ElKurgan, lo dijo con código y tú con palabras y también te agradezco por el tiempo. Ahora lo entiendo.

Respecto a los with, no leí documentación al respecto. Pero deduje que se usa para simplificar, ya me documentaré más,
Muchas gracias. ^\||/

ElKurgan 23-10-2015 06:57:43

Efectivamente, el with es muy utilizado para simplificar. Pero hay que tener cuidado con su uso.

Por ejemplo, si sabes que una porción de código no es propensa a fallos lo puedes usar sin problemas. Pero como tengas que depurar ese trozo para ver lo que está pasando, la ayuda del depurador no sabe resolver las variables que están dentro de dicho with.

Aunque hay trucos para que funcione, es mejor no usarlo cuando no tengas las cosas muy claras

Saludos

theheriko 23-10-2015 13:20:31

Cita:

Empezado por ElKurgan (Mensaje 498310)
Efectivamente, el with es muy utilizado para simplificar. Pero hay que tener cuidado con su uso.

Por ejemplo, si sabes que una porción de código no es propensa a fallos lo puedes usar sin problemas. Pero como tengas que depurar ese trozo para ver lo que está pasando, la ayuda del depurador no sabe resolver las variables que están dentro de dicho with.

Aunque hay trucos para que funcione, es mejor no usarlo cuando no tengas las cosas muy claras

Saludos

A veces me lanza errores, y no muestra el lugar específico. Se me complica un poquito encontrando el porque, no se si sea por ello, para que correr riesgos. Además si me lo recomienda un veterano, pues claro que lo hago.

Gracias ElKurgan!


La franja horaria es GMT +2. Ahora son las 09:53:30.

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