![]() |
Acceso a objetos de un form desde otro
1 Archivos Adjunto(s)
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 |
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 |
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:
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, |
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 |
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, |
Cita:
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: Lo hice apegandome a tu codigo. Se puede mejorar pero creo que se puede entender la idea. Saludos |
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 |
La franja horaria es GMT +2. Ahora son las 21:52:51. |
Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi