SORU
26 NİSAN 2013, Cuma


Yayınlanan arayüz özellikleri hata ve çözümler

Yayınlanan arayüz özellikleri ile birbirine bağlanan bileşenleri bir dizi yazdım. Ve bir tasarım paketi kayıtlı yüklenir.

Yayınlanan arabirimi özelliklerini kullanarak Delphi yaygın değildir ve bu nedenle, şaşırtıcı olmayan bir şekilde, o kadar iyi çalışmıyor gibi görünüyor.

Bileşenleri farklı formlarda sorunlara neden ancak aynı form üzerinde bulunan, gayet iyi çalışıyor.

Başka bir formdaki bileşenlere nesne bağlantıları aksine, arayüz bağlantıları IDE tarafından tanınması görünmüyor. Ne yani en iyi anlatılan bir örnek, ne zaman var 2 formları açın IDE ve bağlantıları arasında bileşenleri öyleyse onları denemeye geçmek için form görünümü olarak metin (Alt F12) neden IDE için doğru şikayet:

Module 'UnitXXX.pas' has open descendents or linked modules. Cannot close.

Ama eğer mülkiyet bir arayüz bu değil olur, ne olur yerine bağlantı kopuk (ve bu en iyi senaryo kullandığınızda uyarı mekanizması için açık referanslar, yoksa sol ile geçersiz işaretçi)

Başka bir sorun, büyük olasılıkla bir sonucu olarak aynı hata olduğunu bir proje açtığınızda IDE, sırada hangi formları olacak yeniden tanımlanmamış, yani IDE olabilir denemek için açık bir form içeren bileşenler var arabirim bağlantıları bileşenleri üzerinde başka bir form, ama başka bir biçimde yeniden değil henüz. Yani bu ya da herhangi bir şekilde AV ya da kesilmiş bağlantılar sonucu.

Datasets Datasources kullandığım süre önce 90'lı yıllarda bu biraz benzer yani formları arasındaki bağlantıları ortadan kaybolması ile benzer konuları hatırlıyorum.

Her Arabirim özelliği için yayınlanan yinelenen özellikleri ekledim geçici bir çözüm olarak, TComponent olarak bildirilmiş başka bir ekledim. Bu Delphi formları arasında bir ilişki olduğunu farkında yapar, ama en azından böyle çirkin bir çözüm olur.

Eğer bu sorunu düzeltmek için yapabileceğim bir şey olup olmadığını merak ediyorum ? IDE bir hata ve büyük olasılıkla düzeltilebilir doğrudan değil, ama belki bir şey geçersiz kılma veya başka bir mekanizma daha etkin bir şekilde bu hata, bir çözüm için akış için ayarlayabilirim.

Hiç mekanizma akışı içine çok derin gitmedim, ama Düzeltme mekanizması bununla uğraşmak gerekiyor sanıyorum. Geçici bir çözüm mümkün olur umarımcsFixups TComponentState bir yoktur.

Edit: KullanarakD2007.

Güncelleme:

Yeni güncelleme tekrarlanabilir örnek 27* *karşıya

Kolay ve arayüzü vs bileşen akış karşılaştırın izleme için kendim de ekledi property ComponentReference: TComponent.

Boyumu biraz dışarı çevirici seviyesine sorunu daralmış.

Prosedür classes birim GlobalFixupReferences çağırır:

(GetOrdProp(FInstance, FPropInfo) <> 0)

sonuçta yürüten:

function TInterfacedComponent.GetInterfaceReference: IInterface;
begin
// uncomment the code bellow to avoid exception
{  if (csLoading in ComponentState) and (FInterfaceReference = nil) then
  // leave result unassigned to avoid exception
  else
}
    result := FInterfaceReference; // <----- Exception happens here
end;

Gördüğünüz gibi gelen açıklamanın tek yolu buldum önlemek için istisna olduğu için terk sonucu atanmamış, ama sonları işlevselliği yana karşılaştırma yukarıda GlobalFixupReferences nedeniyle başarısız GetOrdProp <> 0, severes link.

durum daha kesin derin konum izleme

system birim procedure _IntfCopy(var Dest: IInterface; const Source: IInterface);

Özellikle bu hattı read of address 0x80000000 bir yükseltir

{   Now we're into the less common cases.  }
@@NilSource:
        MOV     ECX, [EAX]      // get current value

MOV neden başarısız ve ECX EAX ben sorunun ne yani, hiçbir fikrim yok.

CEVAP
8 Mayıs 2013, ÇARŞAMBA


Özetlemek gerekirse, sorun alıcı bir yöntem olduğunu yayınlanan arayüz özellikleri ile gerçekleşir ve bu özellik modül/başka bir formdaki bileşen ve modül/form henüz yeniden değil) puan. Böyle bir durumda geri şeklinde DPC bir AV olur.

Bug GetOrdProp ama yeteneğimin ötesinde, yani sembolik makina kodu olduğuna eminim en kolay çözüm budur alıcı bir yöntem yerine bir Alan kullanın ve doğrudan mülkiyet okumak için. Bu, benim durumumda ki yeteri kadar iyi şu anda.

Alternatif olarak, arayüzü yerine TComponent emlak ilan TComponentProperty soyundan yazma ComponentMayBeSetTo gerekli arayüz desteklemeyen filtre bileşen için geçersiz kılabilirsiniz. Ve elbette RegisterPropertyEditor kullanarak kayıt

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • calicoJake

    calicoJake

    29 EKİM 2007
  • krotoflik

    krotoflik

    26 ŞUBAT 2011
  • Sergio Fernandez

    Sergio Ferna

    1 EKİM 2009