2010-03-15 7 views
16

Got un problema in cui MyObj.classnameis(TMyClass.classname) è vero e TMyClass(MyObj) opere, ma (MyObj as TMyclass).doSomething getta un errore di conversione.Qual è la differenza tra fusione con (Object come TClass) e TClass (Object)

Non voglio davvero alcun aiuto con quella spazzatura, anche se se vuoi metterlo nei commenti sarebbe super. Vorrei solo sapere qual è la differenza tra Obj as Class e Class(Obj).

+0

Questo è un bel po 'di tag. Penso che "delphi" sarebbe sufficiente. –

+0

Grazie per aver segnalato il problema, stavo solo indicando –

+0

Usi le DLL? Le DLL rovinano l'identità della classe. –

risposta

30

Un cast controlla il tipo di oggetto effettivo per assicurarsi che il cast sia valido e genera un'eccezione se non lo è. Un "hard cast" (stile TMyClass(MyObj)) non controlla, dice semplicemente al compilatore di presupporre che il cast sia valido.

Se hai una situazione in cui ClassNameIs restituisce true ma l'as-cast fallisce, significa che hai due classi diverse in due diverse unità con lo stesso nome, e l'as-cast sta provando a lanciare in modo errato uno. Ciò significa anche che il tuo hard-cast sta trasmettendo a quello sbagliato, il che potrebbe potenzialmente portare alla corruzione della memoria.

Eseguire una ricerca completa del progetto per "TMyclass =" per vedere dove sono le vostre dichiarazioni multiple e rinominare una delle classi o utilizzare una definizione completa (obj come MyUnit.TMyClass) in modo che il compilatore sappia quale classe si ' sta cercando di trasmettere a.

+1

Anche il cast rigido (quello senza come) funziona meglio nel valutare/modificare e guardare le schermate. –

5

Aggiunta al post di Mason: Invece di una ricerca nel codice, è possibile anche chiamare un metodo come questo nel punto in cui si presenta il 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; 

che restituirà una stringa formattata come (NomeUnità) TObject.TPersistent.TComponent .... Non mi ricordo di aver visto "ClassType.UnitName" nella vecchia versione di Delphi, in modo che una parte non potrebbe lavorare con loro, ma il resto dovrebbe.

Problemi correlati