有关Delphi控件开发讨论, 自认为精通Delphi控件开发及VCL架构的高手请人内发表心得!?(300分)

  • 主题发起人 主题发起人 lorderic
  • 开始时间 开始时间
L

lorderic

Unregistered / Unconfirmed
GUEST, unregistred user!
本论总预算1000分, 想与此道高手结识, 有能者得之
请勿发表不相干言论, 分数只会分给内容最精辟正确之人; 没有具体言论者, 请勿回复; 相同意见, 只给第一个发表之人
以下是可以回答的方向, 供参考
1. VCL控件开发的几个主要基类TComponent、TControl、TWinControl、TGraphicControl、TCustomControl的主要功能及各类用途!?
2. ComponentState属性的用途
3. 如果有一个属性为指向另一个类的实例(如TDataSource的Dataset属性), 要注意的事项
4. property宣告的具体心得及注意事项、Keyword Default及Stored的意义
5. TControl与TWinControl的差异
6. TWinControl中如何封装Windows窗体(或者说, Windows的消息通知(message call), 经过了什么过程, 成为Delphi的Method Call) ? Windows的消息处理机制?
或者另一个问法, 在一个Control中, 要处理消息(message), 除了定义消息函数 (procedure WMSetFocus(var Message: TWMSetFocus); message WM_SETFOCUS;) 外, 尚有那些方式?
7. 设计覆合式控件的注意事项

8. 对Windows基本窗体(Eidt, Button, ListBox....)的了解及说明?
 
出生是很重要的,比如你是计算机专业的和不是计算机专业的,走的路是不经相同的.
选择一个合适的类继承,对以后的开发会省去很多的精力,选择在于你!
 
to 臨火:
這個我知道; 可是如果不知道所繼承的類包含那些功能, 即使你繼承了, 也不知如何去運
用,且容易犯下錯誤, 並不自知, 或是採用了效率不好的方式!? 如果不瞭解TComponent、
TControl、TWinControl, 如何自稱知道如何去寫一個控件?

 
你提的问题几句话说不清的,
你主要的问题是对VCL类不了解和在编程中使用类较少,我认为你应该看看这方面的书对VCL各类的说明。
参考书有清华出版的delphi4.0/5.0类详解。

 
几句话说不清的
 
To zhumoo, lds75
的確, 幾句話說不清楚; 以上的問題我也已有我的答案
我只是想借此拋磚引玉, 看看自己所瞭解夠不夠透澈; 順便認識一下各位高手;
如果有任何意見、心得、問題歡迎討論
 
参见《Delphi高级开发指南》电子工业出版社
《Master Delphi》的配套书籍,
里面对控件的编写有一定的介绍
 
谁知道怎样改造DBNavigator控件,使其颜色任意改变。要求Flat属性为True下实现。
 
2. ComponentState属性的用途
这个属性其他的值比较少见具体用到,最常用的是判断是否包含 csDesigning ,
当然,只是开发vcl控件用到,通过判断这个值,可以判断当前是在delphi的设计中
还是程序的执行中。这个判断很重要,有时候在设计期是不做、或者要做一些事情的,
比如socket通讯控件,设置active:=true的时候,判断到当前包含 csDesigning ,
是不用实际连接的
 
1. VCL控件开发的几个主要基类TComponent、TControl、TWinControl、TGraphicControl、TCustomControl的主要功能及各类用途!?
5. TControl与TWinControl的差异
TComponent是所有控件的基类,不可视控件可以使用TComponent为基类
TControl是所有可视控件的基类,它提供左右宽高颜色字体等可视控件要用到的基本属性信息
TWinControl、TGraphicControl 都继承于 TControl
TGraphicControl 是没有HWND句柄的,他不是窗口来的,是delphi做的东西,它在父窗口
接收到WM_PAINT的时候,delphi会安排父窗口拥有的那些 GraphicControl 自己把自己画出来
(比如TLabel、TImage等)
TWinControl 是有窗口的控件,他们是父窗口属下的子窗口,自己处理消息,windows对他们进行管理
delphi只负责处理一些消息,比如TBitton、TEdit等
 
3. 如果有一个属性为指向另一个类的实例(如TDataSource的Dataset属性), 要注意的事项
不需要特别注意什么,只是要判断 Assigned(属性) 看是不是已经赋值了而已
那个赋给值的控件如果在设计期被移动去,会自动把这个属性设置为nil的
在运行期释放了赋给值的对象,这个是不推荐的,应该由用户自己设置nil,你也不必费心
 
