Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > FireMonkey
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo Hace 4 Semanas
vicens22 vicens22 is offline
Miembro
 
Registrado: Dec 2010
Posts: 56
Poder: 8
vicens22 Va por buen camino
Acceso a objetos de un form desde otro

Estoy desarrollando con Delphi Tokyo y Firemonkey una aplicación para Android e IOS, y me encuentro con el siguiente problema, que imagino que también sucederá programando en VCL, pero por si acaso lo publico aquí.

Ya me encontré con el mismo problema hace unos meses, pero en ese momento lo pude solventar simplemente poniendo los formularios que contienen los objetos a los que hago referencia como "autocreates" en el project, pero ahora me gustaría poder quitarlos de ahí, ya que ralentizan el arranque de la aplicación en el dispositivo móvil.

Se trata simplemente de poder acceder a objetos (tedit y similares, cambiando por ejemplo su propiedad text), que están en un formulario desde otro, sin que el formulario que contiene esos objetos tenga que ser autocreate. Lo que me ocurre al intentar acceder a sus propiedades es que obtengo un error "Access violation".

He creado un ejemplo simplificando el problema (adjunto los ficheros del mismo).
Son tres unidades/formularios: Main, Form1 y Form2.
Sólo Main está como "autocreate" en el project.
En Main, hay un botón que crea Form1, el cual contiene un objeto tLlabel, un tEdit y un botón que crea Form2.
El error (Access violation) ocurre cuando en este último formulario (Form2), intento modificar las etiquetas .text del label y el edit que se encuentran en Form1 (hay un botón que hace simplemente eso).

Este error no ocurre (y se modifican correctamente los objetos label y tedit), si en el project hago que Form1 sea "autocreate", pero ya he comentado que necesito evitar esto para mejorar el arranque de la aplicación, ya que hay varios formularios en los que me ocurre lo mismo.

Gracias por cualquier ayuda.
Saludos,

Vicens
Archivos Adjuntos
Tipo de Archivo: zip Acceso_a_forms.zip (56,3 KB, 2 visitas)
Responder Con Cita
  #2  
Antiguo Hace 4 Semanas
Avatar de Caminante
Caminante Caminante is offline
Miembro
 
Registrado: Oct 2010
Ubicación: Lima - Peru
Posts: 285
Poder: 9
Caminante Va camino a la fama
Hola


La razon para que funcione al tener los forms como autocreate es que para acceder a los mismos deben estar creados. En tal caso deberias crearlos cuando los necesites (No hay necesidad de que esten en autocreate) y liberarlos despues.


Saludos
__________________
Caminante, son tus huellas el camino y nada más; Caminante, no hay camino, se hace camino al andar.
Antonio Machado
Responder Con Cita
  #3  
Antiguo Hace 4 Semanas
vicens22 vicens22 is offline
Miembro
 
Registrado: Dec 2010
Posts: 56
Poder: 8
vicens22 Va por buen camino
Hola,

Gracias por tu respuesta, pero si revisas el código del ejemplo subido, verás que los dos formularios que no son "autocreate" (form1 y form2) son creados. Primero form1 desde el main y luego form2 desde form1.
Es decir los tres están creados cuando obtengo el error (Access violation).
Aquí tienes el código del procedimiento que utilizo para crear y visualizar los dos formularios:


Código Delphi [-]
procedure TfMain.OpenTestForm(cForm: string);

procedure OpenForm(form: TForm);
    begin
      form.Show;
    end;
begin
 if cForm = 'form1' then
  begin
     OpenForm(tfForm1.Create(self));
 //    fForm1.Show;    // Si fForm1 es autocreate
  end
  else if cForm = 'form2' then
  begin
     OpenForm(tfForm2.Create(self));
  end
end;

Si tienes oportunidad pruébalo ejecutándolo en Windows y podrás comprobar que como te comento, los tres forms están creados.

Gracias de nuevo.
Saludos,
Responder Con Cita
  #4  
