Error datamodule lazarus / 10-Designer ---------------------------------------------------------------------- kitsume · 2007-12-23 19:48 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 · 2007-12-27 09:11 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 · 2007-12-28 08:43 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 · 2007-12-28 10:39 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 · 2007-12-28 14:27 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