⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 9920.txt

📁 关于编程技术技巧的文章
💻 TXT
📖 第 1 页 / 共 3 页
字号:

---- 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 + -