Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Clase global en un proyecto (https://www.clubdelphi.com/foros/showthread.php?t=51949)

totote 04-01-2008 22:18:13

Clase global en un proyecto
 
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:
Código Delphi [-]
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:
Código Delphi [-]
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:
Código Delphi [-]
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.

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,


La franja horaria es GMT +2. Ahora son las 14:59: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