📄 9920.txt
字号:
---- 4: 不 能 直 接 通 过 windows API 使 用 的 资 源
---- 此 种 资 源 不 能 够 由 windows API 直 接 访 问 和 执 行。 但 是,
我 们 可 以 用 一 种 变 通 的 方 法 来 使 用 它。
---- 下 面 示 范 如 何 使 用 pkunzip.exe, 思 路 如 下: 程 序 运 行 时,
将pkunzip.exe 从EXE 文 件 中 分 离 出 来, 放 在 临 时 目 录 下, 用
ShellExecute() 执 行 它。
---- 在FORM 上 放 置 第 三 个 按 纽, 在 放 置 两 个 Edit , 用 来 输 入
pkunzip.exe 的 参 数。
void __fastcall TForm1::Button3Click(TObject *Sender)
{
char exefile[100], tmppath[100] ;
unsigned long ret ;
//检查 pkunzip.exe是否已经存在
GetTempPath( 100, tmppath ) ;
strcpy( exefile ,(AnsiString(tmppath)+
AnsiString("\\pkunzip.exe") ).c_str() ) ;
ret = GetFileAttributes( exefile ) ;
if( ret == 0xffffffff ) { //不存在,则分离出 pkunzip.exe
TResourceStream &rs = *new TResourceStream(
(int)HInstance, AnsiString("unzip"),"EXEFILE" ) ;
rs.SaveToFile( AnsiString(exefile) ) ;
delete &rs ;
}
//执行 pkunzip.exe
// Edit1- >Text和 Edit2- >Text分别为运行时
输入的zip文件名和目标文件目录。
ShellExecute(HInstance, "open", exefile, \
(AnsiString("-d ") + Edit1- >Text +
" " + Edit2- >Text).c_str(), \
tmppath, SW_HIDE ) ;
Application- >MessageBox("解压缩完成", "OK", IDOK ) ;
}
---- 此 种 方 法 实 际 上 是 用 时 间 和 空 间 来 换 取 便 利 性, 有 一
定 的 参 考 价 值。 例 如,DynaDoc 的 免 费 分 发 版 本, 就 是 将 真 正
的 执 行 程 序 压 缩 后 放 在 一 个 有 解 压 缩 功 能 的“ 壳” 中。运 行
时, 首 先 是“ 壳” 运 行 起 来, 将 真 正 的 执 行 程 序 解 压 缩 到 临
时 目 录, 然 后 去 运 行 它。 如 果 你 的 程 序 含 有 大 量 的BMP,WAV 文
件, 不 妨 一 试,能 让 你 的 程 序 减 肥 不 少。
***********************************************************
在PB应用中收发电子邮件
广东珠海 卞国斌
---- 随 着Internet 进 入 千 家 万 户, 通 过Internet 收发 电 子 邮 件 将
成 为 人 们 最 受 欢 迎 的 通 讯 手 段之 一。 如 果 我 们 的 应 用 程 序
也 能 够 提 供 收 发电 子 邮 件 的 功 能, 就 可 以 使 我 们 方 便 快 捷
地与 他 人 交 换 和 共 享 应 用 的 数 据 和 信 息, 使 其应 用 真 正 地
溶 合 于Internet 这 个 大 环 境。 下 面我 介 绍 一 下 在PowerBuild 应 用
中 实 现 收 发 电 子邮 件 的 方 法。
---- 在PowerBuild 应 用 中 实 现 收 发 电 子 邮 件, 主要 是 通 过PowerBuild
系 统 提 供 的 一 套 用 于 邮 件操 作 的 内 嵌 函 数。 这 些 函 数 实 现
其 应 用 到 微软 公 司 的MAPI(Message Application Program Interface)标
准 之 间 的 接 口。
---- 一、 作 为 举 例, 创 建 一 个MDI 风 格 的 窗口w_mail。 在 这 个 窗
口 上, 放 置 一 个 含 接 收 邮件、 发 送 邮 件 和 地 址 薄 三 个 带 图
标 的 菜 单 项的 菜 单m_mail, 一 个 多 行 编 辑 器mle_1。 整 个 窗 口的
外 观 如 下:
---- [ 图 略]
---- 二、 为 各 菜 单 项 编 制 事 件(Event) 处 理 程序(Script)。 程 序 行
中// 后 的 为 说 明 文 字。
---- 1. 在 菜 单 项“ 接 收 邮 件” 的 单 击(Clicked) 事件 下 输 入 下 面
程 序:
mailsession mses
//定义对象mses,以供在程序中引用
mailmessage mmsg
//定义结构mmsg,此结构用于描述邮件的内容
mailrecipient mrec
//定义结构mrec,它标识邮件的接收者和发送者
mailreturncode mreturn
//定义返回码,用于存放函数的返回值
int mnbr
//定义临时变量
//产生邮件会话对象mses
mses = create mailsession
//邮件登录。此处用户名,口令缺省
mreturn = mses.maillogon(mailnewsession!)
if mreturn < > mailreturnsuccess! Then
messagebox("邮件登录","邮件登录失败!")
return
end if
//获得接收到尚未读过的邮件ID号。
它是放在mses中的一个字符串数组
mreturn = mses.mailgetmessages(true)
if mreturn < > mailreturnsuccess! then
messagebox("邮件获取","邮件获取失败或无新邮件!")
return
end if
//获得接收到尚未读过的邮件数目
mnbr = upperbound(mses.messageid[])
//读取最后接收到的邮件内容。
它被放在mmsg的notetext的字符串字段中
mses.mailreadmessage(mses.messageid[mnbr],
mmsg,mailentiremessage!,true)
//把获得的邮件内容放到窗口w_mai1上的多行编辑器mle_1中
w_mai1.mle_1.text=mmsg.notetext
//退出登录
mses.maillogoff()
//取消邮件会话
destroy mses
---- 2. 在 菜 单 项“ 发 送 邮 件” 的 单 击(Clicked) 事 件 下 输 入 下 面
程 序:
mailsession mses
mailmessage mmsg
mailreturncode mreturn
//产生邮件会话对象mses
mses = create mailsession
//邮件登录
mreturn = mses.maillogon(mailnewsession!)
if mreturn < > mailreturnsuccess! then
messagebox("邮件登录","邮件登录失败!")
return
end if
//弹出邮件地址窗口,获取邮件接收者的地址。
地址及名字是放在mmsg中的一 个结构数组
mreturn = mses.mailaddress(mmsg)
if mreturn < > mailreturnsuccess! then
messagebox("邮件地址","邮件地址出错!")
return
end if
//把窗口w_mai1上的多行编辑器mle_1
中的内容放到mmsg的notetext字段中
mmsg.notetext = w_mai1.mle_1.text
//发送邮件
mreturn = mses.mailsend(mmsg)
if mreturn < > mailreturnsuccess! then
messagebox("邮件发送","邮件发送失败!")
return
else
messagebox("邮件发送","邮件发送成功!")
end if
//退出登录 mses.maillogoff()
//取消邮件会话
destroy mses
---- 3.在菜单项“地址簿”的单击(Clicked)事件下输入程序:
mailsession mses
mailmessage mmsg
mailreturncode mreturn
//产生邮件会话对象mses
mses = create mailsession
//邮件登录
mreturn = mses.maillogon(mailnewsession!)
if mreturn < > mailreturnsuccess! then
messagebox("邮件登录","邮件登录失败!")
return
end if
//弹出邮件地址窗口,获取邮件接收者的地址
mreturn = mses.mailaddress(mmsg)
if mreturn < > mailreturnsuccess! then
messagebox("邮件地址","邮件地址出错!")
return
end if
//退出登录
mses.maillogoff()
//取消邮件会话
destroy mses
---- 三、 执 行 程 序。 正 常 执 行 程 序 的 前 提 是, 在Powerbuild 应 用
所 在 的 机 器 上 已 装 有Microsoft Mail 客 户 软 件。
---- 1. 单 击“ 接 收 邮 件” 菜 单 项 或 工 具 图 标, 执 行 接 收 邮 件
处 理 程 序。 该 程 序 将 最 后 接 收 到 尚 未 读 过 的 邮 件 内 容 显 示
到 窗 口 的 多 行 编
辑 器 中。
如 果 把mreturn = mses.mailgetmessages(true) 改 为:
mreturn = mses.mailgetmessages()
便 可 获 得 全 部 邮 件( 包 含 已 读 过 的 邮 件)。
---- 2. 单 击“ 发 送 邮 件” 菜 单 项 或 工 具 图 标, 执 行 发 送 邮 件
处 理 程 序。 该 程 序 执 行 过 程 中, 弹 出 地 址 簿 窗 口, 在 你 选 择
好 接 收 者 后, 则 将窗 口 的 多 行 编 辑 器 中 的 内 容 发 送 出 去。
---- 3. 单 击“ 地 址 簿” 菜 单 项 或 工 具 图 标, 执 行 地 址 簿 处 理
程 序。 该 程 序 弹 出 通 讯 簿 窗 口, 供 你 增 加、 编 辑 或 删 除 邮 件
地 址 属 性。
***********************************************************
VFP中怎样获取表单的返回值
甘肃敦煌七里镇新区 王海军 王海涛
---- 在 调 用 自 定 义 的 对 话 框 表 单 时, 我 们 往 往 需 要 获 得 该
表 单 执 行 后 的 选 择 结 果 或 是 某 些 控 件 的 值 等 等。 许 多 人 采
用 的 方 法 是 设 置 一 个 全 程 变 量, 然 后 在 对 话 框 表 单 内 部 修
改 该 标 志 变 量, 进 而 获 得 需 要 的 结 果。 其 实VFP 提 供 了 一 种
更 为 安 全 的 方 法, 使 得 表 单 不 光 能 够 接 收 参 数, 而 且 能 够
返 回 值。 由 于 不 使 用 全 程 变 量, 表 单 的 通 用 性 和 独 立 性 得
以 增 强。 要 使 得 一 个 表 单 能 够 返 回 值, 必 须 满 足 以 下 条 件:
---- 1. 该 表 单 的 窗 体 类 型 必 须 是 模 式 窗 体;
---- 2. 调 用 该 表 单 的 命 令 为
DO FORM frmName [WITH参数列表] TO VarName
---- 其 中frmName 是 被 调 用 表 单 的 名 称( 若 表 单 有 参 数 应 正 确
指 定 实 参),VarName 就 是 用 来 接 收 表 单 返 回 值 的 变 量 名。 如 果
该 变 量 原 先 没 有 定 义, 则 会 被 自 动 创 建。
---- 3. 被 调 用 表 单 必 须 在unload 方 法 的 代 码 中 使 用 返 回 语 句
return 表 达 式
---- 并 且 应 保 证 该 语 句 一 定 能 够 被 执 行 到, 以 将 表 达 式 的
值 送 入 指 定 的 变 量 中。return 命 令 后 的 表 达 式 可 以 是 任 意 类
型 的 合 法 表 达 式, 如 果 省 略 了return 语 句 后 的 表 达 式, 则 表
单 将 返 回 值 逻 辑 值.T.。 下 例 简 要 说 明 了 获 取 表 单 返 回 值 的
方 法:
一、 创 建 循 环 调 用 程 序test.prg
---- 填 写 代 码:
do while .T.
tempvar = '' &&接收表单返回值的变量
do form test to tempvar
*:\\调用表单,返回值送入变量tempvar
if empty(tempvar)
&&若直接关闭了表单则
exit
else
wait window '表单返回值是' + tempvar
endif
enddo
二、 创 建 示 例 表 单test
---- 1. 添 加 新 属 性uRetuVal;
---- 2. 在unload 方 法 中 添 加 代 码:
---- retu this.uRetuVal
---- 注 意: 由 于 表 单 的unload 事 件 发 生 在destroy 事 件 之 后, 而 此
时 依 附 于 表 单 的 其 他 控 件 都 已 经 释 放, 只 能 引 用 表 单 的 属 性,
而 不 能 引 用 这 些 控 件 的 任 何 属 性 值, 如command1.caption 等 等。 因
此 一 定 要 先 将 需 要 返 回 的 值 送 入 表 单 的 公 共 属 性uRetuVal 中,
这 样 才 能 够 获 得 表 单 的 返 回 值。
---- 3. 设 置 表 单 属 性windowtype 的 值 为1, 即 表 单 为 模 式 表 单。
---- 4. 添 加 三 个 按 钮command1,command2,command3。
设 置 其 属 性 如 下:
command1.caption = "OK"
command1.caption = "CANCEL"
command1.caption = "HELP"
在这三个按钮的click方法里填写相同的代码
thisform. uRetuVal = this.caption
rele thisform
三、 保 存 退 出, 执 行test.prg。
---- 可 以 观 察 到, 按 下 不 同 的 按 钮 时, 变 量 tempvar 将 返 回 不 同
的 值, 这 证 明 表 单 的 确 可 以 返 回 值 到 调 用 过 程。 利 用 这 种 方
法, 我 们 可 以 从 表 单 中 返 回 任 何 类 型 的 值。
***********************************************************
***********************************************************
◆服务台◆
API Spy 32 (164k)
一个检查API 函数的工具,用于 32 位的 Windows 应用程序。
下载地址: http://madmat.hypermart.net/apis32.zip
Turbo Pascal 6.0 源代码 (280k)
没想到居然还能找到这个东东,恐怕这也是许多程序员梦寐以求想得
到的吧,感兴趣的朋友还等什么,快快下载研究一下,开发一个属于
你自己的Turbo Pascal。
下载: http://person.zj.cninfo.net/~yao/download/tp60src.zip
Blood2 源代码 (2.4M)
GT的 QUAKE TOO 游戏大作Blood2的源代码!游戏迷兼程序员请下载。
下载: http://person.zj.cninfo.net/~yao/download/B2_Src.zip
以上软件均出自于我的主页,欢迎您常来光临。
http://person.zj.cninfo.net/~yao (169、163均可访问)
***********************************************************
***********************************************************
◆有问必答◆
055. mailto: yaozheng@kali.com.cn?subject=055
在VC中,使用AppWizard创建了一个基于对话框的程序,且将此对话框
设为属性表(CPropertySheet,是Wizard模式)。随后又添加了一个
正常的对话框,本打算在属性页的最后一页按下“Finish”后调出该
对话框并将属性页 Unload,可怎么做都不行:在 OnWizardFinish()
中处理只能调出对话框,无法卸载属性页;在 InitInstance()中处理
则是对话框一闪就没了。请问有没有好方法。
我的地址:my.love@990.net
056. mailto: yaozheng@kali.com.cn?subject=056
在Delphi4中如何锁住键盘与鼠标。键盘鼠标一个键都不能动!!!
各位大虾,帮我解决一下,如果可以的话,麻烦把源程序发给我!!
e_mail: min-wei@21cn.com
057. mailto: yaozheng@kali.com.cn?subject=057
各位高手:请问VFP6中复选框的RowSource设为一个表的一个字段
如:tmp.addr,RowSourceType=2 - 别名,若TMP.ADDR字段的内容有:
"广东"、"北京"两条记录,在复选框中若输入一个在表中不存在的内
容如:"深圳",输入后为何变成空值,请赐教,谢谢!
mkf@21cn.com
058. mailto: yaozheng@kali.com.cn?subject=058
请问使用foxpro2.5如何实现按窗口上一个键中止循环?通常进入循环
后窗口中所有控件停止响应.(mailto: allfornow@163.net)
如果您有什么疑难问题,就请把问题发往 yaozheng@kali.com.cn
主题为“提问”,我会把问题放在杂志上的,希望编程高手们能
不吝赐教,也希望这个栏目能成为大家交流的场所。
***********************************************************
***********************************************************
◆编者的话◆
本刊已加入【CHINA-EZL】中国电子杂志联盟
联盟主页地址 http://china-ezl.yeah.net
如果您觉得这份刊物还不错的话,欢迎把它介绍给您的朋友.
不知道您看了这期刊物有什么想法或者是意见,欢迎向我提出来.
本人感激不尽,我的联系方法如下:
E-mail:yaozheng@kali.com.cn
ICQ#: 43260473
Homepage:http://biancheng.126.com 【163】
http://person.zj.cninfo.net/~yao 【169】
◆欢迎光临我的主页,一个集编程、软件、鬼故事为主的个人主页
◆《编程技术》订、退方法:
请到本刊主页进行订退工作 http://person.zj.cninfo.net/~yao
投稿:向yaozheng@kali.com.cn发封邮件 主题:投稿
提问:向yaozheng@kali.com.cn发封邮件 主题:提问
**************************THE END**************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -