代码示例:你是真的对Delphi很了解了么?
Procedure StepEditor( strgrid: TStringGrid; Step: TStep );
var
sValue, sField: string;
EditorClass: TStepEditorClass;
Editor: TStepEditor;
begin
sField := strgrid.Cells[0, strgrid.Selection.Top];
sValue := strgrid.Cells[1, strgrid.Selection.Top];
EditorClass := EditorClassList.Editors[ sField ];
Editor := EditorClass.Create;
Editor.Field := sField;
Editor.Step := Step;
Editor.Edit( sValue );
Editor.Free;
strgrid.Cells[ 1, strgrid.Selection.Top ] := sValue;
end;
问题点数:100、回复次数:76Top
1 楼Musicwind(Musicwind)回复于 2001-05-21 09:52:00 得分 0
大家用过类似的代码写程序么?有人回应么?Top
2 楼Musicwind(Musicwind)回复于 2001-05-21 09:53:00 得分 0
关键在于这一段:
EditorClass := EditorClassList.Editors[ sField ];
Editor := EditorClass.Create;Top
3 楼Musicwind(Musicwind)回复于 2001-05-21 09:56:00 得分 0
EditorClass 是一个Class of Class, 也就是类的类
比如
TFormClass = Class of TForm;
但是不同于:TFormClass = Class( TForm ); 这是两个概念!
而 EditorClassList 里面存放的就是 类的类的列表;
Editor := EditorClass.Create;
Create是类方法,而不是对象方法,所以可以由 EditorClass来创建EditorClass的一个实例;
Top
4 楼Musicwind(Musicwind)回复于 2001-05-21 09:58:00 得分 0
有人回应吗?Top
5 楼Musicwind(Musicwind)回复于 2001-05-21 10:00:00 得分 0
补充:
TStepEditor = Class( TObject )
...
End;
TStepEditorClass = Class of TStepEditor;
Top
6 楼Musicwind(Musicwind)回复于 2001-05-21 10:14:00 得分 0
大家都来看看,来了解了解所谓的Class of Class;Top
7 楼IUPRG(给我点一首周截棍的“双杰伦”)回复于 2001-05-21 10:18:00 得分 0
用在什么地方?
也就是class of class做什么用?(我无知)Top
8 楼Musicwind(Musicwind)回复于 2001-05-21 10:27:00 得分 0
Object Inspector 为什么能够提供一个方便的编辑环境?
为什么不同的字段,供选择的值不一样,校验的方式不一样,弹出的编辑框
不一样?因为根据不同的字段类型,注册了不同的属性编辑器 Propety Editor;
简化Delphi提供的注册属性编辑器的函数,可以描述为以下:
RegisteryPropertyEditor( PropertyFieldType, EditorClass );
^此处为类型名,如 Bool , Integer, ...等等
^此处为对应的编辑器的类名,注意,不是类名的字符描述
实际运行的时候,用户点击Object Inspector 的一个字段的时候,
Delphi内部就搜索该字段类型对应的编辑器类;然后由找到的类的类,创建该类的一个实例;
进行相关的操作(决定是否有下拉框,是否有一个按钮等等)
Top
9 楼Musicwind(Musicwind)回复于 2001-05-21 10:43:00 得分 0
Up it !Top
10 楼Kingron(单身走我路……)回复于 2001-05-21 10:44:00 得分 0
好深奥噢!Top
11 楼heifei(找到了)回复于 2001-05-21 10:47:00 得分 0
to Musicwind(风里来雨里去) :
想说明什么问题呢?是想体现 “多态性”吗?Top
12 楼xtao(醉里插花花莫笑,可怜人似春将老。)回复于 2001-05-21 10:51:00 得分 0
想说明什么问题? 是想说你很厉害?
在计算机的世界里,没有人可以说自己很厉害。
Top
13 楼xtao(醉里插花花莫笑,可怜人似春将老。)回复于 2001-05-21 10:52:00 得分 0
那些东西,只要看看源代码,谁都应该明白。Top
14 楼Musicwind(Musicwind)回复于 2001-05-21 10:56:00 得分 0
不是想说明自己厉害,是因为自己不厉害,到现在还明白Delphi的这些“事理”,
想和大家分享一下。
楼上的兄弟,说话这么刻薄,何必?!
Top
15 楼Musicwind(Musicwind)回复于 2001-05-21 10:57:00 得分 0
更正:
是到现在才明白Delphi的这些“事理”,想和大家分享一下
Top
16 楼seewell(我要飞)回复于 2001-05-21 11:04:00 得分 5
多谢Musicwind(风里来雨里去),好帖子.
Top
17 楼Musicwind(Musicwind)回复于 2001-05-21 11:11:00 得分 0
多些!seewell(草原之子) 捧场了。
耕耘 Delphi, 从 大三开始,但是,一直浑浑噩噩!
那时不知道看源代码,不知道Delphi有那么深奥!也许我现在所领悟的也只是沧海一粟!
但是,总觉得大家应当多些研究的精神,除了了解Delphi提供的这么多控件,怎么用以外,
也应当多花时间去了解内部的机理,看源码,看不懂再看,多问!
而不要走我的老路!!
因为一直以来我都是那么浑浑噩噩的!还以为自己是个高手!可悲!
只有学习学习再学习!
Top
18 楼Musicwind(Musicwind)回复于 2001-05-21 12:03:00 得分 0
heifei 说的对,是体现了多态,但我的本意不是如此,只是自己“领悟”一些东西,想和
大家分享。Top
19 楼windindance(风舞轻扬·白首为功名)回复于 2001-05-21 12:29:00 得分 0
晕……
写得很好,只是不太懂。:)
强烈关注!Top
20 楼weenyboy(也许是偶老婆)回复于 2001-05-21 13:08:00 得分 0
精神是可贵的,应该肯定Top
21 楼bailee(阿笨)回复于 2001-05-21 13:18:00 得分 0
看来我真是没起错名字,哎!!!
Top
22 楼TommyTong(童童--寻求兼职……)回复于 2001-05-21 13:33:00 得分 20
我不知道MusicWind谈的是否是关于类引用的问题,我好象没有见过class of class这中申明,倒见过TClass这个东西,而且类引用作的事情和你所说的类的类差不多,可以访问类的所有信息。
大家或许没有注意到,每一个类几乎都有一个类引用,比如
TObject<==>TClass
TControl<==>TControlClass
TComponent<==>TComponentClass。Top
23 楼lichp(lichp)回复于 2001-05-21 13:51:00 得分 5
小小菜鸟来凑个热闹!Top
24 楼cool_afei(天下第七之阿飞)回复于 2001-05-21 14:13:00 得分 0
Musicwind: 我现在终于知道要学到你的水平还必须假以时日,希望以后多多指教。其实何必在乎别人说三道四呢,我们真正需要象你们这样的人来指引,虽然目前连类都未搞清楚。Top
25 楼copy_paste(木石三)回复于 2001-05-21 14:17:00 得分 5
俺上回也问了个这玩意,不通不通,到了现在也是不很明白。
听你一言,它的用处好像只是在对象属性框内,那其它用处了。
http://www.csdn.net/expert/topic/103/103520.shtmTop
26 楼maozefa(阿发伯)回复于 2001-05-21 14:57:00 得分 0
类似代码在Delphi源码中经常出现,在C++中是用模板代码来处理的。搞通C++的模板编程就能理解这种代码了。
Top
27 楼wzs(兔子)回复于 2001-05-21 15:30:00 得分 0
?Top
28 楼007pro(水样天波)回复于 2001-05-21 15:44:00 得分 5
用多态思考一下,应该会简单一点
其实delphi是多么好的工具啊
vc之流只见其外,不知其中玄奇诡异,奥妙多端。
如果delphi,bcb,jb三者共用,决非M$的东西可比呀Top
29 楼Nicrosoft(奈软)回复于 2001-05-21 15:54:00 得分 5
其实,上次有个贴子“delphi的原子世界”(好像是李维的作品)就说明了“类之类”。Top
30 楼weenyboy(也许是偶老婆)回复于 2001-05-21 16:07:00 得分 20
delphi帮助里有一个很好示例,用以解释class reference
procedure TForm1.FormCreate(Sender: TObject);
type TControlClass = class of TControl;
function CreateControl(ControlClass: TControlClass;
const ControlName: string; L, T:Integer): TControl;
begin
Result := ControlClass.Create(Self);
with Result do
begin
Parent := Self;
Name := ControlName;
Left := L; Top := T;
Visible := True;
end;
end;
begin
CreateControl(TEdit,'MyEdit1',10,10);
CreateControl(TButton,'MyButton1',100,100);
end;
end.
还有一句说明
Class-reference types are useful when you want to invoke a class method or virtual constructor on a class or object whose actual type is unknown at compile time.
Top
31 楼Musicwind(Musicwind)回复于 2001-05-21 16:22:00 得分 0
weenyboy(小公子) 说到点子上了!
就是当你不知道你需要创建的类的实际类别,但是你知道是属于那个基类的,
这时,Class of ClassName 这样的声明就很有用了!
好例子!Top
32 楼Musicwind(Musicwind)回复于 2001-05-21 19:29:00 得分 0
让这篇贴子再次转悠一会儿Top
33 楼wangyagang(编程书生)回复于 2001-05-21 20:01:00 得分 0
各位高手,以后真的希望像这样的贴子能多一些,
谢谢!!!!!!!!!!!!!!!!!!!
Top
34 楼h_lj(贝塔)回复于 2001-05-21 21:02:00 得分 5
向大家推荐几本书,
Delphi4从入门到精通,电子工业出版社,Marco Cantu著.
Delphi4开发大全(上,下),人民邮电出版社,Steve Teixeira,Xavier Pancheeo著。
以上均为经典之作,虽然写的是Delphi4,但是核心是相同的。
象这个class of class问题,书上写的很详细了。建议初学者多看点书,不要一有问题就问别人,有可能的话还是自己解决好。
另外,<<windwos程序设计(第5版)>>,Microsoft Press是一本不可不看的好书,如果想用delphi抗争vc话,一定要学api。
Top
35 楼h_lj(贝塔)回复于 2001-05-21 21:03:00 得分 0
还有,Delphi5开发大全也有了。Top
36 楼BaldZhang(BaldZhang)回复于 2001-05-21 21:33:00 得分 0
关于这个类的类(class of class,也叫metaclass),李维早在5年前的一本《Delphi
高级编程指南》里面就讲过啦。那时候还是Delphi 2.0呢。。。Top
37 楼initora(冰红茶.WiKi)回复于 2001-05-21 23:13:00 得分 0
高手啊!多一些这样的帖子就好了。OO 技术中经常有这样的实作,我在广州,你在哪呢,我有很COOL的实作,你在这边就好了。Top
38 楼liuchcn(michael)回复于 2001-05-21 23:18:00 得分 0
很好!
如果用delphi还是只看到它的控件,那可能还需要一段时间去深入了解。Top
39 楼007pro(水样天波)回复于 2001-05-22 11:23:00 得分 0
可能我水平太低,不过,我觉得‘类之类‘的叫法不是很规范
基类,子类,相互继承,多态
类之类谁能解释的更清出一点吗?Top
40 楼Musicwind(Musicwind)回复于 2001-05-22 15:05:00 得分 0
那么应当是叫 类类型
Type of Class , 而不是 Class of Class
好像过于玄乎了。
其实,说真的,这些概念应当说比较粗浅的,只是,我这样的榆木脑袋
把它想复杂了。我的经验是:有些东西,理论上比较抽象的,你得去实际用一用,
这样,这些个概念在你的心理就会越来越清晰。
Top
41 楼BigBen(江南草)回复于 2001-05-22 15:20:00 得分 10
确实就是叫做“类类型”的,石油工业出版社曾经出过delphi中文版的手册(用户指导,object pascal参考,数据库应用),都是borland自己的人写/译的。
其实,类类型应当是个基本的概念了。一个类类型的变量返回一个“类”引用(reference),而一个类引用的作用我们都知道,比如类型转换(type casting)。最常见的场合是生成对象引用:
form1:=tform1.create(self);这里的tform1不就是一个类类型的变量引用吗?
Top
42 楼luoknd(飞天)回复于 2001-05-22 15:30:00 得分 0
楼上的各位仁兄:
能不能在介绍一些类似的问题讨论,吾受益非浅!!!!!
Top
43 楼Musicwind(Musicwind)回复于 2001-05-22 15:31:00 得分 0
同意楼上的。Top
44 楼007pro(水样天波)回复于 2001-05-22 15:42:00 得分 0
type就好理解多了
这样的讨论多起来,简直就是头脑风暴嘛!
Top
45 楼007pro(水样天波)回复于 2001-05-22 16:32:00 得分 0
不过这样看来,delphi的oop功力还是比c++略逊一筹啊Top
46 楼nnhg(土狗)回复于 2001-05-22 17:04:00 得分 0
真是好段。
delphi的oop功力未必比c++略逊一筹,两者的重点不同。Top
47 楼Musicwind(Musicwind)回复于 2001-05-22 20:48:00 得分 0
两位不要在此争执了,因为本贴
最初的含义只是本人觉得对于Delphi又多了些了解,
有感而发而生,绝非为了要讨论Object Pascal 和 C++的优劣。
希望各位对于Delphi有深入了解的大虾能够多来些领悟的贴子,
不要怕人笑,自己领悟了一些,发表出来,对于自己,对于旁人应该都是
有些裨益的吧。
Top
48 楼ccat(智拙)回复于 2001-05-22 21:30:00 得分 0
俺老猫是个穷鬼,没啥好谢的,请来http://www.csdn.net/expert/topic/130/130843.shtm,俺谢你些分(不是不想多给,最多就让给这些了)。Top
49 楼WuHeHai(风之影)回复于 2001-05-22 21:50:00 得分 5
不过我在《Delphi高级开发指南》中看到
type TMyRef = class of TMyClass 是叫“类引用”。
不过如何叫倒无所谓,只要知道其用途就行了。
Top
50 楼initora(冰红茶.WiKi)回复于 2001-05-22 21:59:00 得分 5
没办法,只能发了(多型创建各个企业物件):
台湾的说法: TPDClass = class of TPDObject;
-- TPDObject 物件参考,物件参考的值是物件(实例);
-- TPDClass 类别参考,类别参考的值是类别;
有个例子,可由企业物件的子类型动态载入对应记录(用于资料库记录的存取):
function GetObject (ClassType: TPDClass; var PDObject: TPDObject; const ID: TObjectID): TPDObject; // TObjectID = type Integer;
begin
if PDObject = nil then begin
PDObject = ClassType.Create;
if ID <> NullID then begin
略。。。
end;
end;
Result := PDObject;
end;
initora@163.net 欢迎探导!
Top
51 楼lg59(GO!)回复于 2001-05-22 23:09:00 得分 0
学D好长时间了,人家是大三,小弟我只是中三,没办法,喜欢这个,就不没想自己的位置,不过我觉得对这个并不怎么了解,虽然了能写出一些东东来.就如今,又有多少高手对DOS下的FDISK参数了解全呢?我不知道这条的作者本来的意图,但我很同意他自己的回话:回复人:Musicwind(风里来雨里去) (2001-5-21 11:11:00) 这一条,真的呢,在这条路上,还是多多学点好,说不定,你还在吹的高技术,刚吹完就落后呢!Top
52 楼haoxg(白日梦)回复于 2001-05-23 13:49:00 得分 0
Type of Class 是很常见的Top
53 楼jamesvon(james)回复于 2001-05-23 21:28:00 得分 0
开了半天,只是想知道Class of Class 应该用在什么场合最合适。Top
54 楼fatty(自由自在,随心所欲)回复于 2001-05-24 10:50:00 得分 0
只是一个简单的语法啊,犯得着这样大张旗鼓吗!Top
55 楼davy_david(甜瓜)回复于 2001-05-24 11:54:00 得分 0
"类的类"在OOP术语中叫做"元类".
Top
56 楼wonderxin(颜鑫的忠实崇拜者★★★★★)回复于 2001-05-24 12:08:00 得分 0
刚入门,我是来向大家求助的!还望多指教!Top
57 楼Musicwind(Musicwind)回复于 2001-05-24 12:15:00 得分 0
我是来刷新我的昵称的!Top
58 楼Musicwind(Musicwind)回复于 2001-05-24 12:16:00 得分 0
怎么还不刷新?Top
59 楼HGRhgr(HGRhgr)回复于 2001-05-24 14:41:00 得分 0
这个问题也太简单,也太常用了吧,看下面的代码
//判断MDI子窗体是否存在
function TAccessForm.IsExistForm(MDIForm:TForm;MDIChildFormName:string):boolean;
var
i:integer;
begin
Result:=False;
with MDIForm do
begin
if MDIForm.MDIChildCount > 0 then
begin
for i := MDIChildCount-1 downto 0 do
begin
if UpperCase(MDIChildren[i].Name) = UpperCase(MDIChildFormName) then
begin
Result:=True;
Break;
end;
end;
end;
end;
end;
//在指定的MDI父窗体打开MDI子窗体
procedure TAccessForm.OpenMDIChildForm(MDIForm:TForm;MDIChildFormName: string);
ResourceString
cMessage1='打开太多的窗体,请关掉不必要的窗体!';
Const
MaxCount=8;
var
FClass:TPersistentClass;
Form:TForm;
begin
with MDIForm do
begin
// 判断子窗口是否存在
if IsExistForm(MDIForm,MDIChildFormName) then
begin
Form:=TForm(Application.FindComponent(MDIChildFormName));
// Form.WindowState:= wsMaximized;
Form.Show;
Exit;
end;
if MDIChildCount > MaxCount then
begin
ShowMessage(cMessage1);
Exit;
end;
FClass := GetClass('T'+MDIChildFormName);
Form:=TFormClass(FClass).Create(Application); //创建
Form.WindowState:= wsMaximized;
Form.Show; //显示
end;
end;Top
60 楼halfdream(哈欠)回复于 2001-05-24 17:27:00 得分 0
VCL体系里面妙处很多的:)
看看源程序,不看不知道的。
Musicwind,来握个手。Top
61 楼Musicwind(Musicwind)回复于 2001-05-25 09:25:00 得分 0
哈.....欠!你好!Top
62 楼richardsong(白玉老虎---一个惊天大秘密)回复于 2001-05-25 09:41:00 得分 0
五爱是Yaya?是孟庭苇嘛?Top
63 楼Musicwind(Musicwind)回复于 2001-05-25 13:09:00 得分 0
当然不是!Top
64 楼yangming_ok(小山羊)回复于 2001-05-26 20:00:00 得分 10
这是类引用,它允许用户在运行时处理类数据类型。
下面代码能复制你点击的所有组件,甚至Form.
procedure TForm1.Click(Sender ;TObject);
var
ControlText: String;
begin
with TControlClass(Sender.ClassType).Create(self) do
begin
Parent := (sender as TControl).parent;
Left := (sender as TControl).Left;
Top := (sender as TControl).Top;
SetLength(ControlText,50);
(sender as TControl).GetTextBuf(pchar(ControlText),50);
ControlText := pchar(ControlText) + ' *';
SetTextBuf(pchar(ControlText));
end;
end;
Sender.ClassType 得到你点击组件的类类型(TClass型)
TControlClass(Sender.ClassType).Create(self)把TClass型转换成TControlClass型,并建立一对象。
Top
65 楼nagar()回复于 2001-05-27 10:07:00 得分 0
好,好,好!
这个贴子 很好!
在技术上,不敢评论,但至少不是那些 C好 pascal好的 无谓争论.
如果CSDN中多一些技术的讨论,少一些偏激的言行,会更吸引人!
Top
66 楼yangming_ok(小山羊)回复于 2001-05-27 10:49:00 得分 0
怎么没人给我分啊!!Top
67 楼yangming_ok(小山羊)回复于 2001-05-27 10:49:00 得分 0
怎么没人给我分啊!!Top
68 楼GoodHope(好望角)回复于 2001-05-27 13:39:00 得分 0
这段代码有什么问题吗?怎么看起来类似ToolsAPI里面的东西?Top
69 楼likegigi(李柯)回复于 2001-05-27 14:07:00 得分 0
45Top
70 楼bushman(bushman)回复于 2001-05-27 17:36:00 得分 0
This is a Object Pascal language feature called -- RTTI(RunTime Type Infomation).
Following refers to Delphi help
--------------------------------------------------------------------------
Class-reference types are useful when you want to invoke a class method or virtual constructor on a class or object whose actual type is unknown at compile time.
Top
71 楼kabob(kk.Chen)回复于 2001-05-28 02:39:00 得分 0
俺喜欢这类贴子
Musicwind(吾爱是Yaya!)好兄弟,有东西能与大家分享Top
72 楼Musicwind(Musicwind)回复于 2001-05-28 16:49:00 得分 0
yangming_ok(小山羊)写得好。
这个论题的讨论就到这里吧,谢谢大家的参与。
给分。
Top
73 楼zzy1012(冬瓜)回复于 2001-05-28 17:04:00 得分 0
74 楼zzy1012(冬瓜)回复于 2001-05-28 17:08:00 得分 0
GuanZhuTop
75 楼cyj(SQL PYJ)回复于 2001-05-31 06:59:00 得分 0
好好,为什么我每次都迟到呢每天过的是匆匆忙生怕多丢了网费,哎呀可悲可悲!!!!!!!Top
76 楼cyj(SQL PYJ)回复于 2001-05-31 07:11:00 得分 0
我也经常看一看源程序但我怎么没有看到注册的语句呢(指DELPHI组件的源程序) Top




