2011-01-13 15 views
13

TButton veya TEdit gibi varolan bir VCL bileşeninin özel bir sürümünü tanımlamak için aynı sınıf adıyla bir hack yapmanın bir örneğini gördüm ve bunu yapmak için bir şeyler yapın. DFM streamer, orijinal yerine sürümünüzü başlatır. Maalesef, bunu yapabilmem gereken bir durumdayım ve yazımı bulamıyorum. Bunu nasıl başaracağınız konusunda bilgi nereden bulacağını bilen var mı?Delphi içinde bir bileşen sınıfının değiştirilmesi

type 
    TMyForm = class(TForm) 
    protected 
    procedure ReadState(Reader: TReader); override; 
    end; 

procedure TMyForm.ReadState(Reader: TReader); 
begin 
    Reader.OnFindComponentClass := FindComponentClass; 
    inherited; 
end; 

procedure TMyForm.FindComponentClass(Reader: TReader; const ClassName: string; 
    var ComponentClass: TComponentClass); 
begin 
    if ComponentClass=TButton then begin 
    ComponentClass := TMySuperDuperButton; 
    end else if ComponentClass=TEdit then begin 
    ComponentClass := TMyTotallyAwesomeEdit; 
    end; 
end; 

bunu yapmak için muhtemel sayısız başka yolları da vardır, ama bu böyle yaparız: En formda

+1

Çantalarınızdan hanıma baktınız mı? http://windwings.wordpress.com/2009/10/07/turbocharging-delphi-2010-2-adding-dynamic-functionality-to-3rd-parties-the-solution/#comment-1066 ;-) –

+0

@ Jørn Bu cevap şöyle: http://stackoverflow.com/questions/4685863/replacing-a-component-class-in-delphi/4686920#4686920 –

+1

@Jeroen, biliyorum ... Sadece göstermek istedim @ Mason onun "bir yerlerde gördü". :-) –

cevap

18

bunu gibi ReadState yöntemi geçersiz kılabilirsiniz!

DÜZENLEME: Inspecting TReader.GetFieldClass(Instance: TObject; const ClassName: string), Mason'un geri çağırdığı kesmeyi önerir. İlk satır ClassType := Instance.ClassType'u ayarlar. Bu yüzden pas dosyasındaki bildirimi Button1: TButton'dan Button1: MyUnit.TButton'a değiştirerek düğmenizin oluşturulmasına neden olacağından şüpheleniyorum. Ya da belki de hack, sonunda kullanım cümleciğine MyUnit ekleyerek, TButton sürümünüzün kapsamıdır. Ancak, bu hiçbiri çok pratik değil.

+0

Yanılıyor olabilirim, ancak sadece ComponentClass için değil, ClassName için de kontrol ekleyebilirim. Sadece Delphi 2 ve Delphi XE arasında bir şey değiştiğinde;) –

+0

İlginç. Bu sürümü hiç duymadım, ama yapmam gerekeni yerine getirebilir. –

+0

@Eugene Üzgünüm, Ne demek istediğini anlamadım. –

11

Hatırlamaya çalıştığınız şey, bir atalayıcının birim adını önekleyerek, atasıyla aynı adı veren bir sınıfı devralmaya çalışan bir "interposer class":. Sınıf adı değişmediğinden, dfm akış mekanizması bozulmaz. Sadece ünitenin yeniden sınıflandırıldığı üniteyi etkileyecek, ayrı bir üniteye konulmadığı ve bu ünitenin ana sınıftan sonra kullanım bölümüne dahil edileceği. Açıkçası, bir ara sınıfta özellikleri yayınlayamazsınız.

type 
    TButton = class(stdctrls.TButton) 
    protected 
    procedure CreateParams(var Params: TCreateParams); override; 
    end; 

    TForm1 = class(TForm) 
    Button1: TButton; 
    [...] 
    private 
+0

Evet, düşündüğüm buydu. Ama David'in çözümü, çözmeye çalıştığım sorun için daha etkili oldu. –

İlgili konular