2010-03-15 26 views
16

kullanarak döküm arasındaki fark nedir? MyObj.classnameis(TMyClass.classname) true ve TMyClass(MyObj) çalışır, ancak (MyObj as TMyclass).doSomething bir dönüştürme hatası verir.(Nesne olarak Nesne gibi) ve Taret (Object)

Süper olan yorumlarda bulunmak istiyorsanız, bu çöplerle ilgili herhangi bir yardım istemiyorum. Ben sadece Obj as Class ve Class(Obj) arasındaki farkın ne olduğunu bilmek isterim.

+0

Bu oldukça fazla etiket. Sanırım 'delphi' yeterli olurdu. –

+0

Sorunu işaret ettiğin için teşekkürler Sadece işaret ediyordum –

+0

DLL kullanıyor musunuz? DLL'ler sınıf kimliğini bozar. –

cevap

30

Bir yayınlama, oynatıcının geçerli olduğundan emin olmak için gerçek nesne türünü denetler ve değilse bir istisna oluşturur. Bir "hard cast" (TMyClass(MyObj) stili) kontrol etmiyor, sadece derleyicinin cast'ın geçerli olduğunu varsaymasını söyler.

ClassNameIs öğesinin doğru döndüğü, ancak yayınlamanın başarısız olduğu bir durum söz konusuysa, bu, aynı ada sahip iki farklı birimdeki iki farklı sınıfa sahip olduğunuz anlamına gelir ve as-cast yanlışlara dökülmeye çalışılır bir. Bu aynı zamanda hard-cast'ınızın yanlış yere döküm anlamına geldiği anlamına gelir ve bu da hafıza bozulmasına neden olabilir.

"TMyclass =" için tam bir proje araması yapın ve birden çok bildirimin nerede olduğunu görmek için, sınıflardan birini yeniden adlandırın veya tam tanımı kullanın (MyUnit.TMyClass olarak kullanın). yayınlamaya çalışıyor.

+1

Ayrıca sert döküm (olmayan bir) değerlendirme/değiştirme ve izleme ekranlarında daha iyi çalışır. –

5

Mason'un gönderisine ekleme: Kodunuzda arama yapmak yerine, size sorun veren bir yerde bunun gibi bir yöntemi de çağırabilirsiniz. Size (unitName) TObject.TPersistent.TComponent .... Ben Delphi eski sürümünde "ClassType.UnitName" gördüğümü hatırlamıyorum olarak formated bir dize döndürür

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; 

, bu yüzden o kısmı olmayabilir Onlarla çalış, ama gerisi olmalı.