中国程序员联盟 正在重新改版中ing 不便之处还请见谅 改版后将内容涉及java delphi .net php
 
  首页 | 数据库开发 | 网络通讯 | 多线程 | 多媒体开发 | 图像处理 | 程序人生 | 系统函数 | 控件开发 | Web服务
 
  当前位置:笨鱼delphi技术网>系统函数>文章内容

delphi API函数开发三原则

来源:站内 关于:bill 发布时间:2007-06-27   [收藏] [推荐]
 Windows 的API 函 数 是 应 用 程 序 开 发 的 有 力 辅 助 工 具, 对 它 们 的 恰 当 使 用, 可 大 大 增 强 和 改 进 应 用 程 序 与 系 统 打 交 道 的 能 力, 使 自 己 的 程 序 真 正 具 有 底 层 操 作 功 能。 作 为RAD 工 具 的 基 础 代 表,BORLAND DELPHI 虽 然 本 身 也 已 提 供 了 大 量 强 有 力 的 函 数 和 过 程, 但 在 某 些 场 合、 要 求 下, 使 用API 函 数 将 使 你 的 程 序 进 一 步 得 到 改 善, 并 可 拓 宽 范 围, 简 化 程 序 代 码。

---- 在DELPHI 中 引 用API 函 数, 和 使 用DELPHI 本 身 的 函 数、 过 程 几 乎 没 有 区 别。 在DELPHI 目 录 下 有 一 个WINDOWS.PAS 文 件, 凡 是 在 其 中 声 明 过 的API 函 数, 都 可 在 编 程 时 直 接 引 用 而 无 须 另 加 说 明。 只 是 要 注 意, 标 准API 函 数 都 是 以C 或C++ 为 标 准 进 行 数 据 结 构 定 义 的, 而DELPHI 使 用 的 是OBJECT PASCAL 语 言, 因 此 在 引 用 时 应 特 别 注 意 参 数 和 函 数 本 身 的 数 据 类 型。 如 一 个API 函 数 若 为 布 尔 值, 则 在DELPHI 中 就 应 以TRUE、FALSE 而 不 能 用0、 非0 来 对 返 回 值 进 行 判 断。

---- 下 面 以 三 个 小 例 子 来 说 明API 函 数 在DELPHI 中 的 使 用。

---- 一、 本 地 化 消 息 框

---- 想 让 自 己 的 消 息 框 显 示“OK”、“Cancel” 还 是“ 确 定”、“ 取 消” ? 如 果 想 使 程 序 彻 底 本 地 化, 那 么 还 是 放 弃MessageDlg 和ShowMessage 吧 — — 都 怪DELPHI 没 有。 用MessageBox 这 个API 函 数 照 样 方 便。

---- 使 用 语 法 为:

MessageBox (HWND:hWND,lpMessage:
PChar,lpCaption:PChar,uType:Cardinal); 

---- 各 参 数 中, 第 一 个 为 消 息 框 所 属 的 窗 口 句 柄, 第 二 个 为 要 显 示 的 消 息, 第 三 个 为 消 息 框 的 标 题, 第 四 个 为 消 息 框 的 类 型, 函 数 返 回 值 为 整 型 数。

---- 为 使 消 息 框 有 所 归 属, 第 一 个 参 数 设 为 当 前 窗 口, 获 取 其 句 柄 的 方 法 是 使 用 另 一 个API 函 数:GetActiveWindows( ), 且 不 需 任 何 参 数。

---- 例1)Message box 示 例:

---- 1 . 主 要 构 件 及 属 性 的 设 置:

form1:caption : messagebox示例 
      bordericons : biMaximize和biHelp设为false
 panel1:caption :文字部分  Alignment : taLeftJustify
 panel2:caption :图象部分  Alignment : taLeftJustify
 button1~button12 : caption分别为:确定、确定取消、
确定帮助取消、是否、重试取消、终止重试取消、
信息、提问、系统图标、警告、停止、组合方式
bitbtn1:kind : bkClose

---- 如 图 一 所 示:

---- 2 . 事 件 说 明:( 详 见 源 程 序, 下 仅 举 两 例)

{文字部分以button2click( )为例}
procedure TForm1.Button2Click(Sender: TObject);
begin
 case messagebox(getactivewindow(),
'显示确定、取消框','例子',
mb_okcancel)
 of idok:messagebox(getactivewindow(),
'您按下的是“确定”按钮',
'结果',mb_ok);
  idcancel:messagebox(getactivewindow(),
'您按下的是“取消”按钮',
'结果',mb_ok);
 end;
end;
{图象部分以button8click( )为例}
procedure TForm1.Button8Click(Sender: TObject);
begin
 messagebox(getactivewindow(),'显示警告图标','例子',
mb_iconwarning)
end;

---- 二、 改 进Windows 9x 的 系 统 登 录 的 安 全 性:

