📄 9931.txt
字号:
Do While Sum < LF&
If LF& - Loc(hSend) < BSIZE Then
BSIZE = LF& - Loc(hSend)
ReDim SENDARR(1 To BSIZE)
End If
Get hSend, , SENDARR '从文件取字节放入字节数组
SENDVAR = SENDARR '转放到 Variant型变量
'当CTS线及CD线为高电平时才可发送,否则需等待。
T = Timer + 60
L:
If MSComm1.CTSHolding And MSComm1.CDHolding Then
MSComm1.Output = SENDVAR '发送
Sum = Sum + BSIZE '累加计数
Label6.Caption = Str(Sum) '显示在发送窗口上
Else
If Timer < T Then
GoTo L '循环等待
Else
GoTo CLOSEFILE '等待时间超过 60秒则退出
End If
End If
'等待系统处理完
Do
RET = DoEvents()
Loop Until MSComm1.OutBufferCount = 0
Loop '循环语句结尾
----文件发送完毕以后,关闭该文件。并关闭发送文件信息窗口。
八 接收MODEM回送的信息及接收文件
---- (一)设计要点:我们是如下进行设计的。
1.在主窗口上设一个多行显示的文本框,用来显示接收到的所有文本类
型信息。
2.建立<收件箱>。实际上是一个数据库中的一个表.包含收件日期,文
件名,文件长度,序号等字段。
3.利用事件触发机制来执行接收数据的过程。即编写mscomm1控件的
OnCOMM事件的处理程序。
4.按以下方法来改变输入模式属性(InputMode)的值:通常使InputMode
属性为文本模式。当发现接收到的字符串中有"FILESTAR" + Chr(5) + Chr(13)
+Chr(10),按本软件规定表示传送的文件内容将开始,则将InputMode属性改为
二进制模式。当文件内容接收完(由接收的字节数判断)再将InputMode属性
改为文本模式。
5.利用本软件设计的标志字符串(见七)来控制进程,在发送及接收程序
中均使用。
---- (二) MSCOMM1控件的OnCOMM事件的的处理程序
Private Static Sub MSComm1_OnComm()
Select Case MSComm1.CommEvent
Case comEvReceive
'接收缓冲区收到Rthreshold个字符时触发
Dim VARC As Variant
Dim N As Long
Dim SJARR() As Byte
'
N = MSComm1.InBufferCount '接收缓冲区字符总数
If MSComm1.InputMode = 0 Then
'当输入模式为文本模式时,将收到的数据放到字符串变量。
MSComm1.InputLen = 0
VARC = Space(N)
VARC = MSComm1.Input
Else
'当输入模式为二进制模式时,将收到的数据放到字节数组。
ReDim SJARR(1 To N)
VARC = ARR
MSComm1.InputLen = N
VARC = MSComm1.Input
End If
ShowDATA TextTerm, N, VARC
'调接收数据处理过程Showdata
End Select
End Sub
(三)接收数据处理过程 ShowData
N AsPublic Static Sub ShowData(Term As Control, _Long, DATA As Variant)
'参数:Term (主窗体上的文本框,用于显示接受数据)
' N 为本次接收到的字节数
' DATA (接收到的数据.Variant型 )
(变量定义部分:略)
'(一)非文件传输情形(接收的是字符串)
If not mscomm1.InputMode= 0 Then
GoTo L2
End If
'(1)把新接收的字符数据放到文本框TERM末尾
Term.SelStart = Len(Term.Text)
Term.SelLength = 0
Term.SelText = DATA
'(2)未找到文件传输开始标志就结束此过程----
W_FILESTAR = InStr(1, Term.Text, S_FILESTAR, 0)
If W_FILESTAR = 0 Then
Exit Sub
End If
'(3)以下为找到文件传输开始标志的情况
'(3-1)找文件名及文件长度
W_FILENAME = InStr(1, Term.Text, S_FILENAME, 0)
W_FILELEN = InStr(1, Term.Text, S_FILELEN, 0)
FN = Mid(Term.Text, W_FILENAME + 11, (W_FILELEN
- W_FILENAME - 13))
' (3-2)打开接收文件
hJS = FreeFile
JSFN = Pathc + "SJFILES" + Trim(Str(NO)) + "_" + FN
Open JSFN For Binary Access Write As hJS
'(3-3)收件箱增加新记录
W_FILENAME = InStr(1, Term.Text, S_FILENAME, 0)
W_FILELEN = InStr(1, Term.Text, S_FILELEN, 0)
FN = Mid(Term.Text, W_FILENAME + 11, (W_FILELEN - 1) -
(W_FILENAME + 11))
FL = Mid(Term.Text, W_FILELEN + 11, W_FILESTAR
- (W_FILELEN + 10))
SENDLEN = Val(FL)
'应收总字节数SENDLEN
'以下SJRS是已打开的收件箱对应的记录集型变量
SJRS.AddNew '增加一新记录
SJRS!SJRQ = Now '写入收件日期
SJRS!SJFILE = FN '写入收件的文件名
SJRS!SJLEN = Val(FL) '写入收件的长度
SJRS!FILENO = NO '写入收件的序号
'(3-4)显示文件接收窗口
JSLEN = 0
TXINPUT.Show
'(3-5)改变输入模式属性 InputMode为二进制模式
TXRJ.MSComm1.InputMode = comInputModeBinary
'(7)等待几秒,显示 8 7 6 5 4 3 2 1 0
Exit Sub
'(二)文件传输状态处理------------
L2:
ReDim JSARR(0 To N - 1)
JSARR = DATA '将字节流放入字节型数组
'将字节型数组中的数据写入已打开的接收文件
Put hJS, , JSARR
JSLEN=JSLEN+N '本次已累计收到的字节数
'已收字节数与文件总长相比较
If JSLEN < SENDLEN Then
Exit Sub
End If
'转此为文件传输已结束------
'关闭接收文件
Close hJS
'提交收件箱表的新增记录
SJRS.Update
'修改文本显示
W_FILENAME = InStr(1, Term.Text, S_FILENAME, 0)
Term.SelStart = W_FILENAME - 1
Term.SelLength = Len(Term.Text)
Term.SelText = ""
FL = "文件" + FN + "接收结束" + Chr(13) + Chr(10)
Term.Text = Term.Text & FL
'关闭收件窗口
Unload TXINPUT
'改变 InputMode属性为文本模式
TXRJ.MSComm1.InputMode = 0
Exit Sub
End Sub
~~~~~~~~~~~~
----以上以发送和接收文件为例介绍了我们是如何使用VB5.0及MSCOMM
控件来开发自己的的通信软件的。掌握了以上基本技术,就可以稍加改变来
开发自己的各种专用通信软件。例如发送数据库的一条记录,并使接收方把
接收到的数据也放在数据库中。也可以进行数据加密/解密传输等。总之,
学习怎样使用VB5.0及MSCOMM控件来开发自己的的通信软件是十分有用的。
----附注:本软件运行环境
---- 1、硬件环境:CPU为486以上,16MB以上内存。
---- 2、软件环境:WIN95或WIN98或WINDOWS──NT。
---- VISUAL BASIC 5.0
****************************************************************
开发win95屏幕保护预览程序
作者: 包伟
----大家都知道windows屏幕保护程序的作用,而且新的屏幕保护程序
越来越漂亮.如果在win95的桌面右键菜单选属性,就弹出显示器设置界面,
有一个标签是设置屏幕保护程序的.
----在该页的画面上,有一个显示器图案,如果你选择win95所带的屏幕
保护程序,这个屏幕保护程序就会在这个小'显示器'上自动运行,你可以直
接看到运行效果.这功能大大方便了屏幕保护程序的选择,这就是win95对屏
幕保护程序的新增接口:预览功能.
----目前大多数新推出的屏幕保护程序都支持这个接口.
----屏幕保护程序从它的诞生那时起,在同一时刻只能运行一个,不能
多个同时运行,然而预览接口的推出,使同时预览多个屏幕保护程序成为可
能,本文将向读者介绍如何用Delphi开发这样一个程序.
----1.屏幕保护预览接口
----屏幕保护预览接口的使用很简单,这是通过传给屏幕保护程序的命
令行参数来实现的,该命令行参数格式为:
----screensaver.exe/p#####
----其中#####为一个有效的窗口句柄的10进制表示.
----这个窗口我们可以称之为预览窗口.
----实际上,支持预览接口的屏幕保护程序将自己的窗口创建为预览窗
口的子窗口来实现预览功能的.
----2.画面布局
----我们这个程序的窗口分为3部分,为倒'品'字形,上左部分列出所有
可用的屏幕保护程序,上右部分列出所有预览的屏幕保护程序,下面当然是
预览窗口了.
----用Delphi实现时,首先在Form里放2个TPanel组件,Panel1对齐方式
为顶部对齐,Panel2为撑满用户区,再在Panel1中放1个TFileListBox组件和
一个TListBox组件,FileListBox1左对齐,ListBox1撑满用户区.
----这样,FileListBox1为屏幕保护列表,ListBox1为预览列表,Panel2
为预览窗口.
----3.列出屏幕保护程序.
----将FileListBox1的Mask属性设为'*.scr',这是屏幕保护程序的扩
展名.
----在FormCreate方法中将FileListBox1.directory设为windows系统
目录GetSystemDirectory;
----4.预览屏幕保护程序.
----在FileListBox1DblClick方法中运行该屏幕保护程序,并将Panel2
的窗口句柄传给它.
----WinExec(pchar(FileListBox1.FileName+'/p'+inttostr(Panel2.handle)),SW_Show);
----运行程序,怎么样?COOL!
----5.增加一些新特性:隐藏/显示/关闭.
---- 增 加2 个 函 数: 用 于 更 新ListBox1.
function EnumProc(
h : HWND ;// handle of child window
l : integer// application-defined value
): boolean;stdcall;
var buf : array[0..255] of char;
begin
GetWindowText(h, buf, sizeof(buf)- 1);
if iswindowvisible(h) then
Form1.ListBox1.items.add
(' ' +strpas(buf) + ' : ' + inttostr(h))
else
Form1.ListBox1.items.add
('-' +strpas(buf) + ' : ' + inttostr(h));
Result := true;
end;
procedure TForm1.Fresh1;
begin
ListBox1.clear;
enumChildwindows(Panel2.handle,
TFNWndEnumProc(@enumproc), 0);
end;
----增加一个弹出菜单Popupmenu1, 3个菜单项, 'Show, Hide, Close',
将ListBox1.popupmemu指向Popupmenu1.
----Hide的处理函数是:
procedure TForm1.Hide1Click(Sender: TObject);
var h : integer;
s : string;
begin
if ListBox1.itemindex = -1 then exit;
s := Listbox1.items[ListBox1.itemindex];
h := strtoint(copy(s, pos(':', s) + 1, length(s)));
ShowWindow(h, SW_HIDE);
Fresh1;
end;
Show的处理函数是:
procedure TForm1.Show1Click(Sender: TObject);
var h : integer;
s : string;
begin
if ListBox1.itemindex = -1 then exit;
s := Listbox1.items[ListBox1.itemindex];
h := strtoint(copy(s, pos(':', s) + 1, length(s)));
ShowWindow(h, SW_SHOW);
Fresh1;
end;
Close的处理函数是:
procedure TForm1.Close1Click(Sender: TObject);
var h : integer;
s : string;
begin
if ListBox1.itemindex = -1 then exit;
s := Listbox1.items[ListBox1.itemindex];
h := strtoint(copy(s, pos(':', s) + 1, length(s)));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -