Delphi 쵀RTTI
Ŀ¼
===============================================================================
¡Ñ RTTI ¼ò½é
¡Ñ Àà(class) ºÍ VMT µÄ¹ØÏµ
¡Ñ Àà(class)¡¢ÀàµÄÀà(class of class)¡¢Àà±äÁ¿(class variable) µÄ¹ØÏµ
¡Ñ TObject.ClassType ºÍ TObject.ClassInfo
¡Ñ is ºÍ as ÔËËã·ûµÄÔÀí
¡Ñ TTypeInfo – RTTI ÐÅÏ¢µÄ½á¹¹
¡Ñ »ñÈ¡Àà(class)µÄÊôÐÔ(property)ÐÅÏ¢
¡Ñ »ñÈ¡·½·¨(method)µÄÀàÐÍÐÅÏ¢
¡Ñ »ñÈ¡ÓÐÐòÀàÐÍ(ordinal)¡¢¼¯ºÏ(set)ÀàÐ굀 RTTI ÐÅÏ¢
¡Ñ »ñÈ¡ÆäËüÊý¾ÝÀàÐ굀 RTTI ÐÅÏ¢
===============================================================================
±¾ÎÄÅŰæ¸ñʽΪ£º
ÕýÎÄÓÉ´°¿Ú×Ô¶¯»»ÐУ»ËùÓдúÂëÒÔ 80 ×Ö·ûΪ±ß½ç£»ÖÐÓ¢ÎÄ×Ö·ûÒÔ¿Õ¸ñ·û·Ö¸ô¡£
(×÷Õß±£Áô¶Ô±¾ÎĵÄËùÓÐȨÀû£¬Î´¾×÷ÕßͬÒâÇëÎðÔÚÔÚÈκι«¹²Ã½Ìå×ªÔØ¡£)
ÕýÎÄ
===============================================================================
¡Ñ RTTI ¼ò½é
===============================================================================
RTTI(Run-Time Type Information) ·Òë¹ýÀ´µÄÃû³ÆÊÇ“ÔËÐÐÆÚÀàÐÍÐÅÏ¢”£¬Ò²¾ÍÊÇ˵¿ÉÒÔÔÚÔËÐÐÆÚ»ñµÃÊý¾ÝÀàÐÍ»òÀà(class)µÄÐÅÏ¢¡£Õâ¸ö RTTI µ½µ×ÓÐʲôÓô¦£¬ÎÒÏÖÔÚҲ˵²»Çå³þ¡£ÎÒÊÇÔÚÔĶÁ Delphi ³ÖÐø»úÖÆµÄ´úÂëÖз¢ÏÖÁ˺ܶà RTTI µÄÔËÓã¬Ö»ºÃÏ顄 RTTI ѧϰһ±é¡£ÏÂÃæÊÇÎÒµÄѧϰ±Ê¼Ç¡£Èç¹ûÄã·¢ÏÖÁË´íÎóÇë¸æËßÎÒ¡£Ð»Ð»£¡
Delphi µÄ RTTI Ö÷Òª·ÖΪÀà(class)µÄ RTTI ºÍÒ»°ãÊý¾ÝÀàÐ굀 RTTI£¬ÏÂÃæ´ÓÀà(class)¿ªÊ¼¡£
===============================================================================
¡Ñ Àà(class) ºÍ VMT µÄ¹ØÏµ
===============================================================================
Ò»¸öÀà(class)£¬´Ó±àÒëÆ÷µÄ½Ç¶ÈÀ´¿´¾ÍÊÇÒ»¸öÖ¸Ïò VMT µÄÖ¸Õë(ÔÚºóÎÄÓà VMTptr ±íʾ)¡£ÔÚÀàµÄ VMTptr µÄ¸ºµØÖ··½Ïò´æ´¢ÁËһЩÀàÐÅÏ¢µÄÖ¸Õ룬ÕâЩָÕëµÄÖµºÍÖ¸ÕëËùÖ¸µÄÄÚÈÝÔÚ±àÒëºó¾ÍÈ·¶¨ÁË¡£±ÈÈç VMTptr - 44 µÄÄÚÈÝÊÇÖ¸ÏòÀàÃû³Æ(ClassName)µÄÖ¸Õë¡£²»¹ýÒ»°ã²»Ê¹ÓÃÊýÖµÀ´·ÃÎÊÕâЩÀàÐÅÏ¢£¬¶øÊÇͨ¹ý System.pas Öж¨ÒåµÄÒÔ vmt ¿ªÍ·µÄ³£Á¿£¬Èç vtmClassName¡¢vmtParent µÈÀ´·ÃÎÊ¡£
ÀàµÄ·½·¨ÓÐÁ½ÖÖ£º¶ÔÏó¼¶±ðµÄ·½·¨ºÍÀ༶±ðµÄ·½·¨¡£Á½ÕßµÄ Self Ö¸ÕëÒâÒåÊDz»Í¬µÄ¡£ÔÚ¶ÔÏó¼¶±ðµÄ·½·¨ÖÐ Self Ö¸Ïò¶ÔÏóµØÖ·¿Õ¼ä£¬Òò´Ë¿ÉÒÔÓÃËüÀ´·ÃÎʶÔÏóµÄ³ÉÔ±º¯Êý£»ÔÚÀ༶±ðµÄ·
Ïà¹ØÎĵµ£º
function BrowseCallbackProc(Wnd: HWND; uMsg: UINT; lParam, lpData: LPARAM): Integer; stdcall;
begin
if uMsg = BFFM_INITIALIZED then
begin
SendMessage(Wnd, BFFM_SETSELECTION, 1, lpData);
SetWindowText(Wnd, 'Ñ¡ÔñÒ»¸öÄ¿±ê');
end;
Result := 0;
end;
//hdl: ´°¿Ú¾ä±ú
//Root: ¸ùÄ ......
procedure TfrmMain.FormCreate(Sender: TObject); //Ö÷´°ÌåFormCreateʼþ
var FWidth:integer;
begin
if (screen.Width <> 1024) then //¼ÙÉèÄãÉè¼Æ³ÌÐòʱµÄ·Ö±æÂÊΪ1024
begin
FWidth:=width;
scaled:=true;
& ......
DelphiÖÐ Roundº¯ÊýÓиöBug
Ò»µ©²ÎÊýÊÇÐÎÈç XXX.5ÕâÑùµÄÊýʱ
Èç¹û XXX ÊÇÆæÊý ÄÇô¾Í»á Round up
Èç¹û XXX ÊÇżÊý ÄÇô¾Í»á Round down
ÀýÈç Round(17.5)=18
µ«ÊÇ Round(12.5)=12
ÏÂÃæµÄº¯Êý¼´¿É¾ÀÕýÕâ¸ö Bug µ«ÊÇÊÇÁÙʱÐÔµÄ
Ö´ÐÐ DoRound(12.5) ½á¹ûΪ 13 ÕýÈ·
function DoRound(Value: Extended): Int64;
......
DELPHI²ÎÊý¼¸¸ö¸ÅÄîÉϵÄÇø±ð ÊÕ²Ø
ÒýÓòÎÊý£º
ÒýÓòÎÊýÓÃvar¹Ø¼ü×Ö±êʾ
procedure DoubleTheValue (var Value: Integer);
begin
Value := Value * 2;
end;ÔÚÕâÖÖÇé¿öÏ£¬²ÎÊý¼È°ÑÒ»¸öÖµ´«µÝ¸ø¹ý³Ì£¬ÓÖ°ÑÐÂÖµ·µ»Ø¸øµ÷Óùý³ÌµÄ´úÂë¡£µ±ÄãÖ´ÐÐÍêÒÔÏ´úÂëʱ£º
var
X: Integer;
begin
X : ......
Delphi ¹Ø¼ü×ÖÏê½â[ÕûÀíÓÚ "³È×Ó" µÄÌû×Ó]
absolute
//ËüʹµÃÄãÄܹ»´´½¨Ò»¸öбäÁ¿, ²¢ÇҸñäÁ¿µÄÆðʼµØÖ·ÓëÁíÒ»¸ö±äÁ¿Ïàͬ.
var
Str: string[32];
StrLen: Byte absolute Str;
//Õâ¸öÉùÃ÷Ö¸¶¨Á˱äÁ¿StrLenÆðʼµØÖ·ÓëStrÏàͬ.
//ÓÉÓÚ×Ö·û´®µÄµÚ0¸öλÖñ£´æÁË×Ö·û´®µÄ³¤¶È, ËùÒÔStrLenµÄÖµ¼´×Ö·û´®³¤¶È.
begin ......