delphi xe7 TCPclient/server的應用問題 |
尚未結案
|
jobeos89563
一般會員 發表:1 回覆:0 積分:0 註冊:2015-07-28 發送簡訊給我 |
我這一個程式
client跟server都寫在一起 有兩個image元件 左邊圖是client,右邊是server 按下button後server就會顯示出client的圖 現在要把client跟server寫獨立出來 應該怎麼修改 unit ImageServer; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, IdContext, Vcl.ExtCtrls, IdTCPConnection, IdTCPClient, IdBaseComponent, IdComponent, IdCustomTCPServer, IdTCPServer, Vcl.StdCtrls, Vcl.Imaging.jpeg; type TForm1 = class(TForm) IdTCPServer1: TIdTCPServer; IdTCPClient1: TIdTCPClient; Button1: TButton; Source: TImage; Dest: TImage; procedure FormCreate(Sender: TObject); procedure IdTCPServer1Execute(AContext: TIdContext); procedure Button1Click(Sender: TObject); procedure IdTCPServer1AfterBind(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation uses PNGImage; {$R *.dfm} //Enable transfer of different graphicformats procedure Picture2Stream(DestStream: TMemoryStream; Picture: TPicture); var ms2: TMemoryStream; TheClassName: AnsiString; len: Byte; begin TheClassName := Picture.Graphic.ClassName; len := Length(TheClassName); DestStream.WriteBuffer(len, 1); if len > 0 then // save GraphicClass name DestStream.WriteBuffer(TheClassName[1], len); ms2 := TMemoryStream.Create; try // save graphic Picture.Graphic.SaveToStream(ms2); ms2.Position := 0; if ms2.Size > 0 then DestStream.CopyFrom(ms2, ms2.Size); finally ms2.Free; end; end; Procedure LoadPictureFromStream(Picture: TPicture; SourceStream: TMemoryStream); var ms2: TMemoryStream; len: Byte; TheClassName: AnsiString; Graphic: TGraphic; GraphicClass: TGraphicClass; begin SourceStream.Position := 0; SourceStream.ReadBuffer(len, 1); SetLength(TheClassName, len); if len > 0 then // read GraphicClass name SourceStream.ReadBuffer(TheClassName[1], len); GraphicClass := TGraphicClass(FindClass(TheClassName)); //(*) if (GraphicClass <> nil) and (len > 0) then begin Graphic := GraphicClass.Create; // create appropriate graphic class try ms2 := TMemoryStream.Create; try ms2.CopyFrom(SourceStream, SourceStream.Size - len - 1); ms2.Position := 0; Graphic.LoadFromStream(ms2); finally ms2.Free; end; Picture.Assign(Graphic); finally Graphic.Free; end; end; end; procedure TForm1.Button1Click(Sender: TObject); var ms: TMemoryStream; begin ms := TMemoryStream.Create; try Picture2Stream(ms, Source.Picture); ms.Position := 0; IdTCPClient1.Host := '127.0.0.1'; IdTCPClient1.Port := 12345; IdTCPClient1.Connect; IdTCPClient1.IOHandler.LargeStream := true; IdTCPClient1.IOHandler.Write(ms, ms.Size, true); finally ms.Free; end; end; procedure TForm1.FormCreate(Sender: TObject); begin IdTCPServer1.DefaultPort := 12345; IdTCPServer1.Active := true; ReportMemoryLeaksOnShutDown := true; end; procedure TForm1.IdTCPServer1AfterBind(Sender: TObject); begin end; procedure TForm1.IdTCPServer1Execute(AContext: TIdContext); var ms: TMemoryStream; begin ms := TMemoryStream.Create; try AContext.Connection.IOHandler.LargeStream := true; AContext.Connection.IOHandler.ReadStream(ms); TThread.Synchronize(nil, Procedure begin LoadPictureFromStream(Dest.Picture, ms); end); finally ms.Free; end; end; initialization // RegisterClasses to enable FindClass (*) RegisterClasses([TIcon, TMetafile, TBitmap, TJPEGImage, TPngImage]); end. |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |