📄 9910.txt
字号:
if ( not DbfTable.active ) then exit;
{进行设置显示操作 }
errResult := DbiSetProp( hDBIObj(DbfTable.Handle),
curSOFTDELETEON,
LongInt( DeleteOn ));
if errResult = DBIERR_NONE then
{没有错误,则操作成功 }
begin
result := true;
DbfTable.refresh;
end;
end;
三 . 获 取 当 前 记 录 号
---- 在 用Foxpro 时,RecNo() 函 数 用 惯 了, 在Delphi 程 序 没 有 这 样 的 函 数 觉 得
别 扭 . 下 面 我 们 可 以 用BDE 函 数 获 取 当 前 记 录 在 数 据 集 中 的 记 录 号 .
---- 要 用 到 的 函 数 名 为DbiGetRecord, 函 数 原 型 为
function DbiGetRecord (hCursor : hDBICur;
eLock : DBILockType; pRecBuff : Pointer;
precProps : pRECProps ): DBIResult;
---- 该 函 数 用 来 取 得 当 前 记 录 的 一 些 属 性 . 其 中,hCursor 可 为 数 据 集
的Handle,eLock 为 对 记 录 加 锁 的 类 型,pRecBuff 存 放 记 录 的 缓 冲 区, precProps
为 记 录 属 性 集 .
---- 下 面 就 是 一 个 典 型 的 例 子 .
同样,应在uses语句加上 DbiTypes,DbiProcs,DbiErrs. {取得当前记录的记录号 }
function RecNo( ADbfTable : TTable ) : LongInt;var RecordProps: RecProps;
begin Result := 0; {返回0表示函数执行失败 } with ADbfTable do begin {如果数据集处于非活
动状态,则执行失败 } if not active then exit; {使数据集的当前记录与实际 的当前记录的位置
一致 } UpdateCursorPos; {取得当前记录的属性, 主要是记录的位置 }
if DBIERR_NONE < > DbiGetRecord (Handle, dbiNOLOCK, nil, @RecordProps) then exit;
{发生错误,则操作失败 } Result := RecordProps.iPhyRecNum; {取得记录号 } end; end;
四 . 设 置 查 询 匹 配 方 式( 精 确 匹 配/ 非 精 确 匹 配)
---- 在 用Foxpro 时,Set Exact ON/OFF 对 数 据 查 询 影 响 很 大 . 在Delphi 中, 我 们
同 样 可 以 进 行 这 样 的 设 置 .
---- 要 用 到 的 函 数 名 为DbiSetProp, 这 次 用 的 属 性 名 称iProp 为curINEXACTON,
属 性 值iPropValue 为 True 或False,True 表 示Set Exact OFF .
---- 下 面 就 是 一 个 典 型 的 例 子 .
同样,应在uses语句加上DbiTypes,DbiProcs,DbiErrs.
{设置匹配方式,DbfTable
包含了数据表的信息,ExactOn
表示是否精确匹配,True表示是 }
function SetDbfExact( DbfTable :
TTable ; ExactOn : boolean ) : boolean;
var
errResult : DBIResult;
begin
{如果没有打开,则操作失败 }
if ( not DbfTable.active ) then
begin
result := false;
exit;
end;
{进行设置显示操作 }
errResult := DbiSetProp( hDBIObj(DbfTable.Handle),
curINEXACTON,
LongInt( not ExactOn ));
if errResult = DBIERR_NONE then
{没有错误,操作成功 }
result := true
else{发生错误,操作失败 }
result := false;
end;
五 . 恢 复 被 软 删 除 的 记 录
---- 在Delphi 应 用 程 序 中, 对DBF 数 据 表 执 行 的 删 除 操 作 为 软 删 除 操 作 .
由 于 物 理 记 录 并 没 有 从 数 据 表 中 删 除, 我 们 就 可 以 恢 复 被 软 删 除 的
记 录, 只 要 去 掉 删 除 标 志 即 可 .
---- 要 用 到 的 函 数 名 为DbiUndeleteRecord, 函 数 原 型 为:
function DbiUndeleteRecord
( hCursor : hDBICur ): DBIResult;
---- 其 中,hCursor 可 为 数 据 集 的Handle .
---- 下 面 就 是 一 个 典 型 的 例 子 .
同样,应在uses语句加上DbiTypes,DbiProcs,DbiErrs.
{恢复被软删除的记录 }
function UndeleteRecord
( DbfTable : TTable ) : boolean;
begin
Result := false;
{返回false表示函数执行失败 }
with DbfTable do
begin
{如果数据集处于非
活动状态,则执行失败 }
if not active then exit;
{使数据集的当前记录与
实际的当前记录的位置一致 }
UpdateCursorPos;
{恢复被软删除的记录 }
if DBIERR_NONE < > DbiUndeleteRecord( Handle ) then
exit;{发生错误,操作失败 }
result := true; {操作成功 }
end;
end;
---- 上 面 是Delphi 操 作DBF 数 据 表 的 几 个 常 见 例 子, 希 望Delphi 会 给Delphi 程
序 员 带 来 越 来 越 多 的 方 便, 不 会 让Delphi 程 序 员 感 到 约 束 .
---- 以 上 程 序 在PWin98+Delphi3.0 下 调 试 通 过 .
*****************************************************
在Access数据库中实现密码管理的另一种方式
河北陡河发电厂计算机部 王小娟
---- 大 家 都 知 道, 数 据 库 的 安 全 性 是 很 重 要 的, 它 直 接 影 响 到 数 据
库 的 广 泛 应 用。 用 户 可 以 采 用 任 意 一 种 方 法 来 保 护 数 据 库 应 用 程
序, 也 可 以 将 几 种 方 法 结 合 起 来 使 用。 利 用Access 数 据 库 自 身 提 供 的
加 密 功 能 及 其 他 保 护 方 法 是 很 容 易 的, 我 就 不 多 说 了。 在Access 数 据
库 中, 嵌 入 了 一 种 很 强 的 数 据 库 操 作 语 言 — —Visual Basic 语 言, 所 以
可 以 采 用Visual Basic 编 写 程 序, 来 实 现 一 些 复 杂 的 功 能。 下 面 将 介 绍
如 何 在Visual Basic 程 序 中 实 现 加 密 功 能, 以 确 保 数 据 的 安 全 性。
---- 对 于 一 些 公 司 来 说, 职 员 的 工 资 管 理 是 一 个 不 大 不 小 的 问 题。
有 时, 领 导 需 要 了 解 一 段 时 间 内 每 个 职 员 的 收 入 如 何, 以 便 掌 握 各
项 奖 金 的 发 放 情 况。 为 此, 我 设 计 了 一 个“ 工 资 管 理” 数 据 库, 可 以
按 时 间 进 行 查 询, 并 根 据 所 选 的 工 资 类 别 进 行 统 计。 为 了 防 止 其 他
人 查 看 此 数 据 库, 我 采 用“ 独 占” 方 式 给 数 据 库 设 置 了 密 码。 这 种 方
法 也 有 一 定 的 局 限 性, 如 果 用 户 恰 巧 提 供 了 正 确 的 数 据 库 密 码, 该
方 法 就 不 能 控 制 用 户 对 数 据 库 进 行 操 作。
---- 为 了 进 一 步 防 止 职 员 查 看 工 资 的 统 计 结 果( 即 有 些 奖 金 并 不 是
公 开 的, 除 领 导 以 外 的 其 他 人 不 应 该 知 道 工 资 数 目), 我 又 创 建 了
一 个 密 码 表, 设 置 好 密 码, 记 住 并 将 其 隐 藏 起 来( 先 选 中“ 密 码 表”,
再 单 击“ 窗 口” 菜 单 中 的“ 隐 藏” 命 令, 即 可 把 此 表 隐 藏 起 来)。 然 后,
在“ 职 工 工 资 对 话 框” 窗 体 中, 添 加“ 密 码” 文 本 框, 并 在“ 预 览” 及
“ 打 印” 的 事 件 过 程 中 加 入 下 列 语 句:
DoCmd.ApplyFilter , "密码 = Forms!
职工工资对话框!PassText"
If Not IsNull([密码]) Then
/*其他代码*/
Else
MsgBox "请输入正确的密码!"
PassText.SetFocus
End If
/*其他代码*/
---- 这 样, 就 实 现 了 双 重 加 密 功 能。 即 使 用 户 能 进 入 数 据 库, 如 果 第
二 次 没 有 提 供 正 确 的 密 码, 他 也 不 能 预 览 和 打 印 一 定 时 间 范 围 的 统
计 结 果。 这 就 进 一 步 限 制 了 用 户 的 非 授 权 访 问。
---- 为 了 提 高 数 据 库 的 安 全 性, 每 隔 一 段 时 间 都 应 更 改 密 码。 为 此,
在“ 职 工 工 资 对 话 框” 窗 体 中, 我 又 添 加 了 一 个“ 更 改 密 码” 子 窗 体,
在 此 窗 体 中 加 入 下 列 代 码, 即 可 随 时 更 改 密 码:
Private Sub确定_Click()
On Error GoTo Err_确定_Click
DoCmd.ApplyFilter , "密码
= Forms!更改密码!Text1"
If IsNull([密码]) Then
MsgBox ("密码不正确,
请再输入一次")
Text1.SetFocus
GoTo Exit_确定_Click:
End If
If Text3.Value < > Text2.Value Then
Text3.SetFocus
MsgBox ("请输入正确的确认密码")
Else:
密码 = Text3.Value
DoCmd.Close
End If
Exit_确定_Click:
Exit Sub
Err_确定_Click:
MsgBox Err.Description
Resume Exit_确定_Click
End Sub
---- 更 改 密 码 后, 应 记 住 此 密 码, 以 备 以 后 使 用。
---- 设 计 好 程 序, 并 将 有 关 代 码 隐 藏 起 来( 与 隐 藏“ 表” 的 方 法 相 同),
以 防 其 他 人 修 改 或 偷 看。 这 里 介 绍 的 方 法 只 是 在 程 序 中 实 现 加 密 功 能
的 一 个 小 技 巧, 在 其 他 数 据 库 管 理 中, 也 可 采 用 此 方 法 进 行 加 密。 也
许 存 在 更 为 简 洁 的 方 法, 有 待 大 家 在 编 程 过 程 中 发 掘 出 来 并 互 相 交 流。
*****************************************************
给AutoCAD 增加超级编辑命令
苏州清华技术研究所 黄耕耘
---- AutoCAD在中国有很广泛的用户基础,同时也有很多专业的、业余的开发人员。
从R13版本开始,Autodesk 提供了ARX开发工具,面向对象的特性使开发人员如沐春
风。有关ARX编程与ADS编程的比较这里不再赘述,此处只讲如何用ARX实现我们所要
求的功能,不足之处请指正。
---- 许多二次开发软件均提供超级编辑命令,如Genius 14、HMCAD 6.0等等。读者
或许对这些命令很感兴趣,能不能自己开发类似的功能呢?只要您对C++和ARX编程
有一些了解,利用Autodesk提供的ObjectARX SDK软件包(可以到Autodesk网址上免
费下载),您能很方便的写出此类程序,虽说不能和专业人员提供的超级编辑命令相
媲美,但也能给您带来不少方便。本文利用ObjectARX提供的范例程序(缺省安装
ObjectARX SDK后的路径是X:\OBJECTARX\ARXLABS\LAB07)进行简单的修改即可实现
我们所要求的功能。以下是采用ObjectARX SDK 2.0,在MSVC 5.0编译环境下测试通过。
---- 首先我们要修改enttemp.h文件:
---- 原文件如下:
class EntTemperature : public AcRxObject
{
public:
ACRX_DECLARE_MEMBERS(EntTemperature);
virtual double reflectedEnergy(AcDbEntity* pEnt) const = 0;
};
将斜体部分修改成如下:
virtual Adesk::Boolean HgyModify(AcDbEntity* pEnt)
const = 0;
---- 因为我们以后要以EntTemperature作为基类,而且HgyModify函数在继承类中要
重写并要求实现动态调用,故此处必须声明为虚拟函数。Virtual关健字即为C++面向
对象的重要的特性。
---- 第二、删除tempapp.def文件中的energy文本。
---- 第三、修改tempapp.cpp文件:
---- 1、 删除CircleTemperature、RigonTemperature及EllipseTemperature类的所
有相关内容。
---- 2、 修改原文件中如下的内容:
class DefaultTemperature : public EntTemperature
{
public:
virtual double reflectedEnergy(AcDbEntity* pEnt) const;
};
double DefaultTemperature::reflectedEnergy
(AcDbEntity* pEnt) const
{
ads_printf("\nThis entity has no area, and no reflection.\n");
return -1.0;
}
修改后的内容如下:
class DefaultTemperature : public EntTemperature
{
public:
virtual Adesk::Boolean HgyModify(AcDbEntity* pEnt) const;
};
Adesk::Boolean DefaultTemperature::
HgyModify(AcDbEntity* pEnt) const
{
ads_printf("\nThe entity hasn't defined,
and nothing to be modified.\n");
return Acad::eOk;
}
为简单起见,我们只对直线和圆定义超级编辑命令,
在此定义有关line和circle类。在tempapp.cpp
文件中增加CircleTemperature和LineTemperature类,
定义如下:
class CircleTemperature : public EntTemperature
{
public:
virtual Adesk::Boolean HgyModify(AcDbEntity* pEnt) const;
};
Adesk::Boolean
CircleTemperature::HgyModify(AcDbEntity* pEnt) const
{
AcDbCircle *pCircle = AcDbCircle::cast(pEnt);
if (!pCircle) {
ads_printf("The entity selected is not a circle\n");
pEnt- >close();
return Acad::eNotImplementedYet;
}
AcGePoint3d p,q;
double r;
p=P_TO_P(pCircle- >center());
if (getPoint((double*)(&p), "Center Point: ", p)== RTNORM
&& ads_getdist((double*)(&p), "Blob radius: ", &r) == RTNORM)
{
pCircle- >setCenter(p);
pCircle- >setRadius(r);
pCircle- >close();
}
return Acad::eOk;
}
class LineTemperature : public EntTemperature
{
public:
virtual Adesk::Boolean HgyModify(AcDbEntity* pEnt) const;
};
Adesk::Boolean
LineTemperature::HgyModify(AcDbEntity* pEnt) const
{
AcDbLine *pLine = AcDbLine::cast(pEnt);
if (!pLine) {
ads_printf("The entity selected is not a line.\n");
pEnt- >close();
return eNotImplementedYet;
}
AcGePoint3d p,q;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -