Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   FireMonkey (https://www.clubdelphi.com/foros/forumdisplay.php?f=50)
-   -   Acceso desde un formulario y sus objetos desde otro (https://www.clubdelphi.com/foros/showthread.php?t=93029)

vicens22 24-04-2018 20:14:11

Acceso desde un formulario y sus objetos desde otro
 
Estoy desarrollando un proyecto con Delphi Berlin y Firemonkey y me encuentro con el siguiente problema, que intuyo que es básico, pero no consigo encontrarle solución.

Se trata simplemente de como acceder a objetos (variables y campos de edición que están en un formulario desde otro).
En las pruebas iniciales, tenía tan solo dos formularios y no tuve problema para acceder desde Form2 a variables y objetos que estaban en Form1 (el cual era el formulario principal del proyecto "Main Form" en options).

En cuanto he añadido más módulos y Form1, ha dejado de ser el formulario principal, el acceso al mismo desde el segundo formulario (Form2) no es posible, dándome error al intentarlo y pudiendo comprobar al hacer "debug" que no es posible el acceso a Form1.

A continuación está el código simplificado de ambos formularios, concretamente el error lo da en las siguientes lineas:

uQProvin.SQL.Text :='select * from ' + Form1.cBase + '.dbo.Provincias order by cNomPrv';

Form1.lEditProvin.items.Clear;

Gracias por cualquier aclaración o sugerencia.
Saludos,

Código Delphi [-]
/******************* Formulario 1 **************

Unit uForm1;

interface

uses
System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,.

type
TForm1 = class(TForm)
lEditProvin: listEditor;
procedure ....

{ Private declarations }

public
{ Public declarations }
cBase, cCodFotos, RemoteServer: string;
nCodFotos: integer;

public
end;

var
fForm1: TForm1;

implementation

uses uLogin, uForm2;
......

/// ******************* Formulario 2 *****************************

unit uForm2;

interface

uses
System.SysUtils, .......

type
TfForm2 = class(TForm)
FooterLayout: TLayout....

private
{ Private declarations }
public
{ Public declarations }
end;

var
fForm2: TForm2;

implementation

uses uLogin, uForm1;

procedure TfForm2.FormCreate(Sender: TObject);
var lLocate: boolean;
SearchOptions: TLocateOptions;
sFields: TStringList;
i: integer;
begin

begin
With ClientModule1 do
begin
uQProvin.Close;
uQProvin.SQL.Text :='select * from ' + Form1.cBase + '.dbo.Provincias order by cNomPrv';
uQProvin.Open;
end;

Form1.lEditProvin.items.Clear;

end;

end;

ElKurgan 25-04-2018 10:07:14

En principio no puedes/debes tener declaraciones en Form1 de Form2 en la parte "implementation" y viceversa, ya que crea referencias cruzadas entre los formularios.

Uno debes declararlo en la parte "Interface" y otro en la parte "Implementation" para evitar ese problema

Saludos

Neftali [Germán.Estévez] 25-04-2018 12:43:20

Sugerencias:
  • Cuando obtemos un error estaría bien saber cual es el error.
  • Otra cosa que ayuda mucho es generar el ZIP con el pequeño proyecto y subirlo.

vicens22 25-04-2018 18:32:12

Muchas gracias a ambos por vuestras respuestas.

Creo que tengo algunas pistas para realizar algunas pruebas e intentar solventarlo.

Tienes toda la razón Neftali en los dos puntos que comentas.
Sin embargo, en el primer punto, el error no lo cite porque creo que no ayuda mucho:

Access violation ad address 013CB776 in module 'xxxxx.exe'.

Y la aplicación se cierra.

Voy a intentar solventarlo y con el resultado que obtenga lo comento de nuevo.
Si no consigo resolverlo, o me quedo con dudas, haré lo que propones, crearé un ejemplo simple y subiré el código.

Muchas gracias de nuevo.
Un saludo.

Neftali [Germán.Estévez] 25-04-2018 21:21:28

Cita:

Empezado por vicens22 (Mensaje 525881)
Sin embargo, en el primer punto, el error no lo cite porque creo que no ayuda mucho:

Access violation ad address 013CB776 in module 'xxxxx.exe'.

Y la aplicación se cierra.

Aunque parezca que no, algo sí ayuda.
Access Violation significa que has intentado acceder a un objeto que no está creado o que ha sido liberado.

Por lo que comentas antes Form1 era el formulario principal y ahora ya no lo es. El formulario principal (por serlo) se crea de forma automática al arrancar el proyecto. Si ahora ya no lo es, es posible que si no has cambiado nada de código, el Form1 que antes estaba creado, ahora ya no lo esté.
Si es así, debes crearlo antes de usarlo.

De todas formas este error debería ser fácil de encontrar si haces debug del programa paso a paso.


La franja horaria es GMT +2. Ahora son las 19:51:43.

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