Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Access violation (https://www.clubdelphi.com/foros/showthread.php?t=77170)

jocaro 29-12-2011 12:32:31

Access violation
 
Hola, a ver si me podéis ayudar.

He creado un form para acceder a base de datos con el siguiente código:

unit BasDat;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DB, DBAccess, Uni, UniProvider, SQLiteUniProvider;

type
TFormBasDat = class(TForm)
ProveedorSqlite: TSQLiteUniProvider;
ConexionBDSqlite: TUniConnection;
private
{ Private declarations }
public
{ Public declarations }
end;

var
FormBasDat : TFormBasDat ;

implementation

{$R *.dfm}

end.


El .dpr tiene el siguiente código

program Sdiapp;

uses
Forms,
SDIMAIN in 'SDIMAIN.PAS' {SDIAppForm},
BasDat in 'BasDat.pas' {FormBasDat};

{$R *.RES}

begin

with TFormBasDat.Create(Application)do
begin
Visible:= False;
end;

Application.Initialize;
Application.CreateForm(TSDIAppForm, SDIAppForm);
Application.Run;
end.

Cuando intento acceder desde el evento create de SDIAppForm (form principal), en el que he metido el uses de FormBasDat, me devuelve un access violation. El evento oncreate tiene el siguiente código

procedure TSDIAppForm.EstablecerInicio(Sender: TObject);
begin

FormBasDat.ConexionBdSqlite.Connected := True;
FormBasDat.ConexionBDSqlite.StartTransaction;

end;

He recorrido el código con debug y encuentro que el form de base de datos se ejecuta sin problemas, pero en la primera línea ejecutada en el oncreate anterior (FormBasDat.ConexionBdSqlite.Connected := True;) me devuelve "inaccessible value". Que es lo que estoy haciendo mal

Un saludo

Casimiro Noteví 30-12-2011 05:45:13

Bienvenido a clubdelphi, ¿ya leiste nuestra guía de estilo?, gracias por tu colaboración.

jocaro 30-12-2011 15:20:00

Access violation (llamada a componente de otro form)!!
 
Hola

He leido la guía, he buscado en google y en la búsqueda del foro, he puesto la consulta en "Varios" ya que no sabía en que apartado ponerlo y en la búsqueda encontré varios mensajes sobre el tema. He intentado explicarme y documentar con detalle el problema, he puesto en distinto color el código, etc. Si me comentas lo de la guía por un motivo específico me gustaría que me lo indicaras para tenerlo en cuenta y no reincidir.

En cuanto a la consulta no encuentro respuesta, me imagino que será algún detalle trivial que no alcanzo a ver, porque no tengo experiencia en delphi y voy aprendiendo sobre muchos conceptos de éste, a la vez. Si, a partir de la información que os presento, alguien conoce el motivo o lo sospecha, por el cual me falla el código le agradecería que me lo comentara.

Un saludo y gracias de antemano.

ecfisa 30-12-2011 16:13:43

Hola jocaro.

Por favor cuando incluyas código en tus mensajes usa TAG's para que sea más legible:


En cuanto al código, no entiendo la lógica de la creación. Pareciera que deseas que FormBasDat sea el form principal, se oculte y se muestre SDIAppForm.

Si es así, probá si de este modo logras lo que estás buscando:
Código Delphi [-]
...
  Application.Initialize;
  Application.CreateForm(TFormBasDat, FormBasDat);
  Application.ShowMainForm:= False;
  Application.CreateForm(TSDIAppForm, SDIAppForm);
  SDIAppForm.Show;
  Application.Run;
...


Saludos.

jocaro 30-12-2011 16:18:00

Access violation (llamada a componente de otro form)
 
Hola

He seguido leyendo y probando y he conseguido resolver el problema

Con el código original en el cual el form FormBasDat se creaba en el fichero.dpr la aplicación lanzaba un "access violation". Parece que el form no se ha creado cuando se utiliza en el siguiente form codificado en fichero.dpr (SDIMAIN), aunque desconozco el motivo

Con la creación de FormBasDat en el evento oncreate del form SDIMAIN, justo antes de referirse a él, la aplicación funciona correctamente

procedure TSDIAppForm.EstablecerInicio(Sender: TObject);
begin

FormBasDat := TFormBasDat.Create(Application);

FormBasDat.ConexionBdSqlite.Connected := True;
FormBasDat.ConexionBDSqlite.StartTransaction;

end;


Un saludo y gracias

Casimiro Noteví 30-12-2011 17:38:50

Por favor, tal y como te ha comentado ecfisa, recuerda poner etiquetas (tags) al código, gracias por tu colaboración.
Ejemplo:



.

jocaro 30-12-2011 18:42:06

Access violation (llamada a componente de otro form)
 
Gracias ecfisa, tendré en cuenta lo que me comentas de poner tags el código.

En cuanto a la lógica te comento que el form principal es SDIAppForm, de hecho al principio era el único existente, ahí estaba todo el código de la aplicación. Posteriormente me planteé organizar un poco dicho código y saque lo referente a base de datos (es decir componentes de conexión, data sources, etc.) a otro form llamado FormBasDat. La idea era crear el form de base de datos al principio y posteriormente crear el form principal, hacerlo visible y poder acceder desde él a FormBasDat, para utilizar sus conexiones.

He conseguido mi propósito cambiando el lugar donde creo FormBasDat como indico en otro de los mensajes.

Espero haberme explicado al menos lo suficiente para hacerme entender.

Un saludo y gracias por vuestro tiempo y atención.


La franja horaria es GMT +2. Ahora son las 10:29:57.

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