delphi - possessive - object pronouns youtube
¿Cuál es la diferencia entre la conversión utilizando(Object as TClass) y TClass(Object) (2)
Se MyObj.classnameis(TMyClass.classname)
un problema en el que MyObj.classnameis(TMyClass.classname)
es verdadero y TMyClass(MyObj)
funciona pero (MyObj as TMyclass).doSomething
un error de conversión.
Realmente no quiero ninguna ayuda con esa basura, aunque si quieres ponerla en los comentarios, eso sería genial. Solo me gustaría saber cuál es la diferencia entre Obj as Class
y Class(Obj)
.
Adición a la publicación de Mason: en lugar de buscar a través de su código, también puede llamar a un método como este en la ubicación que le cause problemas.
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;
Eso le devolverá una cadena con formato (UnitName) TObject.TPersistent.TComponent .... No recuerdo haber visto "ClassType.UnitName" en una versión anterior de delphi, por lo que es posible que una parte no funcione con ellos, pero el resto debería .
As-cast verifica el tipo de objeto real para asegurarse de que la conversión es válida y genera una excepción si no lo es. Un estilo de "reparto duro" ( TMyClass(MyObj)
) no se comprueba, solo le dice al compilador que asuma que el reparto es válido.
Si tiene una situación en la que los ClassNameIs devuelven verdadero pero el as-cast falla, eso significa que tiene dos clases diferentes en dos unidades diferentes con el mismo nombre, y el as-cast está intentando convertir al incorrecto. Esto también significa que su disco duro está lanzando al incorrecto, 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 múltiples declaraciones, 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 está intentando emitir a.