PDA

Ver la Versión Completa : Clase global en un proyecto


totote
04-01-2008, 22:18:13
Buenas gente tengo una duda, tengo un proyecto, el cual tiene una clase llamada TUsuarioOnline con sus funciones y un constructor, esta clase la quiero hacer global a todo el proyecto, entonces en defino una instancia de la clase en el source del proyecto, despues intento crear el objeto desde un formulario, pero no me deja, que puedo hacer, aca les dejo el codigo de lo que hice.

Proyecto:

program pCorrelatividades;

uses
Forms,
uLogin in 'uLogin.pas' {fLogin},
udmCorrelatividades in 'udmCorrelatividades.pas' {dmC: TDataModule},
uCorrelatividades in 'uCorrelatividades.pas' {fCorrelatividades},
uClases in 'uClases.pas';
{$R *.res}
var
usuario_online: TUsuarioOnline;
begin
Application.Initialize;
Application.MainFormOnTaskbar := True;
Application.CreateForm(TfCorrelatividades, fCorrelatividades);
Application.CreateForm(TdmC, dmC);
Application.Run;
end.


fLogin:

procedure TfLogin.btAceptarClick(Sender: TObject);
var
user: string;
Nivel: integer;
begin
if (edUser.Text <> '') and (edPass.Text <> '') then
begin
dmC.cdsLogin.Close;
dmC.cdsLogin.Params.ParamByName('user').AsString:= edUser.Text;
dmC.cdsLogin.Params.ParamByName('pass').AsString:= edPass.Text;
dmC.cdsLogin.Open;
if dmC.cdsLogin.RecordCount > 0 then
begin
user:= edUser.Text;
Nivel:= dmC.cdsLogin.FieldByName('nivel').AsInteger;
usuario_online:= TUsuarioOnline.Create(user,Nivel); // <-- aca da error que no reconoce usuario_online
end
else
messagedlg('Datos incorrectos, por favor vuelva a intentar',mtInformation,[mbOk],0);
end
else
messagedlg('Campos incompletos',mtError,[mbOk],0);
end;



uClases:

unit uClases;

interface

type

TUsuarioOnLine = class
private
Usuario: String;
Nivel: integer;
public
constructor Create(nombre: string;Nvl: integer);
function GetUsuario():string;
function GetNivel():integer;
end;

implementation

{ TUsuarioOnLine }

constructor TUsuarioOnLine.Create(nombre: string; Nvl: integer);
begin
Usuario:= nombre;
Nivel:= Nvl;
end;

function TUsuarioOnLine.GetNivel: integer;
begin
result:= Nivel;
end;

function TUsuarioOnLine.GetUsuario: string;
begin
result:= Usuario;
end;

end.


Espero que me puedan ayudar Saludos

dec
04-01-2008, 22:21:59
Hola,

Pues, así a bote pronto, debería funcionar. Tal vez te falte añadir la unidad donde se define "TUsuarioOnline", "uClases", si no me equivoco. Así, el error que te encuentras debería ser que no se sabe nada del tipo "TUsuarioOnline", no acerca de la variable global, pues, como digo, si no me equivoco, eso debería funcionar como esperas.

Caral
04-01-2008, 22:25:08
Hola
De esto no se, pero estas poniendo en el form el uses del unit uClases ?
Supongo que este es el que contiene esto.
Saludos

maeyanes
04-01-2008, 22:27:27
Como bien dice dec, la variable usuario_online es global, más no su tipo... solo agrega en el uses la unidad donde está declarado TUsuarioOnline...


Saludos...

totote
04-01-2008, 22:27:33
si, tengo agregado uClases en uses de fLogin, el error que me tira no es que no reconoce el tipo "TUsuarioOnline", sino que no reconoce la variable global "usuario_online"

maeyanes
04-01-2008, 22:29:32
Vaya, entonces el declarar una variable en el proyecto no la hace global a toda la aplicación...

Es mejor que la variable la declares en la unidad uClases...


Saludos...

totote
04-01-2008, 22:36:40
y si la defino en uClases, y creo el objeto desde fLogin, despues lo podre llamar desde otros formularios?

maeyanes
04-01-2008, 22:38:21
Si... solo tienes que agregar uClases a la cláusula uses del formulario donde lo quieras usar...


Saludos...

totote
04-01-2008, 22:42:05
asi es, ahi recien lo comprobé jeje, muchas gracias por la ayuda. Un saludo a todos

Delphius
05-01-2008, 03:57:15
Hola totote,
La forma correcta de hacer lo que necesitas es siguiendo las directrices que sugiere el patrón Singleton (http://es.wikipedia.org/wiki/Singleton).

Para darte una idea de como realizarlo en delphi sugiero las siguientes lecturas:
http://dn.codegear.com/article/22576
http://www.delphi3000.com/articles/article_1736.asp?SK=

La idea del patrón singleton es que cuando se llama al método GetInstance o NewInstance (o como prefieras llamarlo) se considere previamente si existe ya una instancia de dicha clase. Si es así la función retorno dicha instancia en caso contrario la creará.

Con esto se consigue que al primer momento en que se invoque el método se cree la única instancia permitida, mientras que en las otras invocaciones lo que conseguirás será una referencia a dicha instancia.

Saludos,