Indy 컴포넌트들이 사용하기 대단히 편리하게 잘 만들어져 있지만, 패킷 단위로 처리하고 싶은 요구사항 때문에 소켓으로 직접 작업하고는 했었습니다. 그러다가 오늘 문득 "TStream 클래스를 상속받아서 처리하면 간단하겠구나"하는 뒤 늦은 깨달음이 ㅠ.ㅠ
"없으면 만들어서 한다"가 기본 자세이다 보니, 쓸 때 없는 곳에 힘을 빼고 말았네요 ㅡ.ㅡ;
코드가 간단해서 설명은 생략합니다 ^^; (메모장에는 다운로드가 끝난 다음에 한 거번에 표시됩니다)
unit _fmMain; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdHTTP, Vcl.StdCtrls; type TfmMain = class(TForm) IdHTTP1: TIdHTTP; moMsg: TMemo; procedure IdHTTP1Work(ASender: TObject; AWorkMode: TWorkMode; AWorkCount: Int64); procedure FormCreate(Sender: TObject); procedure IdHTTP1WorkBegin(ASender: TObject; AWorkMode: TWorkMode; AWorkCountMax: Int64); procedure IdHTTP1WorkEnd(ASender: TObject; AWorkMode: TWorkMode); private public end; var fmMain: TfmMain; implementation type THTTPSream = class (TStream) private FSize : int64; FPosition : int64; protected function GetSize: Int64; override; public constructor Create; function Read(var Buffer; Count: Longint): Longint; override; function Write(const Buffer; Count: Longint): Longint; override; function Seek(Offset: Longint; Origin: Word): Longint; overload; override; function Seek(const Offset: Int64; Origin: TSeekOrigin): Int64; overload; override; end; {$R *.dfm} procedure TfmMain.FormCreate(Sender: TObject); var HTTPSream : THTTPSream; begin HTTPSream := THTTPSream.Create; try IdHTTP1.Get('http://다운받은 데이터가 있는 주소', HTTPSream); finally HTTPSream.Free; end; end; procedure TfmMain.IdHTTP1Work(ASender: TObject; AWorkMode: TWorkMode; AWorkCount: Int64); begin // end; procedure TfmMain.IdHTTP1WorkBegin(ASender: TObject; AWorkMode: TWorkMode; AWorkCountMax: Int64); begin fmMain.moMsg.Lines.Add(Format('AWorkCountMax: %d', [AWorkCountMax])); end; procedure TfmMain.IdHTTP1WorkEnd(ASender: TObject; AWorkMode: TWorkMode); begin // end; { THTTPSream } constructor THTTPSream.Create; begin inherited; FSize := 0; FPosition := 0; end; function THTTPSream.GetSize: Int64; begin Result := FSize; end; function THTTPSream.Read(var Buffer; Count: Integer): Longint; begin Result := 0; end; function THTTPSream.Seek(Offset: Integer; Origin: Word): Longint; begin Result := FPosition; end; function THTTPSream.Seek(const Offset: Int64; Origin: TSeekOrigin): Int64; begin Result := FPosition; end; function THTTPSream.Write(const Buffer; Count: Integer): Longint; begin FSize := FSize + Count; fmMain.moMsg.Lines.Add(Format('Position: %d, Size: %d, Count: %d', [Position, Size, Count])); end; end.
Real Grid Plus - 리얼 그리드가 새제품으로 출시된다고 합니다. (0) | 2012.09.07 |
---|---|
오브젝트 파스칼 책을 찾는 분들에게 (2) | 2012.09.05 |
방화벽 (Firewall)에 프로그램 예외 등록 하기 (0) | 2012.08.13 |
SetFileSecurity를 이용해서 모든 사용자에게 권한 주기 (0) | 2012.08.13 |
VolumeControl for all MS-Windows versions. (0) | 2012.07.31 |