Antiguo Hace 4 Semanas
Avatar de Caminante
Caminante Caminante is offline
Miembro
 
Registrado: Oct 2010
Ubicación: Lima - Peru
Posts: 285
Poder: 9
Caminante Va camino a la fama
Hola


Por desgracia no cuento con una version de delphi donde probar pero viendo el codigo que pusiste no veo forma que referencies a los controles de los formularios ya que no tienes ninguna variable apuntando a ellos. En este caso no sirve usar las variables que se crean automaticamente en la unidad de los formularios.


Podrias cambiar los metodos para que te devuelvan una referencia al formulario creado (Lo que tambien lleva sus riesgos de memoria) y ya con la referencia podrias hacer lo que deseas


Saludos
__________________
Caminante, son tus huellas el camino y nada más; Caminante, no hay camino, se hace camino al andar.
Antonio Machado
Responder Con Cita
  #5  
Antiguo Hace 4 Semanas
vicens22 vicens22 is offline
Miembro
 
Registrado: Dec 2010
Posts: 56
Poder: 8
vicens22 Va por buen camino
Hola,

Lo siento, pero no veo claro como probar lo que propones.
Pero sigo sin entender, porqué si Form1 es autocreate el mismo código funciona sin problema ??

Saludos,
Responder Con Cita
  #6  
Antiguo Hace 4 Semanas
Avatar de Caminante
Caminante Caminante is offline
Miembro
 
Registrado: Oct 2010
Ubicación: Lima - Peru
Posts: 285
Poder: 9
Caminante Va camino a la fama
Cita:
Empezado por vicens22 Ver Mensaje
Hola,

Lo siento, pero no veo claro como probar lo que propones.
Pero sigo sin entender, porqué si Form1 es autocreate el mismo código funciona sin problema ??

Saludos,
Supongo que cuando referencias al formulario lo haces asi:

Código Delphi [-]
form1.edit1.text:='Lo que sea'

Al ser forms autocreados la variable form1 ya esta inicializada y puedes usarla sin problemas. Al crear los forms de la otra manera no asignas nada a 'Form1' por eso da errores de memoria.

Podrias probar asi:
Código Delphi [-]
procedure TfMain.OpenTestForm(cForm: string); 
begin  
  if cForm = 'form1' then   
  begin
    form1:=tfForm1.Create(self);      
    fForm1.Show;     
  end  
  else if cForm = 'form2' then   
  begin
    form2:=tfForm2.Create(self);
    form2.show
  end 
end;
Lo hice apegandome a tu codigo. Se puede mejorar pero creo que se puede entender la idea.

Saludos
__________________
Caminante, son tus huellas el camino y nada más; Caminante, no hay camino, se hace camino al andar.
Antonio Machado

Última edición por Casimiro Notevi fecha: Hace 4 Semanas a las 10:06:26.
Responder Con Cita
  #7  
Antiguo Hace 4 Semanas
vicens22 vicens22 is offline
Miembro
 
Registrado: Dec 2010
Posts: 56
Poder: 8
vicens22 Va por buen camino
Efectivamente, tenias toda la razón, ahora sí pude verlo.
No lo veía, aún teniéndolo delante.
Al estar el formulario visible, no caía en que la variable no estaba inicializada.
Ya modifiqué la creación de los formas y pude conseguir lo que pretendía.

Muchísimas gracias por tu ayuda!!!
Saludos
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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
Acceso desde un formulario y sus objetos desde otro vicens22 FireMonkey 4 25-04-2018 20:21:28
Acceso a la prop State de ClientDataSet en otro Form bulc Varios 12 09-12-2016 16:30:55
Manipular objetos desde otro objeto en otro form Nicolas_2011 Delphi para la web 8 17-11-2012 18:12:51
Acceso a objetos/propiedades de otro Form adrall OOP 6 30-07-2011 10:15:24
llamar al evento click de un boton q se encuentra en un form desde otro form TURBOIGOR OOP 6 02-12-2008 14:50:16


La franja horaria es GMT +2. Ahora son las 02:14:42.


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