Ben

2012-08-04 17 views
7

Ben şu gibi ünitenin başlatma bu bileşeni TComponent bir değişkeni olan bir birim oluşturmak var .Create (Nil) yerine .Create (Uygulama) kullanabilir miyim:Ben

var 
    XComp: TComponent; 
. 
. 
. 
. 

initialization 
begin 
    XCom := TComponent.Create(Application); 
end; 

yükledikten sonra bana bir erişim ihlali hata iletisi (EAccessViolation)

verir ama Delphi kapattığınızda ünite ben

initialization 
begin 
    XCom := TComponent.Create(nil); 
end; 

her şey iyi gitti aşağıdaki gibi olacaktır benim yaratıcısı değişti ... Ben farkı bilmek ister misiniz? ve daha iyi olan nedir?

not: hata yalnızca delphi kapatıldığında görünür (tasarım zamanında demektir).

Teşekkürler. Eğer

XCom := TComponent.Create(Application); 

kullandığınızda

+0

İşte ['takip edenlerden biri '] (http://stackoverflow.com/q/5420260/960757). – TLama

+6

'Başlatma 'bölümünde' XCom' oluşturuyorsunuz. Onu serbest bırakan bir 'finalizasyon' bölümünüz var mı? –

cevap

2

Temelde hem izin verilir ve bu gibi bir kod olsa bile bir AV neden olmamalıdır:

MyComp := TMyComp.Create(Application); 
try 
    {...} 
finally 
    MyComp.Free; 
end; 

Bu varlık olduğunda düzgün kodlanmış bileşen sahibinin bileşenleri listesinden kendisini kaldıracak çünkü yerlebir edilmiş.

Burada sorun, uygulamanın uygulama nesnesi tarafından zaten serbest bırakılmış olması ve daha sonra bazı kodların buna erişmeye çalışması olabilir. Belki de kodunuzda bir sonuç bölümü var, öyle değil mi? Ya da karışık nesneler ve arabirimleriniz olabilir ve referans sayımı size ulaştı.

Sorununuzu hata ayıklamak için, paketinizin "ana bilgisayar uygulamasını" Delphi'ye (C: \ Program Files \\ BDS \\ Bin \ bds.exe) ayarlayarak hata ayıklayıcıda IDE'yi çalıştırabilirsiniz. ve bileşeninizin yıkıcısında bir kesme noktası ayarlayın. Böylece, nerede serbest bırakıldığını ve AV'nin nerede gerçekleştiğini öğreneceksiniz.

13

Uygulama Xcom'un sahibi olun. Uygulama sona erdiğinde, sahibi olduğu için XCom'u yok etmekle ilgilenecektir.

yapmanız

XCom := TComponent.Create(nil); 

kimse Xcom'un sahibidir ve uygulama sonlandırıldığında kendiniz özgür gerekiyor.

XCom'u el ile serbest bıraktığınız ve Uygulama'nın XCom'u da serbest bırakmaya çalıştığınız için muhtemelen bir istisna aldınız.

+5

+1. Genel bir rehber olarak: Nesneyi kendiniz serbest bıraktığınızda 'nil 'öğesini,' Uygula 'seçeneğini kullanın, eğer siz değilseniz ve sizin için temizlenmesini isterseniz ya da bir şansınız varsa, bunu serbest bırakmayacaksınız. kendin. –

+1

@birger: Bileşen düzgün bir şekilde kodlanmışsa, kendisini serbest bırakıldığında, sahibin (bu durumda: Uygulama) bileşen listesinden kaldırır. Yani teoride bir AV yapılmamalıdır. Başka bir yol olabileceğini düşünüyorum: Bileşen uygulama tarafından zaten serbest bırakıldı ve program daha sonra buna erişmeye çalıştı. Soruyu doğru olarak yorumluyorsam, bu bir denetim süresi paketinde bir bileşen ve AVI Delphi IDE'de ortaya çıkıyor, bu yüzden bu biraz daha karmaşık. – dummzeuch