请问VB中的TypeOf在Delphi中怎么实现? (100分)

L

lwen

Unregistered / Unconfirmed
GUEST, unregistred user!
TypeOf lyr.Renderer Is mapobjects2.ClassBreaksRenderer

lyr.Renderer Is Nothing

以上语句,如何在delphi中实现。
 
用delphi中的is 和 as配合很容易实现
delphi 的as 在com里其实就是queryinterface()函数
 
delphi 里有is as
 
var
X: TEdit;

begin

X := P as TEdit;
if ActiveControl is TEdit then
TEdit(ActiveControl).SelectAll;
end;
 
我是使用MO开发。

FClassBreaks := IMoClassBreaksRenderer(CreateOleObject('MapObjects2.ChartRenderer'));
FClassBreaks := IMoClassBreaksRenderer(ALayer.Renderer);

当取出MapLayer.Renderer(as Object类型)并转化成相应的类型IMoClassBreaksRenderer后,
对FClassBreaks的一些方法进行调用,会出现如下错误
“raised exception class EOleSysError with message '未知语言。'”的错误
“raised exception class EOleSysError with message '停用了''调用取消'''”的错误
 
我们可以在Delphi的System unit中找到is, as的实现方法:
对于下面的语句:
MyForm is TForm

procedure _IsClass;
asm
{ -> EAX left operand (class) }//MyForm
{ EDX VMT of right operand } //右操作数所代表的类的VMT表, 即TForm的VMT
{ <- AL left is derived from right }
TEST EAX,EAX
JE @@exit
@@loop:
MOV EAX,[EAX] //得到MyForm的VMT
CMP EAX,EDX
JE @@success //if MyForm的VMT和TForm的VMT是同一个地址,就返回True
MOV EAX,[EAX].vmtParent //else
就取MyForm的parent
TEST EAX,EAX
JNE @@loop //循环和TForm的VMT比较,
JMP @@exit
@@success:
MOV AL,1
@@exit:
end;


As的处理方法大同小异

procedure _AsClass;
asm
{ -> EAX left operand (class) }
{ EDX VMT of right operand }
{ <- EAX if left is derived from right, else
runtime error }
TEST EAX,EAX
JE @@exit
MOV ECX,EAX
@@loop:
MOV ECX,[ECX]
CMP ECX,EDX
JE @@exit
MOV ECX,[ECX].vmtParent
TEST ECX,ECX
JNE @@loop

{ do
runtime error }
MOV AL,reInvalidCast
JMP Error

@@exit:
end;
 
其实这是一个有关COM的问题。
 
用is和as可以解决,还有就是VarType函数可以使用。
 
请问吕雪松,VarType如何用?
出现了一下情况如何解决
我是使用MO开发。

FClassBreaks := IMoClassBreaksRenderer(CreateOleObject('MapObjects2.ChartRenderer'));
FClassBreaks := IMoClassBreaksRenderer(ALayer.Renderer);

当取出ALayer.Renderer(as Object类型)并转化成相应的类型IMoClassBreaksRenderer后,
对FClassBreaks的一些方法进行调用,会出现如下错误
“raised exception class EOleSysError with message '未知语言。'”的错误
“raised exception class EOleSysError with message '停用了''调用取消'''”的错误
 
to :lwen
用这个试试
FClassBreaks := coclassbreaksRenderer.Create;
不要用Com
 
顶部