知识大全 Delphi组件撰写常问问题分析

Posted

篇首语:知识的领域是无限的,我们的学习也是无限期的。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 Delphi组件撰写常问问题分析相关的知识,希望对你有一定的参考价值。

Delphi组件撰写常问问题分析  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

此份文件的目的为何?  这份文件的目的是为了解答有关撰写 Delphi组件时常见或文件上找不到的问题 我曾经花了一段很长的时间来了解探索 TDataLink 类别 这让我觉得应该将撰写组件时常遇到的问题及经验心得写下来 分享给大家 不过我并不能保证写在这份文件里头的解答完全正确 如果你对其中的任何问题有更好的解决方法 或认为有什么信息适合放在这份文件里的话 请告知作者 有任何错误或缺漏也欢迎指正   除了再加上更多的问题及解答外 我试着再补充两个部分   进阶程序设计师喜爱的工具 这也许跟组件设计没有直接的关系但至少它们跟 Delphi有关系   值得参考的文件刊物 由于空间的关系 这份文件不能放置太多的范例程序 因此参考其它文件是十分需要的 这不是一份教材式的文件 我不会做太多条理式的说明 但会试着将最具有参考价值的文献列出   如果你有任何意见或建议 欢迎来信告诉我     第二部份 整合环境   在整合环境中如何找出组件所产生的问题?  我发现唯一能找出问题的方法只有   在 Delphi 整合环境的 Tools|Options 对话框的 Library 页中将『Compile with debug info』选项打勾   选 Component|Rebuild Library 重新编译组件库   从 Turbo Debugger 中执行 Delphi   选File|Change Dir移至包含组件程序代码的目录下   如果你的组件发生GPF时就可以检视堆栈然后得知到底是哪些发生问题了      如何检视 Delphi 所产生的汇编语言码?  Glen Boyd 的回答   开启登录编辑程序(REGEDIT EXE) 接着到『HKEY_CURRENT_USER\\Sofare\\Borland\\Delphi\\ \\Debugging』下新增一个字符串机码『EnableCPU』 将它的字符串值设为『 』 此后Delphi整合环境的View选单下就会多一个『CPU』选项 它会开启一个窗口来检视目前程序指令的内存及汇编语言 你可以在侦错时利用单步追踪或其它方法来观察它      我可以在执行时期动态建立组件 但在设计时期就会发生错误 为什么?  你的组件必须继承自TComponent类别或其衍生类别   你的组件建构函式及灭构函式宣告必须看起来像这样   constructor Create(AOwner: TComponent); override;  destructor Destroy; override ;  所有在published区段宣告的字段型态必须是ordinal single double extended p currency string small set(译注 指元素编号不超过 这个范围的集合 平常的集合可容许的范围为 ) method pointer或class其中一种 如果你宣告了其它型态的字段 Delphi编译器并不会检查出错误 然而当你使用这个组件时依然会得到一个GPF   如果你想让TMyComponent组件可以在设计时期操作 注意下面的宣告会引发十分严重的问题   type TComplex = record  RealPart: Double;  ComplexPart: Double;  end;  class TMyComponent = Class(TComponent)  private  F : TComplex;  published  property P : TComplex read F write F ;  end;     如何撰写一个无法放置到表格上的组件?  Ray Lischner 的回答   如果你不想让使用者将组件拉曳至表格上的话 使用 RegisterNoIcon 及 RegisterClass 程序来注册组件      在程序代码编辑器中快速切换程序区段最简单的方法是什么?  Ray Konopka 的回答   在探索 VCL 原始程序代码时 强烈建议你最好熟悉程序代码编辑器里的书签功能 使用方法很简单 Ctrl Shift N N 是从 至 的数字 用来设定一个书签 此后就可以使用 Ctrl N 来跳跃至书签处 (译注 使用这项功能真的可以节省你许多来回卷动程序及找寻函式的时间 别迟疑了 快学吧!)     如何使我的组件在按下鼠标右键时出现快速功能选单?  你必须要建立一个组件编辑器 组件编辑器决定了组件在设计时期时对鼠标键的反应及动作 你可以为组件定义它自己的快速功能选单   建立组件编辑器的步骤大致如下   从 TComponentEditor 类别继承一个新的类别   改写类别的 GetVerbCount GetVerb及 ExecuteVerb方法   在 Register 程序中使用 RegisterComponentEditor 程序来注册此组件编辑器   有关组件编辑器这个主题在『Developing Delphi Components』这本书中有详尽的解说及信息      为什么组件在设计时期会出现『I/O 』的错误?  你可能在组件中使用了Writeln这个程序      为什么组件编辑器不会将组件属性的变动储存起来?  我发现有时自制的组件编辑器不会将组件属性储存起来 设计时期一切正常 但是储存起来再重新读入后就有问题了   原因是你很可能忘了在组件编辑器中呼叫此方法   Designer Modified;  如此一来Delphi才会知道你的组件编辑器更改过属性值了     第三部分在组件中使用其它组件   如何在组件中加入滚动条组件并让它在设计时期能动作?  你的滚动条组件类别必须处理 CM_DESIGNHITTEST 组件讯息才行   TMyScrollBar = class (TScrollBar)  procedure CMDesignHitTest  (var Message: TCMDesignHitTest); message CM_DESIGNHITTEST;  end;    procedure TMyScrollBar CMDesignHitTest( var Message: TCMDesignHitTest);  begin  Message Result := ;  end;    你的组件必须以以下方法建立滚动条   TMyScrollBar Create(nil);  而不是  TMyScrollBar Create(Self);     如何建立Windows 式样的滚动条?  你必须设定滚动条的页面大小 你可以用以下的程序代码来做   procedure SetPageSize(ScrollBar: TScrollBar; PageSize: Integer);  var  ScrollInfo: TScrollInfo;  begin  ScrollInfo cbSize := Sizeof (ScrollInfo);  ScrollInfo fMask := SIF_PAGE;  ScrollInfo nPage := PageSize;  SetScrollInfo (ScrollBar Handle SB_CTL ScrollInfo True);  end;    要取得目前页面大小可用如下方法   function GetpageSize (ScrollBar: TScrollBar): Integer;  var  ScrollInfo: TScrollInfo;  begin  if HandleAllocated then  begin  ScrollInfo cbSize := SizeOf (ScrollInfo);  ScrollInfo fMask := SIF_PAGE;  GetScrollInfo (ScrollBar Handle SB_CTL ScrollInfo);  Result := ScrollInfo nPage;  end;  end;    第四部分 Bound Controls   哪里可以找得到有关 TDataLink 类别的说明文件?  我可以大胆地说全世界有关 TDataLink 的说明文件只有一份 就在这儿   属性 (Property) 介绍  property Active: Boolean(只读)  当此 DataLink 连结至一个已开启的 DataSource 时会传回 True 当 Active 状态改变时会 触发ActiveChanged方法   property ActiveRecord: Integer(可擦写)  用来设定或取得 DataLink 缓冲区中目前所指向的记录代码 代码的范围是 BufferCount 使用它来设定记录代码时必须小心不要超过这个范围 否则可能导致不可预期的错误   property BufferCount: Integer(可擦写)  DataLink 拥有一个资料缓冲区 而 BufferCount 属性即用来设定或取得缓冲区大小 缓冲区大小决定了一个dataset同时可以显视的资料记录笔数 对大部分的资料感知组件来说 BufferCount 的值是 但对 TDataGrid 来说 BufferCount 代表它的可视列数目   property DataSet: TDataSet(只读)  传回此 DataLink 所连结的 DataSet 其实就是 DataSource DataSet   property DataSource: TDataSource(可擦写)  传回此DataLink所连结的DataSource   property DataSourceFixed: Boolean(可擦写)  这个属性可用来防止 DataSource 属性被更改 如果此属性设为 True 当我们试着改变 DataSource 属性时会引发一个例外   property Editing: Boolean(只读)  如果 DataLink 正处于编辑状态则传回 True   property ReadOnly: Boolean(可擦写)  设定 DataLink 是否为只读状态 这个属性并不会影响所连结的 DataSet 在只读状态下这个 DataLink 无法进入编辑状态   property RecordCount: Integer(只读)  传回DataSet的资料记录数目   方法 (Method) 介绍  function Edit: Boolean;  让所连结的DataSet进入编辑状态 传回值 成功传回 True 失败传回 False  procedure UpdateRecord;  我们不直接呼叫这个方法 它是提供其它程序来呼叫的 这个方法只有设定一个旗帜然后呼叫 UpdateData 方法   虚拟方法 ( Virtual Method )  要让 TDataLink 对象与组件沟通必须改写下列这些方法   procedure ActiveChanged  当连结的 DataSource 开启状态改变时会呼叫此方法 使用 Active 属性可以得知目前是否为开启状态   procedure CheckBrowseMode  数据库有任何改变之后都会先呼叫这个方法   procedure DataSetChanged;  当下列任一事件发生时都会呼叫此方法   移至DataSet的开头  移至DataSet的结尾  在DataSet中插入或新增资料  删除DataSet的资料  取消DataSet的编辑  更新记录  如果不想改写这个方法只要在其中呼叫 cha138/Article/program/Delphi/201311/8437

