Ejemplo-Creación de un objeto COM



El siguiente ejemplo a desarrollar es un control de usuarios. Dependiendo del usuario se permitara acceso o no a un campo de una base de datos, para ello crearemos un método dentro del objeto que realice el control. Además de esto crearemos otro método que dependiendo del usuario entrado nos dará derecho de lectura o de lectura/escritura sobre una tabla. Los métodos se llaman busqueda y sololectura. A continuación se incluye el código asociado:

1º.- Biblioteca de tipos:


 unit Pserver1_TLB;

 interface

 uses Windows, ActiveX, Classes, Graphics, OleCtrls, StdVCL;

 const
   LIBID_Pserver1: TGUID = '{DBD49CA0-0399-11D3-9629-0000E85E7443}';
   IID_Icontrolusu: TGUID = '{DBD49CA1-0399-11D3-9629-0000E85E7443}';
   CLASS_controlusu: TGUID = '{DBD49CA3-0399-11D3-9629-0000E85E7443}';
   IID_Iddd: TGUID = '{DBD49CCE-0399-11D3-9629-0000E85E7443}';
   CLASS_ddd: TGUID = '{DBD49CD0-0399-11D3-9629-0000E85E7443}';
 type
   Icontrolusu = interface;
   IcontrolusuDisp = dispinterface;
   Iddd = interface;
   IdddDisp = dispinterface;
   controlusu = Icontrolusu;
   ddd = Iddd;
   Icontrolusu = interface(IDispatch)
     ['{DBD49CA1-0399-11D3-9629-0000E85E7443}']
     function busqueda(const cadena: WideString): Integer; safecall;
     function sololectura(const cadena: WideString): Integer; safecall;
   end;
   IcontrolusuDisp = dispinterface
     ['{DBD49CA1-0399-11D3-9629-0000E85E7443}']
     function busqueda(const cadena: WideString): Integer; dispid 1;
     function sololectura(const cadena: WideString): Integer; dispid 2;
   end;
   Iddd = interface(IDispatch)
     ['{DBD49CCE-0399-11D3-9629-0000E85E7443}']
   end;
   IdddDisp = dispinterface
     ['{DBD49CCE-0399-11D3-9629-0000E85E7443}']
   end;
   Cocontrolusu = class
     class function Create: Icontrolusu;
     class function CreateRemote(const MachineName: string): Icontrolusu;
   end;
   Coddd = class
     class function Create: Iddd;
     class function CreateRemote(const MachineName: string): Iddd;
   end;

 implementation

 uses ComObj;

 class function Cocontrolusu.Create: Icontrolusu;
 begin
   Result := CreateComObject(CLASS_controlusu) as Icontrolusu;
 end;

 class function Cocontrolusu.CreateRemote(const MachineName: string): Icontrolusu;
 begin
   Result := CreateRemoteComObject(MachineName, CLASS_controlusu) as Icontrolusu;
 end;

 class function Coddd.Create: Iddd;
 begin
   Result := CreateComObject(CLASS_ddd) as Iddd;
 end;

 class function Coddd.CreateRemote(const MachineName: string): Iddd;
 begin
   Result := CreateRemoteComObject(MachineName, CLASS_ddd) as Iddd;
 end;

 end.

2º.- El proyecto:


 program Pserver1;

 uses
   Forms,
   serv1 in 'serv1.pas' {Form1},
   Pserver1_TLB in 'Pserver1_TLB.pas',
   Unit1 in 'Unit1.pas' {controlusu: CoClass};

 {$R *.TLB}

 {$R *.RES}

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

3.- Unit donde creamos el objeto:


 unit Unit1;

 interface

 uses
   ComObj, ActiveX, Pserver1_TLB,classes,dialogs;

 type
   Tcontrolusu = class(TAutoObject, Icontrolusu)
   protected
     function busqueda(const cadena: WideString): Integer; safecall;
     function sololectura(const cadena: WideString): Integer; safecall;
     {function sololectura(const cadena: WideString): Integer; safecall;}
     { Protected declarations }
   end;
 var
   Flista:TStringList;
   FAcceso:TStringList;

 implementation

 uses ComServ;

 function Tcontrolusu.busqueda(const cadena: WideString): Integer;
 begin
  //si es distinto de -1 significa que el valor esta
  //en la lista
  if flista.indexof(cadena) <> -1 then
     result:=1
  else
     result:=0;
 end;

 function Tcontrolusu.sololectura(const cadena: WideString): Integer;
 begin
    result:=0;
    if facceso.indexof(cadena) <> -1 then
            result:=1
 end;

 initialization
   Flista:=TStringlist.create;
   flista.sorted:=True;
   //si tecleamos en la aplicación cliente cualquiera
   //de estos nombres no veremos el campo continent ni
   //el gráfico.
   flista.add('Pepe');
   flista.add('Luis');
   flista.add('Ana');
   //la lista facceso contiene el nombre de ususarios que solamente tendrán acceso de lectura sobre la tabla.
   facceso:=TStringList.create;
   facceso.sorted:=true;
   facceso.add('Antonio');
   TAutoObjectFactory.Create(ComServer, Tcontrolusu, Class_controlusu,
   ciMultiInstance, tmApartment);
 finalization
   flista.free;
 end.


NOTA: El ejemplo se encuentra en el CD en:
            . \ejemplos\controlusu
 


(C) 1999 Database DM. la reproduccion total o parcial de este documento, asi como la divulgación de parte o la totalidad