2010-03-15 17 views
16

Se ha producido un error donde MyObj.classnameis(TMyClass.classname) es verdadero y TMyClass(MyObj) funciona pero (MyObj as TMyclass).doSomething arroja un error de conversión.Cuál es la diferencia entre la conversión usando (Object como TClass) y TClass (Object)

Realmente no quiero ayuda con esa basura, aunque si quieres ponerlo en los comentarios que sería genial. Solo me gustaría saber cuál es la diferencia entre Obj as Class y Class(Obj).

+0

Eso es un montón de etiquetas. Creo que 'delphi' sería suficiente. –

+0

Gracias por señalar el problema que acabo de señalar –

+0

¿Utiliza DLL? Las DLL arruinan la identidad de clase. –

Respuesta

30

Un lanzamiento instantáneo comprueba el tipo de objeto real para asegurarse de que el lanzamiento sea válido y genera una excepción si no lo es. Un "hard cast" (estilo TMyClass(MyObj)) no se comprueba, simplemente le dice al compilador que asuma que el elenco es válido.

Si tiene una situación en la que ClassNameIs devuelve verdadero pero el lanzamiento en falso falla, eso significa que tiene dos clases diferentes en dos unidades diferentes con el mismo nombre, y que el reparto está intentando convertir al incorrecto uno. Esto también significa que su colada dura está lanzando a la incorrecta, lo que podría conducir a la corrupción de la memoria.

Ejecute una búsqueda de proyecto completa para "TMyclass =" para ver dónde están sus declaraciones múltiples, y cambie el nombre de una de las clases o use una definición completa (obj como MyUnit.TMyClass) para que el compilador sepa qué clase es usted ' Estoy tratando de lanzar a.

+1

También el yeso duro (el que no tiene as) funciona mejor en las pantallas de evaluación/modificación y visualización. –

5

Adición a la publicación de Mason: En lugar de una búsqueda a través de su código, también puede llamar a un método como este en la ubicación que le da problema.

function GetClassInheritance(Obj : TObject) : string; 
var ClassRef : TClass; 
begin 
    Result := ''; 
    ClassRef := obj.ClassType; 
    Result := ClassRef.ClassName; 
    ClassRef := ClassRef.ClassParent; 
    while assigned(ClassRef) do 
    begin 
    Result := ClassRef.ClassName + '.' + Result; 
    ClassRef := ClassRef.ClassParent; 
    end; 

    Result := '(' + obj.ClassType.UnitName + ')' + Result 
end; 

que le devolverá una cadena formateada como (unitName) TObject.TPersistent.TComponent .... Yo no recuerdo haber visto "ClassType.UnitName" en la versión anterior de Delphi, por lo que esa parte no podría Trabaja con ellos, pero el resto debería.

Cuestiones relacionadas