电子白板简单实现delphi
电子白板简单实现
将画图存储成一个一个的点,点表示成记录,用文件流的方法存储到文本里,将文本读进文件流,用socket发送,socket接收后再存储成文本,然后再将文本用文件流读出,画到image上
1、在image上画线
image1.Canvas.Pen.Color:=clblue;
在image的mousedown事件中写
image1.Canvas.MoveTo(X,y);
在image的mousemove事件中写
image1.Canvas.lineTo(X,y);
2、在image上实现橡皮功能
with image1.Canvas do
begin
Pen.Mode := pmCopy;
Brush.Style:= bsClear;
Brush.Color:=clWhite;
FillRect(rect((x-4),(y-4),(x+4),(y+4)));//橡皮
end;
3、如果想实现电子白板的简单传送,我用的办法是将画的点按记录的形式
存入文本,记录为
type
TRec = record {定义一个记录}
sign:word;//标记,mousedown画=1,mousemove画=2,mousedown擦=3,mousemove擦=4,
x: word; //x轴标点
y: word; //y轴标点
end;
定义记录:
var rec: TRec;
记录调用:
rec.sign:=1;
rec.x:=x;
rec.y:=y;
msw.Write(rec, SizeOf(rec));//msw,msr:tmemorystream; //内存流用于读、写画板
msw.SaveToFile('c:/temp/path.txt');//文件流存储文件
4、存储成文本后用tclientsocket/tserversocket以文件流的形式传送
(1)、发送的时候先发送文件大小
Msw:=tmemorystream.Create;//文件流
MyStreamw:=tmemorystream.Create;//文件流
MyStreamw.LoadFromFile('c:/temp/path.txt');//文件流调用文件
MyStreamw.Position := 0;{注意:必须添加此句}
s1 :='size'+inttostr(MyStreamw.size);{流的大小}
if ServerSocket1.Active then
begin
if listbox1.Count<=0 then
//.ItemIndex=-1 then
begin
showmessage('没有发送方');
exit;
end;
for i:=0 to ServerSocket1.Socket.activeconnections-1 do
begin
// if ServerSocket1.Socket.Connections[i].RemoteAddress=trim(listbox1.Items[listbox1.itemindex]) then
ServerSocket1.Socket.Connections[i].SendText(s1);//发送文件流大小
end;
end;
(2)、然后接收方获取文件大小并向发送方发送ready,准备好接收,发送方接到ready,
然后发送文件流给接收方
MyStreamw.Position := 0;
if ServerSocket1.Socket.Connections[i].SendStream(MyStreamw)=false then
ServerSocket1.Socket.Connections[i].SendStream(MyStreamw); {将流发送出去}
(3)、接收方接收到数据后根据数据流的大小接收,然后存储到另一个路径的文本里,
ServerSocket每次只能接收8k的数据,如果大于8k,ServerSocket会多次触发read事件,每次接收的
最多只有8k的数据,如果数据小于8k,则直接接收并存储到文本
MyReceviceLength := socket.ReceiveLength; {读出包长度}
remainsize:=MySize-MyReceviceLength;
StatusBar1.SimpleText := '正在接收数据,数据大小为:' + inttostr(MySize);
Socket.ReceiveBuf(MyBuffer, MyReceviceLength); {接收数据包并读入缓冲区内}//MyBuffer:array[0..100000] of byte;
MyStreamr.Write(MyBuffer, MyReceviceLength); {将数据写入流中}
if MyStreamr.Size >= MySize then {如果流长度大于需接收的字节数,则接收完毕}
begin
ServerSocket1.Socket.Connections[0].SendText('ok');
MyStreamr.Position := 0;
try
MyStreamr.SaveToFile('d:/path.txt');
finally {以下为清除工作 }
MySize := 0;
//button4.Click;
paintline.create(image1);//调用线程画图,线程为取D盘文本,然后画出来
end;
end;
如果大于8k,则接收之前,先用文件流取得D盘文件的数据,然后移动到文件流的末尾,再继续接收数据
MyStreamr.LoadFromFile('d:/path.txt');
MyStreamr.Seek(0,sofromend);
StatusBar1.SimpleText := '正在接收数据,数据大小为:' + inttostr(MySize);
Socket.ReceiveBuf(MyBuffer, MySize); {接收数据包并读入缓冲区内}
MyStreamr.Write(MyBuffer, MySize); {将数据写入流中}
剩余大小为每次减去这次发送的大小。
接收完毕后向发送方发送‘ok’
电子白板简单实现delphi相关推荐
- [轉]c#简单调用DELPHI DLL封装窗体
http://www.cnblogs.com/el-net/archive/2008/10/13/1309940.html dllimport Delphi dll dllimport dll Del ...
- 一个简单的DELPHI自定义事件的例子(转)
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms ...
- 最简单的delphi启动画面(转)
首先做一窗体,然后将BorderStyle的属性设为bsnone,放image控件,align设为alclient 然后将主程序的修改为 uses Windows, Forms, Unit1 in ' ...
- winpython使用教程-使用Python开发windows桌面程序【超简单】
一.开发前期准备 1. boa-constructor-0.6.1.bin.setup.exe #一个wxWidges的集成开发环境,简单如Delphi,可以直接拖拽控件,并且和其他集成环境不一样, ...
- delphi打包python_使用Delphi 编写Python Extension
使用Delphi 编写Python Extension 作者:1000copy 摘要: 在互联网公共可访问领域内,关于Python/C interface的介绍,手册都是比较多的.Py直接支持C编写扩 ...
- C# 调用 Delphi Dll链接库方法及示例
每种编程语言调用DLL的方法都不尽相同,在此只对用C#调用Delphi DLL的方法进行介绍 首先要搞清楚一点的是:什么是托管,什么是非托管? 一般可以认为:非托管代码主要是基于win 32平台开发的 ...
- DELPHI线程创建与使用
这个要看你这个函数是干什么的,如果不涉及界面VCL或数据操作等需要同步的事情,那么多个线程调用同一函数跟平常调用一个函数一样,没什么特别的地方,反之,则需要注意每个线程之间的同步问题 追问 我想调用这 ...
- Delphi菜单栏背景色-转载收藏学习
用Delphi制作个性化的菜单 www.netgocn.com原创 在应用程序编写中,使用个性化的菜单可以美化界面,展示个性风彩.例如3721网站推出的<3721网络特快>应用程序中的菜单 ...
- Delphi 7完美经典_PDF 电子书
中文名:Delphi 7完美经典 原名:PDF 地区:大陆 下载地址:http://pan.baidu.com/share/link?shareid=125019&uk=721744522 出 ...
最新文章
- pidstat 命令详解(转载)
- void main()是错的!
- 内部排序——直接插入排序
- java基础系列:集合基础(1)
- Linux就业技术指导(一):简历撰写及面试筹备要领
- Android-标题状态栏的隐藏
- Theano at a Glance
- Qt学习之路(60): 创建shared library
- Mongodb命令操作增删改查
- SqlAlchemy操作(一)
- html5音乐播放器在线生成,一款极简的HTML5音乐播放器-skPlayer
- 系统管理指南:基本管理 第11 章• x86: 基于GRUB 的引导(任务)
- android手机如何查看系统版本号,怎么查看安卓系统版本
- 本地连接受限或无连接的解决方法
- 热模块替换/热更新 HMR
- 阿里云云平台,物联网可视化web界面简单教程
- CWnd与HWND的区别与联系(相互转换)完全解析
- 一个优秀的UI界面应该是什么样的
- vector 通俗易懂描述
- 函数栈帧(详细图解)
热门文章
- 2018 CCCC天梯赛 L2 04 秀恩爱分得快
- 自编R计算MSE(均方误差)
- Android NDK 开发环境搭建(二)----来源http://www.cnblogs.com/zdz8207/archive/2012/11/27/android-ndk-install.htm
- jupyter安装扩展插件
- 服务器上配置iis的步骤和注意事项
- SpringKafka文档 KafkaTemplate
- JAVA SE 基础复习-IO与序列化(4)
- matlab 去除协变量,求助协变量调整
- Android引用RN第三方控件,Android和RN互调方式,最近开发心得
- spatial transformer