4. property宣告的具体心得及注意事项、Keyword Default及Stored的意义
Default实际是告诉delphi你在控件的constructor Create(o:TComponent)中对这个属性赋的初值,
(当然,其他的初始化过程也行,一般的做法是在create赋初值)
并不是说你设置了default的值delphi就会给你赋一个初值,
如果设置了default,你又没有在create设置相同的值,或者根本没有赋初值,那会出问题的
default的作用是,当没有Stored 限制的时候,或者Stored为true的时候
比如 default 123 ,delphi就知道了你这个控件在create的时候给了这个属性赋值123
所以,设计期当你设置这个控件的这个属性为123的时候,delphi就不浪费dfm空间了,他不用把
123保存在你的dfm文件了,因为你告诉他了,create的时候会赋值123,这个123就不用再保存了
如果设计期你设置非 123 ,那么和default值不一样,delphi会把你设置的值保存在dfm
作为资源连接进exe
当stored未设置的时候,是相当于 stored true 的
当stored为false的时候,不管你设计的值和default怎么样,这个值都不会保存进dfm
这个设置特别对密码属性有用,比如,设计期你可能要得到密码来连接数据库,但是你不想
把密码保存进dfm或者exe,这样不安全,你可以设置密码属性stored false,这样每次设计期
输入一次密码,你可以利用这个密码,但是他不会保存,下次打开delphi可以重新输入密码
 
补充,default在array类型的属性里面有另外的含义
比如 TStrings 的 Strings 属性
property Strings[Index: Integer]: string ...; default;
这样设置的作用是,我们一直用
Memo1.Lines[0] ,其实是执行 Memo1.Lines.Strings[0] ,Strings给当作了缺省属性
 
楼主:
既然是要抛玉引砖,先把你的玉拿出来大家看看才好.
 
to lorderic:
你能问出这些问题,说明你对VCL底层知识有一定了解,至少对此感兴趣。
我并不认为这些东西可以通过简单的几句话说清的,其实你只要好好研究一下Delphi自带的
Classes、Controls等单元,就什么都透了。
知识达到这个层次后,基本上都不需要看什么其它的资料了,几乎所有的东西都可以在VCL
源码中去领会、去分析、去创造。

如果对组件开发感兴趣,有空请关注一下CnPack开发计划:
http://cnpack.yeah.net
 
对 Pipi. 兄的补充:
1.VCL控件开发的几个主要基类TComponent、TControl、TWinControl、TGraphicControl、TCustomControl的主要功能及各类用途!?

TGraphicControl从TControl中派生而来,增加了 Canvas 属性处理 WM_PAINT 消息调用虚拟方法
Paint 以实现控件对画面的绘制。
Controls单元中源码如下:
procedure TGraphicControl.WMPaint(var Message: TWMPaint);
begin
if Message.DC <> 0 then
begin
Canvas.Lock;
try
Canvas.Handle := Message.DC;
try
Paint;
finally
Canvas.Handle := 0;
end;
finally
Canvas.Unlock;
end;
end;
end;

而在 CnPack 的界面类图形控件中,并不直接从TGraphicControl中派生,而从TControl中
派生,自己定义虚拟方法和处理重绘消息,以实现最底层的控件级 AlphaBlend 支持。
如下代码所示:
// 控件重绘消息
procedure TCnGraphicControl.WMPaint(var Msg: TWMPaint);
var
Bmp: TCnBitmap;
begin
if (csDesigning in ComponentState) and not FLoaded then
begin
FLoaded := True; // 设计期第一次重绘调用 Loaded 方法
Loaded;
end;

if AlphaBlend and (AlphaBlendValue = 0) then Exit; // 完全透明

if FTransparent and FFullPaint then
DoPaint; // 透明且完整刷新时每次重绘都更新

if not AlphaBlend or (AlphaBlendValue = csMaxAlpha) then // 无半透明效果
begin
if Msg.DC <> 0 then
begin
Face.Lock;
try
Face.DrawTo(Msg.DC, 0, 0); // 画布绘制到目标DC
finally
Face.Unlock;
end;
end;
end
else
begin // 部分透明效果
Bmp := TCnBitmap.Create;
try
Bmp.LoadBlank(Width, Height);
CopyParentImage(Self, Bmp); // 从父控件复制图像
Bmp.AlphaDraw(Face, AlphaBlendValue, False); // Alpha混合
Bmp.DrawTo(Msg.DC, 0, 0); // 绘制到目标DC
finally
Bmp.Free;
end;
end;
end;

TControl没有HWND,在重绘时调用父控件(TWinControl)的保护方法 PaintControls,而TGraphicControl
则继承了这一特性。事实上 TControl 和 TWinControl(也是派生自TControl) 的代码中有相当密切的联系。
 
我不要积分,只要和大家一起进步!
机械工业出版社,“delphi部件开发编程深入剖析“;
另外,以前有过这方面的讨论,你向前查查。
关于windows的基本控件如TButton,TEdit etc 可以看看微软核心编程技术丛书
清华大学出版社的,GDI(图形设备接口),不过是英文版的。
我这儿有控件开发的帮助文件,把你的EMail留下来。
 

Similar threads

D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部