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

📄 9910.txt

📁 关于编程技术技巧的文章
💻 TXT
📖 第 1 页 / 共 3 页
字号:
     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 + -