Advertisement
Guest User

Array Procedure Anonima

a guest
Oct 1st, 2018
259
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 11.03 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;
  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.     function GetData: String;
  85.   protected
  86.     function QueryInterface(const IID: TGUID; out Obj): HRESULT; override; stdcall;
  87.   public
  88.  
  89.     function OnConnec(proc:TOnConnected ):IAtualizaIbttax; overload;
  90.     function OnConnec(proc:Tproc ):IAtualizaIbttax; overload;
  91.     function _AddRef: Integer; stdcall;
  92.     function _Release: Integer; stdcall;
  93.  
  94.     property OnWorkEvent:      TOnWorkFtp      read getFprocEventWork  write setFprocEventWork;
  95.     property OnWorkBeginEvent: TOnWorkBeginFtp read getFProcEventBegin write setFProcEventBegin;
  96.     property OnWorkEnd:        TOnWorkEndFtp   read getFprocEventEnd   write setFprocEventEnd;
  97.     property OnStatus: TOnStatus read getFTOnStatus write setFTOnStatus;
  98.     function Conecta(Proc: TProc; Proc2: TOnConnected ): IAtualizaIbttax;
  99.     function BaixarTabela(Proc: TProc): IAtualizaIbttax;
  100.     function SetEvents(Proc: TOnStatus): IAtualizaIbttax;
  101.     procedure AfterConstruction; override;
  102.     procedure BeforeDestruction; override;
  103.     class function new(Proc: TOnStatus; proc1: TOnWorkFtp; proc2: TOnWorkBeginFtp; proc3: TOnWorkEndFtp ):IAtualizaIbttax;
  104.  
  105.  
  106.     function This:TAtualizaIbttax; overload;
  107.     function This(Proc: array of TMyProc2<TProc>):TAtualizaIbttax; overload;
  108.  
  109.  end;
  110.  
  111.   var  _HRef:IAtualizaIbttax;
  112.  Type ThisAs = class function ThisAs: IAtualizaIbttax;
  113.  end;
  114.  
  115.  
  116.  
  117. implementation
  118.  
  119. { TAtualizaIbttax }
  120.  
  121. procedure TAtualizaIbttax.AfterConstruction;
  122. begin
  123.   inherited AfterConstruction;
  124.  // Release the constructor's implicit refcount. Thread-safe increase is
  125. // achieved using Win API call to InterlockedDecrement in place of Dec
  126.   InterlockedDecrement(FRefCount);
  127.   FCliente:= TIdFTP.Create(nil);
  128.   FCliente.OnStatus    := OnStatusLeopard;
  129.   FCliente.OnConnected := OnConnected;
  130.   FCliente.OnWork      := WorkEvent;
  131.   FCliente.OnWorkBegin := WorkBeginEvent;
  132.   FCliente.OnWorkEnd   := WorkEndEvent;
  133.  
  134.   FAntifreeze:= TIdAntiFreeze.Create(nil);
  135. end;
  136.  
  137. function TAtualizaIbttax.BaixarTabela(Proc: TProc): IAtualizaIbttax;
  138.  var I: Integer;
  139. begin
  140.  Result := self;
  141.  Application.ProcessMessages;
  142.  FStreamFile:= TMemoryStream.Create;
  143.  FStreamFile.Position := 0;
  144.  FCliente.List(nil);
  145.  
  146.  for i := 0 to FCliente.DirectoryListing.Count -1 do
  147.    begin
  148.      if FCliente.DirectoryListing.Items[i].ItemType <> ditDirectory then
  149.      begin
  150.        FNomeArquivo   := FCliente.DirectoryListing.Items[i].FileName;
  151.        FTamanhoArquivo:= FCliente.DirectoryListing.Items[i].Size;
  152.       if pos('.csv',FNomeArquivo) <> 0 then
  153.       begin
  154.        FCliente.Get(FCliente.DirectoryListing.Items[i].FileName,
  155.                      FStreamFile, true);
  156.       end;
  157.      end;
  158.    end;
  159.     GetData;
  160.  if Assigned(Proc) then
  161.     Proc;
  162.  
  163. end;
  164.  
  165. procedure TAtualizaIbttax.BeforeDestruction;
  166. begin
  167.   inherited BeforeDestruction;
  168.  
  169.   if Assigned(FCliente) then
  170.   begin
  171.      FCliente.Free;
  172.      FCliente:= nil;
  173.   end;
  174.   if Assigned(FAntifreeze) then
  175.      FreeAndNil(FAntifreeze);
  176. end;
  177.  
  178. function TAtualizaIbttax.Conecta(Proc: TProc; Proc2: TOnConnected ): IAtualizaIbttax;
  179. begin
  180.  Result:= self;
  181.  FCliente.Username := 'Tabelaibpt';
  182.  FCliente.Password := 'a1b2c3d4e5';
  183.  FCliente.Host     := '187.22.9.135';
  184.  FCliente.Port     := 2121;
  185.  FCliente.TransferType := ftBinary;
  186.  FCliente.Passive  := True;
  187.  Application.ProcessMessages;
  188.  FCliente.Connect;
  189.  if FCliente.Connected then
  190.   if Assigned(Proc) then
  191.      Proc;
  192.  
  193. end;
  194.  
  195. function TAtualizaIbttax.GetData: String;
  196. begin
  197.   FStreamFile.SaveToFile(ExtractFilePath(Application.ExeName)+'TabelaIBPTaxSP.csv');
  198.   Result:= ExtractFilePath(Application.ExeName)+'TabelaIBPTaxSP.csv';
  199.   FreeAndNil(FStreamFile);
  200. end;
  201.  
  202. function TAtualizaIbttax.getFProcEventBegin: TOnWorkBeginFtp;
  203. begin
  204.   Result := FProcEventBegin;
  205. end;
  206.  
  207. function TAtualizaIbttax.getFprocEventEnd: TOnWorkEndFtp;
  208. begin
  209.   Result := FprocEventEnd;
  210. end;
  211.  
  212. function TAtualizaIbttax.getFprocEventWork: TOnWorkFtp;
  213. begin
  214.   Result := FprocEventWork;
  215. end;
  216.  
  217. function TAtualizaIbttax.getFTOnStatus: TOnStatus;
  218. begin
  219.   Result := FTOnStatus;
  220. end;
  221.  
  222. function TAtualizaIbttax.MemoryStreamToOleVariant(Strm: TMemoryStream): OleVariant;
  223. var
  224.    Data: PByteArray;
  225. begin
  226.   Result := VarArrayCreate ([0, Strm.Size - 1], varByte);
  227.   Data := VarArrayLock(Result);
  228.   try
  229.     Strm.Position := 0;
  230.     Strm.ReadBuffer(Data^, Strm.Size);
  231.   finally
  232.     VarArrayUnlock(Result);
  233.   end;
  234. end;
  235.  
  236. class function TAtualizaIbttax.new(Proc: TOnStatus; proc1: TOnWorkFtp; proc2: TOnWorkBeginFtp; proc3: TOnWorkEndFtp): IAtualizaIbttax;
  237. begin
  238.  
  239.   result := TAtualizaIbttax.create(nil);
  240.   _HRef:= Result;
  241.   result.OnStatus:= Proc;
  242.   Result.OnWorkBeginEvent :=  proc2;
  243.   Result.OnWorkEvent      :=  proc1;
  244.   result.OnWorkEnd        :=  proc3;
  245.  
  246. end;
  247.  
  248. function TAtualizaIbttax.OnConnec(proc: Tproc): IAtualizaIbttax;
  249. begin
  250.  Result:= Self;
  251.   if Assigned(Proc) then
  252.      Proc;
  253. end;
  254.  
  255. procedure TAtualizaIbttax.OnConnected(Sender: TObject);
  256. begin
  257.   if Assigned(FTOnConnected) then
  258.      FTOnConnected(sender);
  259. end;
  260.  
  261. function TAtualizaIbttax.OnConnec(proc: TOnConnected): IAtualizaIbttax;
  262. begin
  263.    Result:= Self;
  264.  FTOnConnected := proc;
  265. end;
  266.  
  267.  
  268. procedure TAtualizaIbttax.OnStatusLeopard(ASender: TObject; const AStatus: TIdStatus; const AStatusText: string);
  269. begin
  270.  if Assigned(FTOnStatus) then
  271.      FTOnStatus(AStatusText);
  272. end;
  273.  
  274.  
  275. function TAtualizaIbttax.QueryInterface(const IID: TGUID; out Obj): HRESULT;
  276. begin
  277.    if GetInterface(IID, Obj) then
  278.     Result := 0
  279.   else
  280.     Result := E_NOINTERFACE;
  281. end;
  282.  
  283. function TAtualizaIbttax.SetEvents(Proc: TOnStatus): IAtualizaIbttax;
  284. begin
  285.   Result:= self;
  286.   FTOnStatus:= Proc;
  287. end;
  288.  
  289. procedure TAtualizaIbttax.setFProcEventBegin(const Value: TOnWorkBeginFtp);
  290. begin
  291.   FProcEventBegin := Value;
  292. end;
  293.  
  294. procedure TAtualizaIbttax.setFprocEventEnd(const Value: TOnWorkEndFtp);
  295. begin
  296.   FprocEventEnd := Value;
  297. end;
  298.  
  299. procedure TAtualizaIbttax.setFprocEventWork(const Value: TOnWorkFtp);
  300. begin
  301.   FprocEventWork := Value;
  302. end;
  303.  
  304. procedure TAtualizaIbttax.setFTOnStatus(const Value: TOnStatus);
  305. begin
  306.  FTOnStatus:= Value;
  307. end;
  308.  
  309. function TAtualizaIbttax.StreamToString(const Stream: TStream; const Encoding: TEncoding): string;
  310. var
  311.   StringBytes: TBytes;
  312. begin
  313.   Stream.Position := 0;
  314.   SetLength(StringBytes, Stream.Size);
  315.   Stream.ReadBuffer(StringBytes, Stream.Size);
  316.   Result := Encoding.GetString(StringBytes);
  317.  
  318. end;
  319.  
  320. function TAtualizaIbttax.This(Proc: array of TMyProc2<TProc>): TAtualizaIbttax;
  321.  var i: integer;
  322. begin
  323.   Result:= Self;
  324.   for I := Low(Proc) to high(proc) do
  325.   begin
  326.    FTMyProc2 := proc[i];
  327.    FTMyProc2;
  328.   end;
  329. end;
  330.  
  331. procedure TAtualizaIbttax.WorkBeginEvent(ASender: TObject; AWorkMode: TWorkMode; AWorkCountMax: Int64);
  332. begin
  333.  if Assigned(FProcEventBegin) then
  334.      FProcEventBegin(FTamanhoArquivo);
  335. end;
  336.  
  337. procedure TAtualizaIbttax.WorkEndEvent(ASender: TObject; AWorkMode: TWorkMode);
  338. begin
  339.  if Assigned(FprocEventEnd) then
  340.      FprocEventEnd(AWorkMode);
  341. end;
  342.  
  343. procedure TAtualizaIbttax.WorkEvent(ASender: TObject; AWorkMode: TWorkMode; AWorkCount: Int64);
  344. begin
  345.    if Assigned(FprocEventWork) then
  346.       FprocEventWork(AWorkCount);
  347. end;
  348.  
  349. function TAtualizaIbttax._AddRef: Integer;
  350. begin
  351.   Result := InterlockedIncrement(FRefCount);
  352. end;
  353.  
  354. function TAtualizaIbttax._Release: Integer;
  355. begin
  356.   Result := InterlockedDecrement(FRefCount);
  357.   if Result = 0 then
  358.     Destroy;
  359. end;
  360.  
  361. function TAtualizaIbttax.This: TAtualizaIbttax;
  362. begin
  363.  result:= Self;
  364. end;
  365.  
  366. { ThisAs }
  367.  
  368. function ThisAs.ThisAs: IAtualizaIbttax;
  369.  var Obj: IAtualizaIbttax;
  370. begin
  371.   result:=  _HRef;
  372. end;
  373.  
  374. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement