Advertisement
Guest User

Array Procedure Anonima

a guest
Oct 1st, 2018
121
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 10.90 KB | None | 0 0
  1. unit Atualizador.Ibptax;
  2.  
  3. interface
  4.  
  5.  uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes,
  6.       Forms,IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient,
  7.       IdExplicitTLSClientServerBase, IdFTP,IdGlobal,  IdException, IdFTPCommon,IdFTPList,
  8.       IdAntiFreezeBase, Vcl.IdAntiFreeze,Dialogs,System.Rtti;
  9.  type
  10.    TAtualizaIbttax = class;
  11.  
  12.    TProcMethodo = reference to procedure;
  13.    TOnStatus = procedure(const AStatusText: string) of object;
  14.    TOnConnected = procedure(Sender: TObject) of object;
  15.    TOnWorkFtp   = procedure(AWorkCount: Int64) of object;
  16.    TOnWorkBeginFtp = procedure(AWorkCountMax: Int64) of Object;
  17.    TOnWorkEndFtp   = procedure(AWorkMode: TWorkMode) of Object;
  18.    TMyProc2<T> = reference to procedure;
  19.  
  20.  
  21.    IAtualizaIbttax = interface
  22.  
  23.    ['{F7059E39-7253-432C-9CA1-4668100C9F9A}']
  24.     function Conecta(Proc: TProc; Proc2: TOnConnected ): IAtualizaIbttax;
  25.     function BaixarTabela(Proc: TProc): IAtualizaIbttax;
  26.     function getFTOnStatus: TOnStatus;
  27.     procedure setFTOnStatus(const Value: TOnStatus);
  28.     property OnStatus: TOnStatus read getFTOnStatus write setFTOnStatus;
  29.     function SetEvents(Proc: TOnStatus): IAtualizaIbttax;
  30.     function OnConnec(proc:TOnConnected ):IAtualizaIbttax; overload;
  31.     function OnConnec(proc:Tproc ):IAtualizaIbttax; overload;
  32.     function getFProcEventBegin: TOnWorkBeginFtp;
  33.     function getFprocEventWork: TOnWorkFtp;
  34.     function getFprocEventEnd: TOnWorkEndFtp;
  35.     procedure setFProcEventBegin(const Value: TOnWorkBeginFtp);
  36.     procedure setFprocEventEnd(const Value: TOnWorkEndFtp);
  37.     procedure setFprocEventWork(const Value: TOnWorkFtp);
  38.  
  39.     property OnWorkEvent:      TOnWorkFtp      read getFprocEventWork  write setFprocEventWork;
  40.     property OnWorkBeginEvent: TOnWorkBeginFtp read getFProcEventBegin write setFProcEventBegin;
  41.     property OnWorkEnd:        TOnWorkEndFtp   read getFprocEventEnd   write setFprocEventEnd;
  42.  
  43.     function This:TAtualizaIbttax; overload;
  44.     function This(Proc: array of TMyProc2<TProc>):TAtualizaIbttax; overload;
  45.  
  46.  end;
  47.  
  48.   TAtualizaIbttax = class(TComponent,IAtualizaIbttax)
  49.  
  50.   strict private
  51.  
  52.     FCliente: TIDFtp;
  53.     FProc: TProc;
  54.     FTOnStatus: TOnStatus;
  55.     FTOnConnected: TOnConnected;
  56.     FTMyProc2: TMyProc2<TProc>;
  57.     FStreamFile: TMemoryStream;
  58.     FAntifreeze: TIdAntiFreeze;
  59.     FProcEventBegin : TOnWorkBeginFtp;
  60.     FprocEventWork  : TOnWorkFtp;
  61.     FprocEventEnd   : TOnWorkEndFtp;
  62.     FTamanhoArquivo: Int64;
  63.     FNomeArquivo: UnicodeString;
  64.     FRefCount: Integer;
  65.  
  66.     function getFTOnStatus: TOnStatus;
  67.     procedure setFTOnStatus(const Value: TOnStatus);
  68.     procedure OnStatusLeopard(ASender: TObject; const AStatus: TIdStatus;
  69.                                const AStatusText: string);
  70.     procedure OnConnected(Sender: TObject);
  71.  
  72.     procedure WorkBeginEvent(ASender: TObject; AWorkMode: TWorkMode; AWorkCountMax: Int64);
  73.     procedure WorkEndEvent(ASender: TObject; AWorkMode: TWorkMode);
  74.     procedure WorkEvent(ASender: TObject; AWorkMode: TWorkMode; AWorkCount: Int64);
  75.   private
  76.     function getFProcEventBegin: TOnWorkBeginFtp;
  77.     function getFprocEventWork: TOnWorkFtp;
  78.     function getFprocEventEnd: TOnWorkEndFtp;
  79.     procedure setFProcEventBegin(const Value: TOnWorkBeginFtp);
  80.     procedure setFprocEventEnd(const Value: TOnWorkEndFtp);
  81.     procedure setFprocEventWork(const Value: TOnWorkFtp);
  82.     function StreamToString(const Stream: TStream; const Encoding: TEncoding): string;
  83.     function MemoryStreamToOleVariant(Strm: TMemoryStream):OleVariant;
  84.  
  85.     function GetData: String;
  86.   protected
  87.     function QueryInterface(const IID: TGUID; out Obj): HRESULT; override; stdcall;
  88.   public
  89.  
  90.     function OnConnec(proc:TOnConnected ):IAtualizaIbttax; overload;
  91.     function OnConnec(proc:Tproc ):IAtualizaIbttax; overload;
  92.     function _AddRef: Integer; stdcall;
  93.     function _Release: Integer; stdcall;
  94.  
  95.     property OnWorkEvent:      TOnWorkFtp      read getFprocEventWork  write setFprocEventWork;
  96.     property OnWorkBeginEvent: TOnWorkBeginFtp read getFProcEventBegin write setFProcEventBegin;
  97.     property OnWorkEnd:        TOnWorkEndFtp   read getFprocEventEnd   write setFprocEventEnd;
  98.  
  99.     property OnStatus: TOnStatus read getFTOnStatus write setFTOnStatus;
  100.     function Conecta(Proc: TProc; Proc2: TOnConnected ): IAtualizaIbttax;
  101.     function BaixarTabela(Proc: TProc): IAtualizaIbttax;
  102.     function SetEvents(Proc: TOnStatus): IAtualizaIbttax;
  103.     procedure AfterConstruction; override;
  104.     procedure BeforeDestruction; override;
  105.     class function new(Proc: TOnStatus; proc1: TOnWorkFtp; proc2: TOnWorkBeginFtp; proc3: TOnWorkEndFtp; out Instance:IAtualizaIbttax ): IAtualizaIbttax;
  106.     function This:TAtualizaIbttax; overload;
  107.     function This(Proc: array of TMyProc2<TProc>):TAtualizaIbttax; overload;
  108.  
  109.  end;
  110.  
  111. implementation
  112.  
  113. { TAtualizaIbttax }
  114.  
  115. procedure TAtualizaIbttax.AfterConstruction;
  116. begin
  117.   inherited AfterConstruction;
  118.  // Release the constructor's implicit refcount. Thread-safe increase is
  119. // achieved using Win API call to InterlockedDecrement in place of Dec
  120.   InterlockedDecrement(FRefCount);
  121.   FCliente:= TIdFTP.Create(nil);
  122.   FCliente.OnStatus    := OnStatusLeopard;
  123.   FCliente.OnConnected := OnConnected;
  124.   FCliente.OnWork      := WorkEvent;
  125.   FCliente.OnWorkBegin := WorkBeginEvent;
  126.   FCliente.OnWorkEnd   := WorkEndEvent;
  127.  
  128.   FAntifreeze:= TIdAntiFreeze.Create(nil);
  129. end;
  130.  
  131. function TAtualizaIbttax.BaixarTabela(Proc: TProc): IAtualizaIbttax;
  132.  var I: Integer;
  133. begin
  134.  Result := self;
  135.  Application.ProcessMessages;
  136.  FStreamFile:= TMemoryStream.Create;
  137.  FStreamFile.Position := 0;
  138.  FCliente.List(nil);
  139.  
  140.  for i := 0 to FCliente.DirectoryListing.Count -1 do
  141.    begin
  142.      if FCliente.DirectoryListing.Items[i].ItemType <> ditDirectory then
  143.      begin
  144.        FNomeArquivo   := FCliente.DirectoryListing.Items[i].FileName;
  145.        FTamanhoArquivo:= FCliente.DirectoryListing.Items[i].Size;
  146.       if pos('.csv',FNomeArquivo) <> 0 then
  147.       begin
  148.        FCliente.Get(FCliente.DirectoryListing.Items[i].FileName,
  149.                      FStreamFile, true);
  150.       end;
  151.      end;
  152.    end;
  153.     GetData;
  154.  if Assigned(Proc) then
  155.     Proc;
  156.  
  157. end;
  158.  
  159. procedure TAtualizaIbttax.BeforeDestruction;
  160. begin
  161.   inherited BeforeDestruction;
  162.  
  163.   if Assigned(FCliente) then
  164.   begin
  165.      FCliente.Free;
  166.      FCliente:= nil;
  167.   end;
  168.   if Assigned(FAntifreeze) then
  169.      FreeAndNil(FAntifreeze);
  170. end;
  171.  
  172. function TAtualizaIbttax.Conecta(Proc: TProc; Proc2: TOnConnected ): IAtualizaIbttax;
  173. begin
  174.  Result:= self;
  175.  FCliente.Username := 'Tabelaibpt';
  176.  FCliente.Password := 'a1b2c3d4e5';
  177.  FCliente.Host     := '187.22.9.135';
  178.  FCliente.Port     := 2121;
  179.  FCliente.TransferType := ftBinary;
  180.  FCliente.Passive  := True;
  181.  Application.ProcessMessages;
  182.  FCliente.Connect;
  183.  if FCliente.Connected then
  184.   if Assigned(Proc) then
  185.      Proc;
  186.  
  187. end;
  188.  
  189. function TAtualizaIbttax.GetData: String;
  190. begin
  191.   FStreamFile.SaveToFile(ExtractFilePath(Application.ExeName)+'TabelaIBPTaxSP.csv');
  192.   Result:= ExtractFilePath(Application.ExeName)+'TabelaIBPTaxSP.csv';
  193.   FreeAndNil(FStreamFile);
  194. end;
  195.  
  196. function TAtualizaIbttax.getFProcEventBegin: TOnWorkBeginFtp;
  197. begin
  198.   Result := FProcEventBegin;
  199. end;
  200.  
  201. function TAtualizaIbttax.getFprocEventEnd: TOnWorkEndFtp;
  202. begin
  203.   Result := FprocEventEnd;
  204. end;
  205.  
  206. function TAtualizaIbttax.getFprocEventWork: TOnWorkFtp;
  207. begin
  208.   Result := FprocEventWork;
  209. end;
  210.  
  211. function TAtualizaIbttax.getFTOnStatus: TOnStatus;
  212. begin
  213.   Result := FTOnStatus;
  214. end;
  215.  
  216. function TAtualizaIbttax.MemoryStreamToOleVariant(Strm: TMemoryStream): OleVariant;
  217. var
  218.    Data: PByteArray;
  219. begin
  220.   Result := VarArrayCreate ([0, Strm.Size - 1], varByte);
  221.   Data := VarArrayLock(Result);
  222.   try
  223.     Strm.Position := 0;
  224.     Strm.ReadBuffer(Data^, Strm.Size);
  225.   finally
  226.     VarArrayUnlock(Result);
  227.   end;
  228. end;
  229.  
  230. class function TAtualizaIbttax.new(Proc: TOnStatus; proc1: TOnWorkFtp; proc2: TOnWorkBeginFtp; proc3: TOnWorkEndFtp; out Instance:IAtualizaIbttax ): IAtualizaIbttax;
  231. begin
  232.  
  233.   result := TAtualizaIbttax.create(nil);
  234.   Instance:= Result;
  235.   result.OnStatus:= Proc;
  236.   Result.OnWorkBeginEvent :=  proc2;
  237.   Result.OnWorkEvent      :=  proc1;
  238.   result.OnWorkEnd        :=  proc3;
  239.  
  240. end;
  241.  
  242. function TAtualizaIbttax.OnConnec(proc: Tproc): IAtualizaIbttax;
  243. begin
  244.  Result:= Self;
  245.   if Assigned(Proc) then
  246.      Proc;
  247. end;
  248.  
  249. procedure TAtualizaIbttax.OnConnected(Sender: TObject);
  250. begin
  251.   if Assigned(FTOnConnected) then
  252.      FTOnConnected(sender);
  253. end;
  254.  
  255. function TAtualizaIbttax.OnConnec(proc: TOnConnected): IAtualizaIbttax;
  256. begin
  257.    Result:= Self;
  258.  FTOnConnected := proc;
  259. end;
  260.  
  261.  
  262. procedure TAtualizaIbttax.OnStatusLeopard(ASender: TObject; const AStatus: TIdStatus; const AStatusText: string);
  263. begin
  264.  if Assigned(FTOnStatus) then
  265.      FTOnStatus(AStatusText);
  266. end;
  267.  
  268.  
  269. function TAtualizaIbttax.QueryInterface(const IID: TGUID; out Obj): HRESULT;
  270. begin
  271.    if GetInterface(IID, Obj) then
  272.     Result := 0
  273.   else
  274.     Result := E_NOINTERFACE;
  275. end;
  276.  
  277. function TAtualizaIbttax.SetEvents(Proc: TOnStatus): IAtualizaIbttax;
  278. begin
  279.   Result:= self;
  280.   FTOnStatus:= Proc;
  281. end;
  282.  
  283. procedure TAtualizaIbttax.setFProcEventBegin(const Value: TOnWorkBeginFtp);
  284. begin
  285.   FProcEventBegin := Value;
  286. end;
  287.  
  288. procedure TAtualizaIbttax.setFprocEventEnd(const Value: TOnWorkEndFtp);
  289. begin
  290.   FprocEventEnd := Value;
  291. end;
  292.  
  293. procedure TAtualizaIbttax.setFprocEventWork(const Value: TOnWorkFtp);
  294. begin
  295.   FprocEventWork := Value;
  296. end;
  297.  
  298. procedure TAtualizaIbttax.setFTOnStatus(const Value: TOnStatus);
  299. begin
  300.  FTOnStatus:= Value;
  301. end;
  302.  
  303. function TAtualizaIbttax.StreamToString(const Stream: TStream; const Encoding: TEncoding): string;
  304. var
  305.   StringBytes: TBytes;
  306. begin
  307.   Stream.Position := 0;
  308.   SetLength(StringBytes, Stream.Size);
  309.   Stream.ReadBuffer(StringBytes, Stream.Size);
  310.   Result := Encoding.GetString(StringBytes);
  311.  
  312. end;
  313.  
  314. function TAtualizaIbttax.This(Proc: array of TMyProc2<TProc>): TAtualizaIbttax;
  315.  var i: integer;
  316. begin
  317.   Result:= Self;
  318.   for I := Low(Proc) to high(proc) do
  319.   begin
  320.    FTMyProc2 := proc[i];
  321.    FTMyProc2;
  322.   end;
  323. end;
  324.  
  325. procedure TAtualizaIbttax.WorkBeginEvent(ASender: TObject; AWorkMode: TWorkMode; AWorkCountMax: Int64);
  326. begin
  327.  if Assigned(FProcEventBegin) then
  328.      FProcEventBegin(FTamanhoArquivo);
  329. end;
  330.  
  331. procedure TAtualizaIbttax.WorkEndEvent(ASender: TObject; AWorkMode: TWorkMode);
  332. begin
  333.  if Assigned(FprocEventEnd) then
  334.      FprocEventEnd(AWorkMode);
  335. end;
  336.  
  337. procedure TAtualizaIbttax.WorkEvent(ASender: TObject; AWorkMode: TWorkMode; AWorkCount: Int64);
  338. begin
  339.    if Assigned(FprocEventWork) then
  340.       FprocEventWork(AWorkCount);
  341. end;
  342.  
  343. function TAtualizaIbttax._AddRef: Integer;
  344. begin
  345.   Result := InterlockedIncrement(FRefCount);
  346. end;
  347.  
  348. function TAtualizaIbttax._Release: Integer;
  349. begin
  350.   Result := InterlockedDecrement(FRefCount);
  351.   if Result = 0 then
  352.     Destroy;
  353. end;
  354.  
  355. function TAtualizaIbttax.This: TAtualizaIbttax;
  356. begin
  357.  result:= Self;
  358. end;
  359.  
  360.  
  361.  
  362. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement