谈Delphi编程中“流”的应用
作者: Webmaster 来源: Linuxdby.com 点击:
日期: 2007-06-05
[收藏 ] [投稿 ]
IE是否经常中毒?推荐您
128~191.XXX.XXX.XXX(B类网):广播地址为XXX.XXX.255.255 192~254.XXX.XXX.XXX(C类网):广播地址为XXX.XXX.XXX.255 比如说三台计算机192.168.0.1、192.168.0.10、192.168.0.18,发送信息时只要指定IP地址为192.168.0.255就可以实现广播了。下面给出一个转换IP为广播IP的函数,快拿去完善自己的OICQ吧^-^. Function Trun_ip(S:string):string; var s1,s2,s3,ss,sss,Head:string; n,m:integer; begin sss:=S; n:=pos('.',s); s1:=copy(s,1,n); m:=length(s1); delete(s,1,m); Head:=copy(s1,1,(length(s1)-1)); n:=pos('.',s); s2:=copy(s,1,n); m:=length(s2); delete(s,1,m); n:=pos('.',s); s3:=copy(s,1,n); m:=length(s3); delete(s,1,m); ss:=sss; if strtoint(Head) in [1..126] then ss:=s1+'255.255.255'; //1~126.255.255.255 (A类网) if strtoint(Head) in [128..191] then ss:=s1+s2+'255.255';//128~191.XXX.255.255(B类网) if strtoint(Head) in [192..254] then ss:=s1+s2+s3+'255'; //192~254.XXX.XXX.255(C类网) Result:=ss; end; ----------------------------------------------------------------------- 五、实际应用之四:利用流实现网络传输屏幕图像 大家应该见过很多网管程序,这类程序其中有一个功能就是监控远程电脑的屏幕。实际上,这也是利用流操作来实现的。下面我们给出一个例子,这个例子分两个程序,一个服务端,一个是客户端。程序编译后可以直接在单机、局部网或者互联网上使用。程序中已经给出相应注释。后面我们再来作具体分析。 新建一个工程,在Internet面版上拖一个ServerSocket控件到窗口,该控件主要用于监听客户端,用来与客户端建立连接和通讯。设置好监听端口后调用方法Open或者Active:=True即开始工作。注意:跟前面的NMUDP不同,当Socket开始监听后就不能再改变它的端口,要改变的话必须先调用Close或设置Active为False,否则将会产生异常。另外,如果该端口已经打开的话,就不能再用这个端口了。所以程序运行尚未退出就不能再运行这个程序,否则也会产生异常,即弹出出错窗口。实际应用中可以通过判断程序是否已经运行,如果已经运行就退出的方法来避免出错。 当客户端有数据传入,将触发ServerSocket1ClientRead事件,我们可以在这里对接收的数据进行处理。在本程序中,主要是接收客户端发送过来的字符信息并根据事先的约定来进行相应操作。 程序全部代码如下: unit Unit1;{服务端程序} interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, JPEG,ExtCtrls, ScktComp; type TForm1 = class(TForm) ServerSocket1: TServerSocket; procedure ServerSocket1ClientRead(Sender: TObject;Socket: TCustomWinSocket); procedure FormCreate(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); private procedure Cjt_GetScreen(var Mybmp: TBitmap; DrawCur: Boolean); {自定义抓屏函数,DrawCur表示抓鼠标图像与否} { Private declarations } public { Public declarations } end; var Form1: TForm1; MyStream: TMemorystream;{内存流对象} implementation {$R *.DFM} procedure TForm1.Cjt_GetScreen(var Mybmp: TBitmap; DrawCur: Boolean); var Cursorx, Cursory: integer; dc: hdc; Mycan: Tcanvas; R: TRect; DrawPos: TPoint; MyCursor: TIcon; hld: hwnd; Threadld: dword; mp: tpoint; pIconInfo: TIconInfo; begin Mybmp := Tbitmap.Create; {建立BMPMAP } Mycan := TCanvas.Create; {屏幕截取} dc := GetWindowDC(0); try Mycan.Handle := dc; R := Rect(0, 0, screen.Width, screen.Height); Mybmp.Width := R.Right; Mybmp.Height := R.Bottom; Mybmp.Canvas.CopyRect(R, Mycan, R); finally releaseDC(0, DC); end; Mycan.Handle := 0; Mycan.Free; if DrawCur then {画上鼠标图象} begin GetCursorPos(DrawPos); MyCursor := TIcon.Create; getcursorpos(mp); hld := WindowFromPoint(mp); Threadld := GetWindowThreadProcessId(hld, nil); AttachThreadInput(GetCurrentThreadId, Threadld, True); MyCursor.Handle := Getcursor(); AttachThreadInput(GetCurrentThreadId, threadld, False); GetIconInfo(Mycursor.Handle, pIconInfo); cursorx := DrawPos.x - round(pIconInfo.xHotspot); cursory := DrawPos.y - round(pIconInfo.yHotspot); Mybmp.Canvas.Draw(cursorx, cursory, MyCursor); {画上鼠标} DeleteObject(pIconInfo.hbmColor);{GetIconInfo 使用时创建了两个bitmap对象. 需要手工释放这两个对象} DeleteObject(pIconInfo.hbmMask);{否则,调用他后,他会创建一个bitmap,多次调用会产生多个,直至资源耗尽} Mycursor.ReleaseHandle; {释放数组内存} MyCursor.Free; {释放鼠标指针} end; end; procedure TForm1.FormCreate(Sender: TObject); begin ServerSocket1.Port := 3000; {端口} ServerSocket1.Open; {Socket开始侦听} end; procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin if ServerSocket1.Active then ServerSocket1.Close; {关闭Socket} end; procedure TForm1.ServerSocket1ClientRead(Sender: TObject; Socket: TCustomWinSocket); var S, S1: string; MyBmp: TBitmap; Myjpg: TJpegimage; begin S := Socket.ReceiveText; if S = 'cap' then {客户端发出抓屏幕指令} begin try MyStream := TMemorystream.Create;{建立内存流} MyBmp := TBitmap.Create; Myjpg := TJpegimage.Create; Cjt_GetScreen(MyBmp, True); {True表示抓鼠标图像} Myjpg.Assign(MyBmp); {将BMP图象转成JPG格式,便于在互联网上传输} Myjpg.CompressionQuality := 10; {JPG文件压缩百分比设置,数字越大图像越清晰,但数据也越大}
如果您对本文有任何疑问或者建议,请到讨论区发表您的意见:
>>
论坛入口 <<
上一页 1 2 3 4 5 6 7 下一页
上一篇:如何把数据库的内容写入到Word文档中? 下一篇:如何用Delphi制作录音程序
【文章评论 】
【收藏本文 】
【推荐好友 】
【打印本文 】
【我要投稿 】 【论坛讨论 】
相关文章:
·如何用Delphi制作录音程序 ·谈Delphi编程中“流”的应用 ·如何把数据库的内容写入到Word文档中? ·从实作标题栏按钮开始浅谈组件的制作 ·“98五笔字型输入法”大批量造词 ·关于Delphi大Bug的更详细的例子 ·不知您是笨蛋,还是我是笨蛋,关于Delphi ·剖析TThread类 ·理解类引用这种类型 ·改良控件-Delphi自带控件Bug的消除
文章评论: (1条)
声明:刊登此文章是为了传递更多信息,文章内容仅供参考,转载请注明出处。