Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 21-10-2015
theheriko theheriko is offline
Registrado
NULL
 
Registrado: oct 2015
Posts: 9
Poder: 0
theheriko Va por buen camino
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.
Responder Con Cita
  #2  
Antiguo 21-10-2015
Avatar de mamcx
mamcx mamcx is offline
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.911
Poder: 25
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
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
__________________
El malabarista.
Responder Con Cita
  #3  
Antiguo 21-10-2015
theheriko theheriko is offline
Registrado
NULL
 
Registrado: oct 2015
Posts: 9
Poder: 0
theheriko Va por buen camino
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.
Responder Con Cita
  #4  
Antiguo 21-10-2015
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Poder: 15
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
Consejo de amigo: No uses el with. Te aviso ahora con tiempo antes de que vayas por la mitad de tu aplicacion
Responder Con Cita
  #5  
Antiguo 21-10-2015
Avatar de ElKurgan
[ElKurgan] ElKurgan is offline
Miembro Premium
 
Registrado: nov 2005
Posts: 1.234
Poder: 20
ElKurgan Va camino a la fama
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
Responder Con Cita
  #6  
Antiguo 21-10-2015
Avatar de olbeup
olbeup olbeup is offline
Miembro
 
Registrado: jul 2005
Ubicación: Santiago de la Ribera (España)
Posts: 685
Poder: 19
olbeup Va camino a la fama
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.
__________________
Al hacer una consulta SQL, haz que los demás te entiendan y disfruten de ella, será tú reflejo de tú saber.

Última edición por olbeup fecha: 21-10-2015 a las 08:48:21.
Responder Con Cita
  #7  
Antiguo 23-10-2015
theheriko theheriko is offline
Registrado
NULL
 
Registrado: oct 2015
Posts: 9
Poder: 0
theheriko Va por buen camino
Cita:
Empezado por ElKurgan Ver Mensaje

Asi debería funcionar:

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

Saludos


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.
Responder Con Cita
  #8  
Antiguo 23-10-2015
theheriko theheriko is offline
Registrado
NULL
 
Registrado: oct 2015
Posts: 9
Poder: 0
theheriko Va por buen camino
Cita:
Empezado por olbeup Ver Mensaje
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.
Responder Con Cita
  #9  
Antiguo 23-10-2015
Avatar de ElKurgan
[ElKurgan] ElKurgan is offline
Miembro Premium
 
Registrado: nov 2005
Posts: 1.234
Poder: 20
ElKurgan Va camino a la fama
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
Responder Con Cita
  #10  
Antiguo 23-10-2015
theheriko theheriko is offline
Registrado
NULL
 
Registrado: oct 2015
Posts: 9
Poder: 0
theheriko Va por buen camino
Cita:
Empezado por ElKurgan Ver Mensaje
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!
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Diferencia de crear formularios con Create(self) y con Application.CreateForm Lizette Varios 4 30-03-2009 08:46:44
DataModule.Create Error Enan0 Varios 4 23-09-2008 15:13:16
error en create function lookmydoom MySQL 0 12-01-2007 04:20:59
Cargar formularios en un TPanel PTW Varios 2 24-05-2005 13:08:21
error en el create table xerkan Firebird e Interbase 3 07-10-2003 15:43:24


La franja horaria es GMT +2. Ahora son las 21:46:55.


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
Copyright 1996-2007 Club Delphi