Recent

Author Topic: Error datamodule  (Read 7293 times)

kitsume

  • Newbie
  • Posts: 3
Error datamodule
« on: December 23, 2007, 08:48:54 pm »
Siento mucho escribir en español en un foro que esta en ingles, pero mi ingles es muy malo.
Pero tengo un problema y para mi es muy grave. Estoy empezando con el lazarus y no consigo linkar un form con su datamodule, para que en las propiedades de los componentes que tiene el form se vean los componentes del datamodule.

Este es el codigo del form1
Code: [Select]

unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, DBGrids, Unit2;

type

  { TForm1 }

  TForm1 = class(TForm)
    DBGrid1: TDBGrid;
    procedure FormCreate(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form1: TForm1;

implementation

{ TForm1 }

procedure TForm1.FormCreate(Sender: TObject);
begin


  DBGrid1.DataSource:=DataModule1.Datasource1;
end;

initialization
  {$I unit1.lrs}

end.
 
             


Este es el codigo del datamodule
Code: [Select]

unit Unit2;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, LResources, Forms, Controls, Dialogs, IBConnection, sqldb,
  db;

type

  { TDataModule1 }

  TDataModule1 = class(TDataModule)
    Datasource1: TDatasource;
    IBConnection1: TIBConnection;
    SQLQuery1: TSQLQuery;
    SQLTransaction1: TSQLTransaction;
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  DataModule1: TDataModule1;

implementation

initialization
  {$I unit2.lrs}

end.
   

Todo esto me compila bien, Pero cuando le doy a ejecutar   me  sale  un access violation y ya no se que mas hacer.
Llevo con esto un par de semanas y no consigo nada.

HHHHEEEELLLLPPPP

Si coloco todos los componentes en el mismo form funciona mu bien, pero necesito poder llamar a un datamodule desde diferentes form's

                                        :cry:

gerardus

  • Jr. Member
  • **
  • Posts: 94
RE: Error datamodule
« Reply #1 on: December 27, 2007, 10:11:30 am »
En castellano, y sin que sirva de precedentes  :wink:

Probablemente el error se deba al hecho que cuando asignas el datasource del datamodule este aun no este creado.
Si Form1 es el form principal de tu aplicacion, va a crearse primero.
Todo lo que se ejecute en el OnFormCreate no va a tener acceso a otros forms/datamodules porque aun no existen.
Soluciónes:
1. mueve el código a alguna otra parte
2. altera el orden de creacion y haz que se cree el data module primero.

Saludos,

Gerard

kitsume

  • Newbie
  • Posts: 3
Error datamodule
« Reply #2 on: December 28, 2007, 09:43:21 am »
Gracias por todo. Ahora funciona bien.
Lo unico que me falta es saber como arrancar el datamodule antes para arracar la base de datos y todo, porque sino lo debo de arrancar yo a mano.
Muchas gracias
Kitsume

gerardus

  • Jr. Member
  • **
  • Posts: 94
Error datamodule
« Reply #3 on: December 28, 2007, 11:39:12 am »
Puedes alterar el orden de creación en el fichero del proyecto:

Code: [Select]
program Project1;
{$mode objfpc}{$H+}
uses
  {$IFDEF UNIX}{$IFDEF UseCThreads}
  cthreads,
  {$ENDIF}{$ENDIF}
  Interfaces, // this includes the LCL widgetset
  Forms
  { you can add units after this }, Unit1, Unit2;
begin
  Application.Initialize;

  // en vez de esto:  
  //  Application.CreateForm(TForm1, Form1);
  //  Application.CreateForm(TDataModule1, DataModule1);

  // esto:
  Application.CreateForm(TDataModule1, DataModule1);
  Application.CreateForm(TForm1, Form1);

  Application.Run;
end.



Otra possibilidad quizas más elegante es crear el data module cuando lo necesites:

Code: [Select]
unit Unit2;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, LResources, Forms, Controls, Dialogs;

type

  TDataModule1 = class(TDataModule)
  private
    { private declarations }
  public
    { public declarations }
  end;

  // Desaparace la variable DataModule1, que se vuelve privada en esta
  // unit i se remplaza por una función

  function DataModule1: TDataModule1;

implementation

var
  miDataModule1: TDataModule1;

// esta funcion primero verifica que el datamodule este creado i luego devuelve la instancia
function DataModule1: TDataModule1;
begin
  if miDataModule1=nil then
    miDataModule1 := TDataModule1.Create(Application);
  Result := miDataModule1;
end;


initialization
  {$I unit2.lrs}

end.


Por supuesto, entoces debes eliminar la creacion automatica el proyecto:

Code: [Select]
program Project1;

{$mode objfpc}{$H+}

uses
  {$IFDEF UNIX}{$IFDEF UseCThreads}
  cthreads,
  {$ENDIF}{$ENDIF}
  Interfaces, // this includes the LCL widgetset
  Forms
  { you can add units after this }, Unit1, Unit2;

begin
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.


Saludos,

Gerard

kitsume

  • Newbie
  • Posts: 3
Error datamodule
« Reply #4 on: December 28, 2007, 03:27:43 pm »
Muchas gracias por vuestra ayuda, ya tengo para empezar. Ahora comenzare a probar algunas cosas y pasare algunas aplicaciones de delphi a lazarus

Muchas gracias y saludos.
Kitsume

 

TinyPortal © 2005-2018