主讲:A1(老吴)
时间:2004-10-22 15:00
主题:
0>一点点编译。
1>解决DLL与EXE沟通时String和其它Memory的问题.
2>公布hmOlevariants.pas
3>成批的偷别人的音乐文件
4>讨论使用结构好还是类好
5>讨论对象,指针,VMT
2004-10-22 14:56:20 A1.Aleyn.wu(45198124)
开始上课了。
2004-10-22 14:57:27 A1.Aleyn.wu(45198124)
第一个诺言:解决DLL与EXE沟通时String和其它Memory的问题.
2004-10-22 14:58:22 A1.Aleyn.wu(45198124)
先提问,有几个已经解决了这个问题或间接解决问题了?
2004-10-22 14:58:44 /:>D10.天地弦(185511468)
用WideString是不是可以解决?
2004-10-22 14:58:56 D3天之痕若虹(86278566)
我一般用PChar来传
2004-10-22 14:59:07 C4.llyygg(13029886)
用Variant来解决的:)
2004-10-22 14:59:08 A1.Aleyn.wu(45198124)
可以,转换类型是间接的方法。
2004-10-22 14:59:52 A1.Aleyn.wu(45198124)
除了这样,大家还有什么方式?
2004-10-22 15:00:01 D3天之痕若虹(86278566)
用Strings是
DLL和Exe都要 Use sharemem
2004-10-22 15:00:37 A1.Aleyn.wu(45198124)
用ShareMem也可以,但需要BorlandMM.dll
2004-10-22 15:01:18 A1.Aleyn.wu(45198124)
给我5分钟时间,我写一个DEMO给大家。
2004-10-22 15:11:10 TCP/IP INFO(31329846)
条件编译 讲过没有
2004-10-22 15:11:24 /:>D10.天地弦(185511468)
讲了一下
2004-10-22 15:11:40 TCP/IP INFO(31329846)
我的客户端用条件编译的,中间层才用DLL。
2004-10-22 15:12:07 /:>D10.天地弦(185511468)
有什么用?TCP
2004-10-22 15:12:35 TCP/IP INFO(31329846)
我的客户端用条件编译的,咋个 条件编译,运行时编译?
2004-10-22 15:13:17 /:>D10.天地弦(185511468)
条件编译是在编译时吧
2004-10-22 15:13:34 TCP/IP INFO(31329846)
还是
{$define s}
{$ifdef s}
{$endif}
2004-10-22 15:13:47 胡箩卜(58061178)
预编译和条件编译
2004-10-22 15:14:02 TCP/IP INFO(31329846)
还是 每次 都 用Delphi 去编译?条件编译?
2004-10-22 15:14:34 TCP/IP INFO(31329846)
预编译和条件编译,区别?
2004-10-22 15:14:50 /:>D10.天地弦(185511468)
条件编译我也不太懂
2004-10-22 15:15:05 TCP/IP INFO(31329846)
预编译和条件编译,区别?
2004-10-22 15:15:14 来吧!朋友(264123192)
{$define s}
后面的s是什么定义的,有点不明白?是变量还是表达式,还是其它什么的?
2004-10-22 15:15:41 来吧!朋友(264123192)
{$ifdef s}
错了
是这个
2004-10-22 15:16:30 TCP/IP INFO(31329846)
如果 定义了 S 就编译 下面的部分
2004-10-22 15:17:04 e路有你(2837760)
哦,明白了,这就是条件编译呀
2004-10-22 15:17:18 hotdog(278136300)
{}
是必须的么 (当然 add by D10)
2004-10-22 15:18:07 胡箩卜(58061178)
# ifdef COMPUTER_A
# define INTEGER_SIZE 16
# else
# define INTEGER_SIZE 32
# endif
即如果COMPUTER_A在前面已被定义过,则编译下面的命令行:# define INTEGER_SIZE 16
否则,编译下面的命令行:# define INTEGER_SIZE 32
2004-10-22 15:18:12 hotdog(278136300)
{$ifdef s}中s不固定类型么
2004-10-22 15:18:37 TCP/IP INFO(31329846)
一个 标识 而已
2004-10-22 15:19:00 黑了又黑(231582042)
{$R *.res} 那这个R 也是吗
2004-10-22 15:19:07 e路有你(2837760)
不是吧
2004-10-22 15:19:08 来吧!朋友(264123192)
{$IFENDF MSWINDOWS}
.....
{$ENDIF}
MSWINDOWS 这个在那里定义的?
2004-10-22 15:19:43 hotdog(278136300)
这个实体取得系统的么
2004-10-22 15:20:42 来吧!朋友(264123192)
在我调用DLL的时候
我这样写
{$IFENDF DLL1}
.....
{$ENDIF}
{$IFENDF DLL2}
.....
{$ENDIF}
我的DLL1,DLL2并没有定义呀
他为什么可以正确的执行?
2004-10-22 15:21:05 hotdog(278136300)
mswindows是系统定义的么
2004-10-22 15:21:50 来吧!朋友(264123192)
那位高手帮解说一下[?]
2004-10-22 15:22:17 /:>D10.天地弦(185511468)
{$IFENDF DLL1}
.....
{$ENDIF}
{$IFENDF DLL2}
.....
{$ENDIF}
2004-10-22 15:22:36 /:>D10.天地弦(185511468)
这个DLL1在其它的unit定义的好像不行是不是
2004-10-22 15:23:00 /:>D10.天地弦(185511468)
我试了好像不行
2004-10-22 15:23:15 TCP/IP INFO(31329846)
不行
2004-10-22 15:23:51 /:>D10.天地弦(185511468)
在project->option的Directoris/Condition页里的Conditionals defines里可以预定义
这样在整个工程就好像已经定义了。
sample:
$DEFINE DK_HRM(在Conditionals defines填入)
{$IFENDF DK_HRM}
..... //这里的代码,编译器就行编译
{$ENDIF}
2004-10-22 15:26:32 来吧!朋友(264123192)
{$IFNDEF PENNIESLIB}
function PenniesToCoins(TotPennies : Word;CoinsRec:PCoinsRec):Word;stdcall;
{$ENDIF}
{$IFNDEF PENNIESLIB}
function PenniesToCoins;external 'PENNIESLIB.DLL' name 'PenniesToCoins';
{$ENDIF}
{$IFNDEF PROJECT1}
function frm_obj(com :TApplication):TForm ;stdcall;
function frm_2(com :TApplication):TForm ;stdcall;
{$ENDIF}
{$IFNDEF PROJECT1}
function frm_obj;external 'PROJECT1.DLL' name 'frm_obj';
function frm_2;external 'PROJECT1.DLL' name 'frm_2';
{$ENDIF}
2004-10-22 15:27:06 来吧!朋友(264123192)
这是我在一个单元里定义的两个DLL入口处
2004-10-22 15:27:50 TCP/IP INFO(31329846)
能不能 在一处 $DEFINE ,就使得其他单元 都 定义
2004-10-22 15:28:10 来吧!朋友(264123192)
他没有错
是对的
但是我有点不明白的是PENNIESLIB,PROJECT1它是怎么知道的?没有定义
这两个是我的DLL文件
2004-10-22 15:28:39 hotdog(278136300)
{$IFNDEF PENNIESLIB}
function PenniesToCoins(TotPennies : Word;CoinsRec:PCoinsRec):Word;stdcall;
{$ENDIF}
{$IFNDEF PENNIESLIB}
function PenniesToCoins;external 'PENNIESLIB.DLL' name 'PenniesToCoins';
{$ENDIF}
这是另一个完整的引用么
//----------------------------------------------------------
2004-10-22 15:29:36 A1.Aleyn.wu(45198124)
好了,可以了。
2004-10-22 15:29:44 A1.Aleyn.wu(45198124)
正在上传资料。
2004-10-22 15:30:18 B1.斜阳(249208513)
千呼万唤啊
2004-10-22 15:31:36 TCP/IP INFO(31329846)
http://www.e-midas.cn/test/test.rar
2004-10-22 15:32:56 A1.Aleyn.wu(45198124)
这是个演示程序,源程序稍候传上。
2004-10-22 15:33:27 A1.Aleyn.wu(45198124)
请大家打开程序,我来说明原因。
2004-10-22 15:34:06 A1.Aleyn.wu(45198124)
打开了么,讲完一个程序,你看源代码就容易看了。
2004-10-22 15:34:34 A1.Aleyn.wu(45198124)
先打开,按我的做。
2004-10-22 15:35:12 A1.Aleyn.wu(45198124)
(1),先不打钗,点左边三个按钮。
2004-10-22 15:35:57 A1.Aleyn.wu(45198124)
我们给按钮编号吧。
2004-10-22 15:36:34 A1.Aleyn.wu(45198124)
左边第一行和第二行是不是都有错。
2004-10-22 15:36:49 A1.Aleyn.wu(45198124)
第三行没错,对不?
2004-10-22 15:37:00 TCP/IP INFO(31329846)
对
2004-10-22 15:37:16 A1.Aleyn.wu(45198124)
好,第二步。不打钗,点右边三个。
2004-10-22 15:37:38 A1.Aleyn.wu(45198124)
几错几对?
2004-10-22 15:37:39 Hiwe(56682960)
第一个有错
2004-10-22 15:37:40 B6(43225570)
只有中间的那个有错
2004-10-22 15:37:45 /:>D10.天地弦(185511468)
中间
2004-10-22 15:37:47 A1.Aleyn.wu(45198124)
几错几对?
2004-10-22 15:37:55 B6(43225570)
1,2
2004-10-22 15:38:12 A1.Aleyn.wu(45198124)
应该只有中间的那个有错
2004-10-22 15:38:41 A1.Aleyn.wu(45198124)
这时,第三步,打钗,点左边三个。
2004-10-22 15:39:02 A1.Aleyn.wu(45198124)
应该是全对。
2004-10-22 15:39:14 A1.Aleyn.wu(45198124)
第四步,打钗,点右边三个。
2004-10-22 15:39:27 B6(43225570)
全对
2004-10-22 15:39:48 A1.Aleyn.wu(45198124)
对,我上传源代码。
2004-10-22 15:40:00 hotdog(278136300)
这里面全部采用的预编以么
2004-10-22 15:40:49 D3天之痕若虹(86278566)
还没下载完。。。
2004-10-22 15:41:05 A1.Aleyn.wu(45198124)
http://www.e-midas.cn/test/testmm.rar
2004-10-22 15:41:07 /:>D10.天地弦(185511468)
晕,现在不是说预编译了
2004-10-22 15:41:11 A1.Aleyn.wu(45198124)
这是源代码。
2004-10-22 15:42:40 A1.Aleyn.wu(45198124)
都打项目包。
2004-10-22 15:42:56 A1.Aleyn.wu(45198124)
先看DLL。
2004-10-22 15:44:07 A1.Aleyn.wu(45198124)
看看BackupMM,RestoreMM,SetNewMM
[Code]
var
OldMger: TMemoryManager;
procedure BackupMM; stdcall;
begin
GetMemoryManager(OldMger);
end;
procedure RestoreMM; stdcall;
begin
SetMemoryManager(OldMger);
end;
procedure SetNewMM(const mger: TMemoryManager); stdcall;
begin
SetMemoryManager(mger);
end;
[/Code]
2004-10-22 15:44:16 A1.Aleyn.wu(45198124)
是不是很简单。
2004-10-22 15:44:41 A1.Aleyn.wu(45198124)
实际是,就是利用Borland的内存管理器。
2004-10-22 15:46:09 A1.Aleyn.wu(45198124)
除了对象不能用此方法,其它都可以用此方法。
2004-10-22 15:47:04 /:>D10.天地弦(185511468)
将DLL和EXE共享内存管理器
2004-10-22 15:47:13 A1.Aleyn.wu(45198124)
Right,正解!
2004-10-22 15:48:24 A1.Aleyn.wu(45198124)
还有更多的知识,慢慢来。。。。。
2004-10-22 15:49:22 A3.武稀松(42088303)
其实我觉得共享内存管理器还是带RTL和VCL的运行包来的爽快
2004-10-22 15:49:49 /:>D10.天地弦(185511468)
3哥,那样发布麻烦一点
2004-10-22 15:49:51 A1.Aleyn.wu(45198124)
to A3,道理是一样的,你看看机制就知道了。
2004-10-22 15:49:58 A1.Aleyn.wu(45198124)
包的机制。
2004-10-22 15:50:01 A3.武稀松(42088303)
我知道道理是一样的
2004-10-22 15:50:12 /:>D10.天地弦(185511468)
包机制在哪里看
2004-10-22 15:50:43 A3.武稀松(42088303)
Share不过是借管了MemoryManager而已。还不如用直接用包。
2004-10-22 15:51:25 A3.武稀松(42088303)
用包的话对象也不会用问题
2004-10-22 15:51:31 A1.Aleyn.wu(45198124)
晕,能捉到老鼠,什么方便就用什么。
2004-10-22 15:51:51 A1.Aleyn.wu(45198124)
也不可能写个小工具也用包吧。
2004-10-22 15:52:24 A3.武稀松(42088303)
使用包的话因为EXE和DLL共享包中的System单元。最起码所有TObject指针都是一个可以用Is As 操作符
2004-10-22 15:52:33 A1.Aleyn.wu(45198124)
我不反对用包,这里只是介绍一种知识而已。
2004-10-22 15:53:05 A3.武稀松(42088303)
我明白老大只是介绍一种知识。我也只是说有另一种的方式
2004-10-22 15:53:29 A1.Aleyn.wu(45198124)
还有,大家看看TestGlobalAlloc(),之前有讲过。
2004-10-22 15:54:12 A1.Aleyn.wu(45198124)
这个跟Borland的内存管理无关,所以,内存管理对它不影响。
2004-10-22 15:54:41 /:>D10.天地弦(185511468)
TestGlobalAlloc是龙卡?
2004-10-22 15:55:06 A1.Aleyn.wu(45198124)
牡丹卡。 (查看主题:内存的管理 DATE:2004-09-17 关于各种卡)
2004-10-22 15:55:24 A3.武稀松(42088303)
其实除了API以外不管哪种卡最后都是调用的GetMem转而变成_GetMem
2004-10-22 15:58:06 /:>D10.天地弦(185511468)
我的卡又忘记了。等一下要复习一下了
2004-10-22 15:58:15 B6(43225570)
GlobalAlloc是什么?
2004-10-22 15:58:42 /:>D10.天地弦(185511468)
分配内存吧
2004-10-22 16:08:23 A1.Aleyn.wu(45198124)
继续第二个诺言。
2004-10-22 16:09:26 A1.Aleyn.wu(45198124)
第二个诺言是一个源码。
2004-10-22 16:09:44 /:>D10.天地弦(185511468)
hmOleVariants?
2004-10-22 16:10:08 A1.Aleyn.wu(45198124)
/Vip/hmOleVariant.pas
2004-10-22 16:10:24 A1.Aleyn.wu(45198124)
快下载,5分钟后删除。
2004-10-22 16:10:57 Satellite(38330148)
谁知道其他什么都是通的就是网页打不开是什么原因??
2004-10-22 16:11:01 B1.斜阳(249208513)
呵呵,限时抢购啊!
2004-10-22 16:11:29 A1.Aleyn.wu(45198124)
都下载了么?
2004-10-22 16:12:51 A1.Aleyn.wu(45198124)
大家可以看一看,我是如何生成三层的参数的。
2004-10-22 16:13:23 B6(43225570)
老大,那么多的函数都实现了?
2004-10-22 16:13:36 A1.Aleyn.wu(45198124)
什么函数?
2004-10-22 16:14:22 B6(43225570)
接口和实现接口的类中定义的啊
2004-10-22 16:14:58 A1.Aleyn.wu(45198124)
这个源码就不多说了,我现在删除了,继续第三个诺言。
2004-10-22 16:15:28 B6(43225570)
对了,那把它给大家的目的就只是看,也不给讲的么?
2004-10-22 16:15:54 A1.Aleyn.wu(45198124)
在讲三层的时候已经有讲过它了,所以这里就不多说了。
2004-10-22 16:16:01 /:>D10.天地弦(185511468)
TCP和我们那个不一样
2004-10-22 16:16:25 TCP/IP INFO(31329846)
差多了,呵呵
2004-10-22 16:16:38 /:>D10.天地弦(185511468)
等下仔细看
2004-10-22 16:18:00 A1.Aleyn.wu(45198124)
第三个诺言:成批的偷别人的音乐文件。
2004-10-22 16:18:06 D3天之痕若虹(86278566)
呵,与次上说的
TCollectItem和TCollect的实现过程有些像
2004-10-22 16:18:36 A1.Aleyn.wu(45198124)
大家都在用什么下载软件?
2004-10-22 16:18:50 HUI云中鹤(20695124)
网络快车
2004-10-22 16:18:52 TCP/IP INFO(31329846)
FlashGet
2004-10-22 16:18:53 B6(43225570)
JETCAR
2004-10-22 16:18:56 C4.llyygg(13029886)
FlashGet
2004-10-22 16:19:33 A1.Aleyn.wu(45198124)
好,多数人都用FlashGet,这次讲的,就是FlashGet.
2004-10-22 16:20:14 A1.Aleyn.wu(45198124)
大家都知识,FlashGet是用数据库来存取它的下载内容的,对不?
2004-10-22 16:20:30 C4.llyygg(13029886)
是的
2004-10-22 16:20:46 /:>D10.天地弦(185511468)
下载的内容?
2004-10-22 16:20:46 A3.武稀松(42088303)
数据库???
2004-10-22 16:20:51 /:>D10.天地弦(185511468)
你说下载列表?
2004-10-22 16:20:59 A1.Aleyn.wu(45198124)
对,就是下载列表。
2004-10-22 16:21:19 D3天之痕若虹(86278566)
是说下载列表保存在和个 自定义格式的数据库
2004-10-22 16:21:24 A1.Aleyn.wu(45198124)
对。
2004-10-22 16:21:43 D3天之痕若虹(86278566)
这个数据库,一样可以使用ADO相关?
2004-10-22 16:21:53 A1.Aleyn.wu(45198124)
所以,我们最主要的就是如何跟据我们的需要生成下载列表。
2004-10-22 16:22:51 A1.Aleyn.wu(45198124)
建一个新的下载列表,用UltraEdit来看看,你就会发现一些规则。
2004-10-22 16:23:26 B6(43225570)
是些汇编内容么?
2004-10-22 16:23:29 A1.Aleyn.wu(45198124)
再在下载列表中增加一些下载文件,就会看到新增了数据,但规则是差不多的。
2004-10-22 16:23:42 D3天之痕若虹(86278566)
mirrors.lst??这文件?
2004-10-22 16:24:14 A1.Aleyn.wu(45198124)
不是。是*.jcd
2004-10-22 16:26:13 A1.Aleyn.wu(45198124)
然后,有几个音乐网站的下载地址多数是:
http://xxx.xxx/xxx/0001/1.wmv
2004-10-22 16:27:03 A1.Aleyn.wu(45198124)
你只是跟据你的需要,生成前面的0001~9999和后面的1~20就可以了。
2004-10-22 16:27:11 A1.Aleyn.wu(45198124)
生成后,你就去下吧。
2004-10-22 16:27:58 A1.Aleyn.wu(45198124)
好了,今天的课到此为止,Class over.
2004-10-22 16:28:28 A1.Aleyn.wu(45198124)
有下载地址,JCD的结构我也在研究中。
2004-10-22 16:28:54 A1.Aleyn.wu(45198124)
目前,我已经下载了0000~0040了。
2004-10-22 16:29:17 A1.Aleyn.wu(45198124)
共 40*10 = 400个wmv左右。
2004-10-22 16:30:22 B1.斜阳(249208513)
图片的名字才多上0001什么的,歌曲的名字多数是用拼音字母什么的
2004-10-22 16:30:30 HUI云中鹤(20695124)
老大的网站上放些音乐,我们去听听
2004-10-22 16:33:07 B1.斜阳(249208513)
有个问题一直犹豫不决,不知道大家有没有好的办法
2004-10-22 16:33:22 B1.斜阳(249208513)
就拿A1刚刚公布的单元来说吧
2004-10-22 16:33:43 B1.斜阳(249208513)
像这样的数据结构
POleVariantField = ^TOleVariantField;
TOleVariantField = record
FieldName: string[20];
Value: OleVariant;
end;
POvfa = ^AOleVariantField;
AOleVariantField = array of OleVariant;
2004-10-22 16:34:17 B1.斜阳(249208513)
其实作为一个TOleVariantField来说,是应该作成一个类还是简单封装成一个数据结构呢
2004-10-22 16:34:56 C4.llyygg(13029886)
我觉得是数据结构,他本身就只是存数据的嘛:)
2004-10-22 16:34:58 A1.Aleyn.wu(45198124)
这个想法我也有考虑过一些时间。
2004-10-22 16:35:11 A1.Aleyn.wu(45198124)
后来有做了实验。
2004-10-22 16:35:20 B1.斜阳(249208513)
如果作成一个数据结构,那么对于类似FieldValue什么的取值的方法就需要别的类去代替这个数据结构来完成
2004-10-22 16:35:44 A1.Aleyn.wu(45198124)
类的内存耗太大了。所以用结构好一些。
2004-10-22 16:36:41 B1.斜阳(249208513)
还有,对于FindField这样的工作,本来应该是这个数据结构自身的功能,如果单纯用一个记录类型,那么这些工作就需要别的类来帮助他完成
2004-10-22 16:37:43 B1.斜阳(249208513)
有的时候,类似这样的问题会碰到好多,是用记录类型还是用类,往往犹豫不决
2004-10-22 16:37:52 C4.llyygg(13029886)
还有,对于FindField这样的工作,本来应该是这个数据结构自身的功能,如果单纯用一个记录类型,那么这些工作就需要别的类来帮助他完成
--不会吧,自己可以找到别的类?
2004-10-22 16:38:16 A1.Aleyn.wu(45198124)
如果不考虑速度和内存,就用类,否则用结构。
2004-10-22 16:38:57 B1.斜阳(249208513)
如果你某个类包含了这样的数据结构,那么你这个类就要去完成这些工作,不是这样吗 C4?
2004-10-22 16:39:17 C4.llyygg(13029886)
是的,
2004-10-22 16:39:51 /:>D10.天地弦(185511468)
B1这个问题可以结束了
2004-10-22 16:39:52 /:>D10.天地弦(185511468)
45198124(A1.Aleyn.wu) 16:38:16
如果不考虑速度和内存,就用类,否则用结构。
2004-10-22 16:39:54 B1.斜阳(249208513)
速度问题可能不会有太多的损耗,主要是内存开销
2004-10-22 16:40:19 C4.llyygg(13029886)
但是一个类本身就是包含数据的处理嘛, 最小的类也有数据的,如果这样下去就没有数据,只有类?晕了
2004-10-22 16:40:45 B1.斜阳(249208513)
Java不就是这么个概念
2004-10-22 16:40:46 A1.Aleyn.wu(45198124)
呵呵,你试一下,建立1K个这样的类和结构,比较一下。
2004-10-22 16:41:40 B1.斜阳(249208513)
不知道大家在这个问题上如何处理?
2004-10-22 16:41:54 A3.武稀松(42088303)
Java只能用类了
2004-10-22 16:42:28 B1.斜阳(249208513)
如果按照面向对象的思想,应该抽象成类,但是偏偏Delphi又给大家提供了这么好的东西,可以让我们作成一个记录类型[:D]
2004-10-22 16:42:30 C4.llyygg(13029886)
其实我主要是不明白,如果数据结构改成类的话, 把一个类看成一个节点, FindField怎么能够完成找到其他类啊?.
2004-10-22 16:42:53 A3.武稀松(42088303)
类如果没有VMT和结构区别不大。
2004-10-22 16:43:11 B1.斜阳(249208513)
有Field类,就应该有Fields类
2004-10-22 16:43:17 A1.Aleyn.wu(45198124)
赞成A3
2004-10-22 16:43:32 A1.Aleyn.wu(45198124)
VMT开消大。
2004-10-22 16:43:55 B1.斜阳(249208513)
VMT也是一个类只有一份而已啊
2004-10-22 16:43:56 /:>D10.天地弦(185511468)
A3你说InsideVCL上说VMT有错是不是
2004-10-22 16:44:08 A3.武稀松(42088303)
我觉得是有错
2004-10-22 16:44:18 /:>D10.天地弦(185511468)
错在哪里
2004-10-22 16:44:34 /:>D10.天地弦(185511468)
是不是只有前面几章讲了VMT
2004-10-22 16:46:13 A3.武稀松(42088303)
他认为每个对象有一个虚方法表。我觉得应该是一个虚方法表的指针。因该每个类有一个虚方法表吧
2004-10-22 16:50:38 D3天之痕若虹(86278566)
<<InsideVCL>>没去看过,不知到里讲了什么
2004-10-22 16:51:21 /:>D10.天地弦(185511468)
认为是一个类是一个虚方法表是吧
2004-10-22 16:51:35 /:>D10.天地弦(185511468)
对象有一个指针
2004-10-22 16:53:09 A3.武稀松(42088303)
类是一个指针
2004-10-22 16:54:06 /:>D10.天地弦(185511468)
一个类对应一个VMT?
2004-10-22 16:54:30 /:>D10.天地弦(185511468)
一个对象没有对应一个VMT?
2004-10-22 16:54:38 /:>D10.天地弦(185511468)
3哥是不是这样
2004-10-22 16:54:48 A3.武稀松(42088303)
反正我觉得VMT应该是属于类的而不是对象的。对象只有一个指向VMT的指针而已
2004-10-22 16:55:12 /:>D10.天地弦(185511468)
明你的意思
2004-10-22 16:55:25 /:>D10.天地弦(185511468)
不知道现在新版有没有改过来
2004-10-22 16:55:36 A3.武稀松(42088303)
我不敢肯定是不是错误喔
2004-10-22 16:55:50 /:>D10.天地弦(185511468)
我好像没有看到他说一个对象对应一个VMT呢
2004-10-22 16:56:07 /:>D10.天地弦(185511468)
哦,我今天晚上再去翻下
2004-10-22 16:56:52 A3.武稀松(42088303)
我以前曾经想设计一个面向对象的PASCAL的编译器。所以思考过这个实现问题。我觉得这样才是合理的。反正也许Borland的设计人员和我想的不一样
2004-10-22 16:57:18 /:>D10.天地弦(185511468)
[strong],牛了!
2004-10-22 16:57:38 /:>D10.天地弦(185511468)
应该是这样的
2004-10-22 16:57:38 A3.武稀松(42088303)
别夸奖了。没设计出来。
2004-10-22 16:58:03 A3.武稀松(42088303)
不过因为这个我思考了好些东西。学习了好些知识
2004-10-22 17:01:01 B1.斜阳(249208513)
var
pp1, pp2: Pointer;
begin
pp1 := Pointer(Button1);
pp2 := Pointer(Button2);
Memo1.Lines.Add(IntToStr(Integer(pp1)));
Memo1.Lines.Add(IntToStr(Integer(pp2)));
pp1 := Pointer(pp1^);
pp2 := Pointer(pp2^);
Memo1.Lines.Add(IntToStr(Integer(pp1)));
Memo1.Lines.Add(IntToStr(Integer(pp2)));
A3 这段代码就能验证你的想法是对的
2004-10-22 17:01:38 B1.斜阳(249208513)
在窗体上放两个Button再放一个Memo
2004-10-22 17:02:43 B1.斜阳(249208513)
第一次取的是各自的self的内容,第二次取的是各自self所指向的地方,呵呵,是一个地方
2004-10-22 17:03:45 /:>D10.天地弦(185511468)
你们都很牛,哎!
我指针都用得很少。始终成不了高手
2004-10-22 17:04:42 A3.武稀松(42088303)
做应用高手
2004-10-22 17:05:21 /:>D10.天地弦(185511468)
呵呵
2004-10-22 17:05:33 D3天之痕若虹(86278566)
pp1 := Pointer(pp1^);
pp2 := Pointer(pp2^);
指向同个地方? 为什么
2004-10-22 17:06:12 B1.斜阳(249208513)
指向了类
2004-10-22 17:06:13 A3.武稀松(42088303)
我虽然认为编译器应该是这样设计的。但是一直没验证过。
谢谢B1
2004-10-22 17:07:17 /:>D10.天地弦(185511468)
var
pp1, pp2, pp3, pp4: Pointer;
begin
pp1 := Pointer(Button1);
pp2 := Pointer(Button2);
Memo1.Lines.Add(IntToStr(Integer(pp1)));
Memo1.Lines.Add(IntToStr(Integer(pp2)));
pp3 := Pointer(pp1^);
pp4 := Pointer(pp2^);
Memo1.Lines.Add(IntToStr(Integer(pp3)));
Memo1.Lines.Add(IntToStr(Integer(pp4)));
2004-10-22 17:07:34 B1.斜阳(249208513)
其实,如果顺着这个地址,按照一定的偏移量,你就可以找到类相关类方法,然后就可以通过指针调用这些类方法,不过这样比较危险噢
2004-10-22 17:08:21 /:>D10.天地弦(185511468)
pp1 := Pointer(Button1);
pp2 := Pointer(Button2);
和
pp1 := @Button1;
pp2 := @Button2;
2004-10-22 17:09:19 B1.斜阳(249208513)
你看看你取道的内容都是什么,你就清楚了,一个指针就是一个整型数
2004-10-22 17:09:56 /:>D10.天地弦(185511468)
@是取地址
2004-10-22 17:10:46 A3.武稀松(42088303)
pp1 := @Button1;是Button这个类的地址。因为类是指针。就是指真的地址。就是说PP1是指针的指针
2004-10-22 17:11:01 A3.武稀松(42088303)
pp1 := @Button1;是Button这个变量的地址。因为类是指针。就是指真的地址。就是说PP1是指针的指针
2004-10-22 17:11:34 /:>D10.天地弦(185511468)
哦
2004-10-22 17:11:43 /:>D10.天地弦(185511468)
明了一点
2004-10-22 17:11:50 B1.斜阳(249208513)
A3 第二遍还是有错误,再来一遍[:D]
2004-10-22 17:11:50 A3.武稀松(42088303)
pp1 := Pointer(Button1);
PP1和Button1指向同一个地址
2004-10-22 17:12:04 /:>D10.天地弦(185511468)
@Button1 是Button1这个变量的地址?
2004-10-22 17:12:26 A3.武稀松(42088303)
B1把类字都替换成变量就行了
2004-10-22 17:12:58 /:>D10.天地弦(185511468)
pp1 := @Button1;是Button这个变量的地址。因为变量是指针。就是指真的地址。就是说PP1是指针的指针 ?
2004-10-22 17:13:05 /:>D10.天地弦(185511468)
A3是不是这样?
2004-10-22 17:13:14 /:>D10.天地弦(185511468)
因为变量是指针?
2004-10-22 17:13:22 /:>D10.天地弦(185511468)
因为变量是对象
2004-10-22 17:13:23 A3.武稀松(42088303)
pp1 := @Button1;是Button这个变量的地址。因为类类型变量是指针。就是指针的地址。就是说PP1是指针的指针 ?
2004-10-22 17:13:39 /:>D10.天地弦(185511468)
嗯,对了
2004-10-22 17:14:12 A3.武稀松(42088303)
Button1是类类型变量不是真正的内存对象,这个指针指向的是真正的对象
2004-10-22 17:14:47 B1.斜阳(249208513)
var
m: Integer
pi: ^Integer;
pp: Pointer;
begin
m := 10;
pi := @m;
pp := Pointer(pi);
end;
2004-10-22 17:14:49 /:>D10.天地弦(185511468)
Button1是类类型变量(不能说是对象么)
2004-10-22 17:15:47 A3.武稀松(42088303)
其实Button1^才是对象不过编译器把^给省略了
2004-10-22 17:16:16 B1.斜阳(249208513)
Button1-->|-------|
| 对象 |
|_______|
2004-10-22 17:16:24 B1.斜阳(249208513)
形象吧[:D]
2004-10-22 17:17:43 A3.武稀松(42088303)
Button1是类类型变量是我给起的名字。我觉得这样才准确
2004-10-22 17:18:18 /:>D10.天地弦(185511468)
var
Form1: TForm1;
2004-10-22 17:18:31 /:>D10.天地弦(185511468)
3哥,这个Form1也是类类型变量了
2004-10-22 17:18:32 B1.斜阳(249208513)
这个类类型,容易引起混淆
2004-10-22 17:18:47 A3.武稀松(42088303)
Yes
2004-10-22 17:19:03 A3.武稀松(42088303)
那B1你说什么名字比较贴切
2004-10-22 17:19:25 B1.斜阳(249208513)
确切说
type
TButtonClass = TButton
TButtonClass才叫类类型
2004-10-22 17:19:45 B1.斜阳(249208513)
我也没想好该怎么说
2004-10-22 17:20:24 A3.武稀松(42088303)
我们给Borland规范一下名词
2004-10-22 17:20:27 B1.斜阳(249208513)
如果非要区分,现在我只是用"指向对象实例的指针"
2004-10-22 17:20:47 B1.斜阳(249208513)
不过这个也不太好听,并且太长
2004-10-22 17:21:25 A3.武稀松(42088303)
对象指针,类类型变量 我觉得都行
2004-10-22 17:22:04 /:>D10.天地弦(185511468)
Class-reference types中文怎么样
2004-10-22 17:22:07 /:>D10.天地弦(185511468)
怎么说
类引用类型?
2004-10-22 17:22:37 B1.斜阳(249208513)
这是Delphi好的地方,也是我觉得他比较别扭的地方,所谓名不正就言不顺,就是这个了
2004-10-22 17:23:05 /:>D10.天地弦(185511468)
就是哪个了,B1
2004-10-22 17:23:18 A3.武稀松(42088303)
但是现在这个方式比较流行了。Java,C #都这样搞
2004-10-22 17:23:25 B1.斜阳(249208513)
本来是个指针,却不遵循自己定义的使用指针的约定,整的大家直迷糊
2004-10-22 17:23:52 A3.武稀松(42088303)
这个是趋势
2004-10-22 17:23:59 /:>D10.天地弦(185511468)
249208513(B1.斜阳) 17:19:25
确切说
type
TButtonClass = TButton
TButtonClass才叫类类型
2004-10-22 17:24:34 B1.斜阳(249208513)
D10:就是
var
Button1: TButton;
这个Button1就比较别扭,不过还是顺应潮流吧
2004-10-22 17:24:35 /:>D10.天地弦(185511468)
TComponentClass = class of TComponent;
2004-10-22 17:24:49 /:>D10.天地弦(185511468)
哦
2004-10-22 17:25:09 /:>D10.天地弦(185511468)
TButtonClass = TButton
TComponentClass = class of TComponent;
这两种是什么意思
2004-10-22 17:25:13 B1.斜阳(249208513)
噢,对对,我写错了,呵呵今天不适合编程序
2004-10-22 17:25:28 /:>D10.天地弦(185511468)
B1是你写错了?
2004-10-22 17:25:40 /:>D10.天地弦(185511468)
TButtonClass = TButton没有这种写法是吧
2004-10-22 17:26:06 B1.斜阳(249208513)
这种写法就是给他起个别名了,还是个不合格的别名[:D]
2004-10-22 17:27:07 /:>D10.天地弦(185511468)
TButtonClass = TButton;A3教过我
2004-10-22 17:27:24 /:>D10.天地弦(185511468)
是TButton类的一个别名是吧
2004-10-22 17:27:33 B1.斜阳(249208513)
是的是的
2004-10-22 17:27:34 /:>D10.天地弦(185511468)
下班吃饭了,谢谢两位