Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Construyendo Clase Evento on create (https://www.clubdelphi.com/foros/showthread.php?t=89992)

ASAPLTDA 15-03-2016 15:55:25

Construyendo Clase Evento on create
 
Buenos dias foristas
Estoy construyendo una clase en la cual debo:
1. crear tclientdataset, y los he colocado en en on create, pero este paso no se ejecuta, pienso que debo estar usando algo mal podrian darme un ayuda gracias

2. si debo crear los dataset usando self o null



Código Delphi [-]

{-----------------------------------------------------------------------------
INMOVTR-- CLASE MOVIMIMIENTOS DE INVENTARIOS
-----------------------------------------------------------------------------}
unit INMOVTR;

interface

uses
  Windows, Messages, SysUtils, Classes,  Controls , DB, Dialogs,
     Datasnap.DBClient ;


type
  TINMOVTR = class(TComponent)
  private
    t_ok          :Boolean ;
    t_Existe      :Boolean ;
    Flg_DatasetOK :Boolean;

    FDocnumero    :string;
    FDocFecha     :TDateTime ;
    FIncodtra      : string;
    FTipoMov      : string;
    FPgmcode       :string;
    FIdInsaldoFrm  :Integer ;


    // variable y objectos de trabajo
    inmov_frm      :TClientDataSet;
    InMov_to       :TClientDataSet;
    PEDMST         :TClientDataSet;

    procedure      CrearDataSets(var Flg_DatasetOK:Boolean);

    constructor create(Aowner:tcomponent);override;

  protected
  public
    FFechaInforma : tdatetime;
  published
    //  Entrada Desde
    property Docnumero      :string    read FDocNumero     write FDocnumero;
    property DocFecha       :TDateTime read fDocFecha      write fDocFecha;
    property IdInsaldoFrm   :Integer   read FIdInsaldoFrm  write FIdInsaldoFrm;
    //  Entrada Destino
    property Cono_to        :string    read FCono_to       write FCono_to ;
    property ClfCod_to      :string    read FClfCod_to    write  FClfCod_to       ;

     // Salida
    property FlgError       :Boolean   read FFlgError      write FFlgError   ;
    property MsgError       :string    read FMsgError      write FMsgError;                        // write FMsgError
    function execute_reubica:Boolean ;

  end;

procedure Register;

implementation

 uses F, tablas, TABLASINV;       // datamodulos


Constructor  TINMOVTR.Create(Aowner:Tcomponent);
Begin
 inherited create(Aowner);
  Flg_DatasetOK := false;
  DocFecha  :=  date ;
  intramst      := TClientDataSet.Create(nil);
  insaldo_frm   := TClientDataSet.Create(nil);
  insaldo_to    := TClientDataSet.Create(nil);
End;

procedure TINMOVTR.CrearDataSets(var Flg_DatasetOK:Boolean);
begin
  intramst      := TClientDataSet.Create(self);
  insaldo_frm   := TClientDataSet.Create(nil);
  insaldo_to    := TClientDataSet.Create(nil);
  inmov_frm     := TClientDataSet.Create(self);
  InMov_to      := TClientDataSet.Create(self);
  PEDMST        := TClientDataSet.Create(self);


  Flg_DatasetOK := True;
end;


procedure Register;
begin
//  RegisterComponents('SEI-FECHAS', [TINMOVTR]);
end;

procedure TINMOVTR.CrearDataSets(var Flg_DatasetOK:Boolean);
begin
  intramst      := TClientDataSet.Create(self);   <----------------------??? usar nil o self
  insaldo_frm   := TClientDataSet.Create(nil);
  insaldo_to    := TClientDataSet.Create(nil);
 
  Flg_DatasetOK := True;
end;
......

roman 15-03-2016 16:34:29

No veo razón para que no se ejecute. Lo que sí, es que estás declarando un método CrearDataSets que no usas y estás creando los datasets tanto en el constructor como en dicho método.

Puedes usar self para el constructor. Si usas nil está bien, pero entonces debes asegurarte de destrurlos en el destructor de la clase.

LineComment Saludos

egostar 15-03-2016 18:21:30

Y si colocáras el constructor en la sección public

Código Delphi [-]
Public

    constructor create(Aowner:tcomponent);override;

Saludos

roman 15-03-2016 18:25:07

Cita:

Empezado por egostar (Mensaje 503370)
Y si colocáras el constructor en la sección public

Ja, ja. Sí, eso también puede ayudar :D

LineComment Saludos

ASAPLTDA 15-03-2016 23:43:41

Y si colocáras el constructor en la sección public
 
Hola Egostar,

Efectivamente movi el constructor create(Aowner:tcomponent);override; desde el private a la seccion publica y funciono, ahora se crean los clientdataset

Hola Raman
Cambie la creacion de los tclientdataset a self para evitar evitar la destruccion manual

Gracias a Todos los del clubdelphi

AgustinOrtu 16-03-2016 00:00:53

Justo hace poco con el compañero Al Gonzalez discutiamos sobre las ambiguedades que se puedan presentar en el codigo fuente

En este caso la clase tiene una variable privada Flg_DatasetOK de tipo Boolean

Código Delphi [-]
  TINMOVTR = class(TComponent)
  private
   ...
    Flg_DatasetOK :Boolean;
   ...

Luego, esta el metodo CrearDataSets que recibe por referencia un parametro Boolean tambien llamado Flg_DatasetOK


Código Delphi [-]
procedure TINMOVTR.CrearDataSets(var Flg_DatasetOK:Boolean);
begin
  intramst      := TClientDataSet.Create(self);
  insaldo_frm   := TClientDataSet.Create(nil);
  insaldo_to    := TClientDataSet.Create(nil);
  inmov_frm     := TClientDataSet.Create(self);
  InMov_to      := TClientDataSet.Create(self);
  PEDMST        := TClientDataSet.Create(self);


  Flg_DatasetOK := True;
end;

La linea subrayada es una asignacion ambigua; en Delphi estos "conflictos" se resuelven segun el orden de las referencias; en este caso, la referencia mas "cercana" es el parametro Flg_DatasetOK que recibe el metodo CrearDataSets ; por lo tanto, la variable de instancia Flg_DatasetOK queda "oculta"; la unica manera posible de referenciarla es indicandolo explicitamente, usando Self

Código Delphi [-]
  Self.Flg_DatasetOK

En definitiva, Self.Flg_DatasetOK no es el parametro pasado por referencia Flg_DatasetOK

Simplemente es una observacion, aunque no trivial; basicamente tu variable de instancia Flg_DatasetOK nunca se actualiza, y estos detalles no los informa el compilador


La franja horaria es GMT +2. Ahora son las 07:40:09.

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