Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Llamada entre ventana usando paquetes. (https://www.clubdelphi.com/foros/showthread.php?t=72078)

PittyDelphi 26-01-2011 21:20:26

Llamada entre ventana usando paquetes.
 
Que tal?

Estoy usando un paquete (.bpl) que contiene todos los formularios que se usan en el proyecto. El problema se da así:

En el formulario 1 instancio el 2:

Código Delphi [-]
fmFormularioDos:= TfmFormularioDos.Create(nil);

Ahora, cuando desde el formulario 2 quiero llamar al 1 o algún componente de este me da un error. Por ejemplo:

Código Delphi [-]
if fmFormularioUno.cActividad.State = dsInsert then
   begin
      Self.Caption := 'Nueva Actividad';
      cbTipo.ItemIndex := 0;
      fmFormularioUno.cActividad.FieldByName('codactividad').Value := 0;
 end;

Usando un Try para obtener el mensaje técnico lo que obtengo es:

"AccessViolation at address 005BD9D0 in module 'Fuentes.bpl'. Read of address 000002F8'.

La dirección de memoria es donde esta la llamada al formulario 1. Lo que menciona de 'Fuentes.bpl' es lo que mencione donde están todos los formularios/fuentes que se usan en el proyecto.

Agradezco su ayuda. Pitty.

Neftali [Germán.Estévez] 27-01-2011 10:21:59

Normalmente los errores de Access Violation dan cuando estás accediendo a un elemento/objeto que no está creado o que ya se ha destruído.

Estaría bien saber cómo estás cargando los paquetes (estático o dinámico) y cómo están linkados.

¿Al debuggedo paso a paso? a ver en qué línea exactamente "peta".
Otra posibilidad es que crees un pequeño proyecto con un par de formularios vacíos y donde hagas las mismas operaciones para ver algo de código, sino es difícil saber donde puede estar el fallo.

Las líneas que pones no parecen ser incorrectas, el problemas puede estar en cómo las utlices y dónde. ?¿?¿?

jafera 27-01-2011 11:24:36

Yo tuve un problema similar, use eurekalog para revisar el codigo y vi que el error me lo daba en una llmada a un componente del form en el cual ponia el nombre del form delante.
Podrias probar si anulando lo que he subrayado te funciona.
Código Delphi [-]
if fmFormularioUno.cActividad.State = dsInsert then   
begin      Self.Caption := 'Nueva Actividad';      
cbTipo.ItemIndex := 0;      
fmFormularioUno.cActividad.FieldByName('codactividad').Value := 0; 
end;
Saludos

Josep

PittyDelphi 27-01-2011 12:28:37

Muchas gracias por sus respuestas! Pasó a comentar;

Cita:

Empezado por Neftali (Mensaje 389010)
Normalmente los errores de Access Violation dan cuando estás accediendo a un elemento/objeto que no está creado o que ya se ha destruído.

Estaría bien saber cómo estás cargando los paquetes (estático o dinámico) y cómo están linkados.

¿Al debuggedo paso a paso? a ver en qué línea exactamente "peta".
Otra posibilidad es que crees un pequeño proyecto con un par de formularios vacíos y donde hagas las mismas operaciones para ver algo de código, sino es difícil saber donde puede estar el fallo.

Las líneas que pones no parecen ser incorrectas, el problemas puede estar en cómo las utlices y dónde. ?¿?¿?

Sí, hice un debug paso a paso y me encontré que el error estaba cuando llamaba a la otra ventana, sea para lo que sea. La carga es dinámica. El paquete se carga al comienzo y va llamando dinámicamente a las ventanas (la ventaja del paquete es no cargar todos los formularios en memoria al iniciar la aplicación). El proyecto es un sistema ya hecho que se esta "empaquetando", son cientos de ventanas, pero es un solo paquete para todo.

Cita:

Yo tuve un problema similar, use eurekalog para revisar el codigo y vi que el error me lo daba en una llmada a un componente del form en el cual ponia el nombre del form delante.
Podrias probar si anulando lo que he subrayado te funciona.
Exacto! Eso me pasa cuando llamo algo en el mismo formulario, como por ejemplo lo de 'cActividad' que ponía en el ejemplo. Sacando la primer parte funciona. Pero cuando esta en la otra ventana no da resultado.

Mi sospecha es que el paquete usa los hilos de forma diferente y como que no queda registrado, por eso no lo encuentra. Quizás haya que poner algo para que eso no ocurra, (por ahí leí que decía de poner TFormularioUno.Create(AHandler) al crearlo pero no encuentro ese AHandler...). Es ahí donde se me quemaron los libros. Los modulos son la exepción ya que lo creo al abrir la ventana y después funciona lo más bien, se pueden hacer llamadas a los componentes de consultas a base de datos (aunque no siempre funcionan bien los updates al formulario).

Gracias de nuevo por la ayuda que me puedan dar!


La franja horaria es GMT +2. Ahora son las 22:56:08.

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