相关参考

知识大全 面试者常问问题

1、能介绍一下你自己吗?(流利回答两分钟以上)2、你能谈谈对我们公司的了解吗?(或:你是怎么知道我们公司的?)3、你觉得我们为什么要录用你?4、你觉得哪些事情你能做到,而别人做不到?5、你希望从工作中

知识大全 面试常问问题和最佳答案

问题1:你为什么想离开目前的职务?  A.别的同仁认为我是老板前的红人,所以处处排挤我。  B.调薪的结果令我十分失望,完全与我的付出不成正比。 &n

知识大全 最常问问题和最佳答案

  问题1:你为什么想离开目前的职务?A.别的同仁认为我是老板前的红人,所以处处排挤我。B.调薪的结果令我十分失望,完全与我的付出不成正比。C.老板不愿授权,工作处处受限,绑手绑脚

知识大全 Delphi的组件读写机制

Delphi的组件读写机制  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  一流式对象(Strea

知识大全 基于Delphi的组件设计之概念[1]

基于Delphi的组件设计之概念[1]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  作为组件制

知识大全 Delphi中DBEdit组件使用方法

Delphi中DBEdit组件使用方法  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Delph

知识大全 基于Delphi的组件设计之概念[3]

基于Delphi的组件设计之概念[3]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Delph

知识大全 基于Delphi的组件设计之概念[2]

基于Delphi的组件设计之概念[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  属性可以有

知识大全 基于Delphi的组件设计之简单实例

基于Delphi的组件设计之简单实例  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!这是一个可以计数

知识大全 Delphi中多媒体组件使用解析[2]

Delphi中多媒体组件使用解析[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! &