---- Win 9x 的“ 用 户 登 录” 窗 口 可 谓 来 者 不 拒, 密 码 不 对 照 样 可 以“ 登 堂 入 室”, 系 统 为 用 户 保 留 的 个 人 设 置 等 信 息 也 就 毫 无 保 密 性 可 言, 通 过 查 看Profiles 目 录, 可 轻 松 地 将 其 复 制 或 删 除。 虽 然Win95、Win98 的 应 用 对 象 是 个 人 用 户, 但 在 某 些 场 合 下, 还 是 让 登 录 窗 口 起 点 作 用 的 好。

---- 要 使 系 统 登 录 具 有 安 全 性, 对 非 法 使 用 者 真 正 能 拒 之 门 外, 不 妨 用 两 个API 函 数 来 实 现 此 目 的。

---- 例 二) 系 统 登 录 检 查

---- 1 . 主 要 构 件 及 属 性 设 置:

form1:caption:CheckUser
     height、width: 设 为 最 小 值

---- 2 . 事 件 说 明:

//定义变量
  private
   size:cardinal;
   name:pchar;
   entry:boolean;{ Private declarations }

procedure  TCheckUser.FormShow(Sender: TObject);
begin
   size:=64;
   name:=StrAlloc(64) ;
   {检查用户名,判断是按了“取消”按钮还是键入了新用户名}
   if GetUsername(name,size)
   then  if   name=’wj’
//‘wj’为笔者机器的登录用户名
{在此,若允许的合法使用者不止一个,还可利用关系运算指定
一个以上的用户进入。
如:if (name=’computer1’) or (name=’computer2’)
}
              then  entry:=true;
   close;
end;

procedure TCheckUser.FormClose
(Sender: TObject; var Action:  TCloseAction);
begin
 if  not entry
  then ExitWindowsEx(EWX_REBOOT,32);
//若用户名不对,则重新启动Windows
end;

procedure TCheckUser.FormCreate(Sender: TObject);
begin
  entry:=false;//设定初始值
end;

---- 编 译 完 毕 后, 生 成EXE 文 件, 然 后 打 开 注 册 表 — — 使 用Regedit, 找 到HKEY_LOCAL_MACHINE\SOFTWARE\Micr\Windows\ CurrentVersion\RUN 行, 添 加 键 值 名( 如:CheckUser) 及 键 值(EXE 文 件 所 在 的 完 整 路 径)。 如 图 所 示:

---- 好 了, 重 新 启 动 一 次, 没 有 正 确 的 密 码 还 能 进 入 吗 ?

---- 三 . 没 有“ 媒 体 播 放 器” 的 声 音 播 放

---- 日 前 做 了 一 个 小 程 序, 想 在“ 关 于” 窗 口 加 上 一 段 声 音 说 明, 但 小 小 的“ 关 于”FORM 放 上 一 个 长 长 的、Visible 属 性 需 为False 的MediaPlayer 构 件 实 在 别 扭。 东 查 西 找 之 下, 还 是 靠API 函 数SNDPLAYSOUND() 解 决 了 问 题 — — 从 而 摆 脱 了MediaPlayer 的“ 束 缚”。 例 三) 使 用API 函 数 控 制 声 音 文 件 的 播 放:( 部 分 代 码)

procedure  TaboutBox.FormShow(Sender: TObject);
begin
  // 播 放 当 前 目 录 下 的welcome.wav 文 件
  sndplaysound(‘welcome.wav’,snd_async)
end;

procedure  TAboutBox.FormClick(Sender: TObject);
begin
  // 停 止 播 放
  sndplaysound(‘’,snd_async);
end;

---- 别 忘 了, 在USES 子 句 中 加 入mmsystem 单 元。 如 果 只 需 要 播 放 声 音, 那 么 一 条API 函 数 就 能 实 现 功 能 的 还 用 得 着MediaPlaye吗?


[浏览: 次]   
上一篇:delphi Win32 API 使用的特殊情况   下一篇:delphi 关闭windowns
[收藏] [推荐] [返回顶部] [打印本页] [关闭窗口]  
    评论加载中…
google adsense热点文章
·delphi Delphi中ShellExecute的妙用
·delphi 如何快速读取文本文件
·delphi 在应用层截获键盘消息
·delphi 如何判断输入值是否中文
·delphi delphi实现服务开启与关闭
·delphi 实时记录事件日志
·delphi 使MEMO自动滚动
·delphi 如何区分键盘两个Enter键
·delphi 切换界面的方法
·delphi 汉字输入法的编程及使用
·delphi Delphi程序输入法自动切换最简
·delphi 消息是由谁来发出又由谁来完成
     delphi技术网 | firefox 下载 | Avant Browser下载 | dedecms 技术网 | drupal 爱好者 | php 技术网
  Copyright@www.delphichm.com,2006-2009.All Rights Reserved.
 
程序员联盟 | delphi Java .net|QQ:707102932