unit umain; interface uses Windows, Messages, SysUtils, Classes, Graphics, {$IfNDef VER130} Variants, {$EndIf} Controls, Forms, Dialogs, Buttons, StdCtrls, ieview, imageenview, ExtCtrls, imageenio, iexBitmaps, hyieutils, hyiedefs, iesettings, iexLayers, iexRulers; type TForm1 = class(TForm) Panel1: TPanel; Label1: TLabel; ImageEnView1: TImageEnView; Label2: TLabel; EditIP: TEdit; EditAddress: TEdit; Label3: TLabel; Label4: TLabel; EditUser: TEdit; Label5: TLabel; EditPassword: TEdit; ButtonConnect: TSpeedButton; procedure ButtonConnectClick(Sender: TObject); private { Private declarations } fAborting: boolean; public { Public declarations } end; TIEJpegAcquireStream = class(TStream) private fData: TMemoryStream; fStart: boolean; public constructor Create; destructor Destroy; override; function Write(const Buffer; Count: Longint): Longint; override; function Read(var Buffer; Count: Longint): Longint; override; function Seek(Offset: Longint; Origin: Word): Longint; override; end; var Form1: TForm1; implementation {$R *.dfm} {$R WindowsTheme.res} constructor TIEJpegAcquireStream.Create; begin inherited; fData := TMemoryStream.Create; fStart := false; end; destructor TIEJpegAcquireStream.Destroy; begin fData.Free; inherited; end; function TIEJpegAcquireStream.Write(const Buffer; Count: Longint): Longint; var buf: pbytearray; i: integer; begin result := Count; buf := pbytearray(@Buffer); case fStart of false: // look for begin of jpeg (FFD8) for i := 0 to Count-2 do if (buf[i]=$FF) and (buf[i + 1]=$D8) then begin fData.Write( buf[i], Count-i); fStart := true; exit; end; true: begin // look for end of jpeg (FFD9) for i := 0 to Count-2 do if (buf[i]=$FF) and (buf[i + 1]=$D9) then begin fData.Write( buf[0], i); fStart := false; // acquire bitmap fData.Position := 0; Form1.ImageEnView1.IO.LoadFromStreamJpeg(fData); Application.ProcessMessages; fData.Clear; exit; end; // not found, write all fData.Write( buf[0], Count ); end; end; end; function TIEJpegAcquireStream.Seek(Offset: Longint; Origin: Word): Longint; begin result := fData.Seek(Offset, Origin); end; function TIEJpegAcquireStream.Read(var Buffer; Count: Longint): Longint; begin raise Exception.Create('TIEJpegAcquireStream cannot read.'); end; // connect switch procedure TForm1.ButtonConnectClick(Sender: TObject); var stream: TIEJpegAcquireStream; fileext: string; begin if ButtonConnect.Down then begin stream := TIEJpegAcquireStream.Create; fAborting := false; IEGetFromURL('http://' + EditUser.Text + ':' + EditPassword.Text + '@' + EditIP.Text + EditAddress.Text, stream, '', '', '', nil, nil, @fAborting, fileext); stream.Free; end else fAborting := true; end; end.