2015-10-16 14 views
6

içindeki bir nesneye bir başvuru alınıyor:Bu, bu Q cevabım itibaren takip Delphi IDE

Can I change the display format for strings in the watch list?

Bu çıkıyor o D7 ve XE3, IDE İzle uygulanması arasındaki bir noktada Pencere TListView kullanarak bir TVirtualStringTree kullanılarak değiştirildi.

VST'yi göz ardı ederek ve saat değerini panodan alıp XE4 ile çalışan cevabım için bir güncelleştirme yayınlamam rağmen, yine de VST'den saat değerini alabilirim. VST'ye bir referans verdiğimde, bu 'u nasıl yapacağımı biliyorum ama sorun şu ki, bir girişim alma denemem başarısız oldu.

Özel paketimde kullanıyorum kod MCVE aşağıdadır. Umarım, yaptığı şey kendini açıklayıcıdır. Sorun bloğu

if WatchWindow.Components[i] is TVirtualStringTree then begin 
    [...] 
    end; 

kod asla Memo1 görünen sınıfadı "TVirtualStringTree" RAĞMEN, yürütür olmasıdır. Açıkçası, bu classname ile bileşen "olduğunu" test başarısız olur. Bunun sebebi, IDE'ye derlenen TVirtualTreeView'in, XE4'ü bulabildiğim en yakın selefi olan v.5.3.0'ı kullandığım farklı bir versiyon olduğunu tahmin ediyorum.

Yani, benim sorum şu ki, olası bir açıklama ve bu konuda yapabileceğim bir şey var mı? Birisi XE4 için şapkadan kullanılan TVirtualStringTree sürümünü geliştirip geliştiremediğinden şüpheleniyorum, bu benim problemimi çözebilir.

type 
    TOtaMenuForm = class(TForm) 
    Memo1: TMemo; 
    procedure FormCreate(Sender: TObject); 
    private 
    WatchWindow : TForm; 
    VST : TVirtualStringTree; 
    end; 

procedure TOtaMenuForm.FormCreate(Sender: TObject); 
var 
    i : Integer; 
    S : String; 
begin 

    WatchWindow := Nil; 
    VST := Nil; 

    // Iterate the IDE's forms to find the Watch Window 
    for i := 0 to Screen.FormCount - 1 do begin 
    S := Screen.Forms[i].Name; 
    if CompareText(S, 'WatchWindow') = 0 then begin 
     WatchWindow := Screen.Forms[i]; 
     Break; 
    end; 
    end; 

    Assert(WatchWindow <> Nil); 

    if WatchWindow <> Nil then begin 
    Memo1.Lines.Add('Looking for VST'); 
    for i := 0 to WatchWindow.ComponentCount - 1 do begin 
     Memo1.Lines.Add(IntToStr(i) + ':' + WatchWindow.Components[i].ClassName); 
     if WatchWindow.Components[i] is TVirtualStringTree then begin 
     VST := TVirtualStringTree(WatchWindow.Components[i]); 
     Memo1.Lines.Add('found VST'); 
     Break; 
     end; 
    end; 
    if VST = Nil then 
     Memo1.Lines.Add('VST not found'); 
    end; 
end; 

Btw, ben IDE gerçekleme detayların bağlı çözümler kırılgan olması muhtemeldir fark, ama bu sadece eğlence içindir (I dışına gider bir bileşeni dışına dize verileri alma zorluğu sevdim onun saklamaktan kaçınmanın yolu).

+3

VST sürümü tek sorun değildir. Kodunuz IDE'lerden farklı bir RTTI ile derlenmişse, 'is' operatörü başarısız olur, böylece ikili sisteminizin içindeki bir VST bileşeni, IDE içindeki bir VST bileşeninden farklıdır. Kodunuz aynı VST sürümünü kullanıyor olsa bile, RTTI hala eşleşmeyecektir. Çalışma zamanı paketlerinin devreye girdiği yer burası. İkilinizin çalışma zamanı paketi ile bağlanması gerekir, böylece IDE ile aynı RTL'yi paylaşır ve IDE'nin VST bileşeni için kullandığı aynı pakete bağlanması gerekir. Ancak VST doğrudan IDE'ye derlenmiş ve bir paketten içe aktarılmadıysa, SOL ... –

+3

... 'is' operatörünü terk etmeniz ve bunun yerine bir 'ClassName()' karşılaştırması kullanmanız gerekir. Bu en azından IDE'nin VST bileşenini tespit etmenize izin verecektir. Ancak * erişim * aynı sürüm EXACT yoksa güvenli olmaz, böylece bellek düzenleri hala eşleşiyor. –

+0

@RemyLebeau: Teşekkürler. Aslında, "i" sonucunu görmezden gelmeyi denedim ve sınıf ismine dayanarak onu sert bir şekilde yazmaya çalıştım, ancak AV'leri nesnenin yöntemlerini çağırmaya çalıştığımda. Fwiw, Watch Window'ın TListView olduğu ve referansın kullanılması ve kullanılması açısından iyi çalışan D7'de aynı "tekniği" tekniğini kullandım. – MartynA

cevap

0

May IDE TVirtualStringTree uygulamasına gömülü yayınlanmış özelliklerini, istediğiniz şeyi yapmak için RTTI yöntemleri ile kullanmaya çalışabilirsiniz.

+0

Aslında, bu sorunun ikinci cevabımda anlattığım şeyi kullanarak bu sorunu çözdüm: http://stackoverflow.com/questions/33121397/can-i-change-the-display-format-for-strings-in- -izle-listesi/33127943 # 33127943 – MartynA

İlgili konular