Bunların bir çoğu da projeye bizim eklediğimiz unit dosyalarıdır.
Ve hepsi birbirine bağlıdır.Bu bağımlığı en aza indirmenin yollarından birisi de ,reflection kullanmaktır.
Aşağıda yazacağım rttiFormActivator methodu ile bir "unitismi.formsınıfadı" vererek formu oluşturmak için kullanabiliriz.
Bu method kullanıma göre özelleştirebilir.
Unit1.pas
Kod: Tümünü seç
function rttiFormActivator(typeQualifiedName : string; isModal:Boolean=false) : TValue;
var
context : TRttiContext;
rttTyp : TRttiType;
instanceType : TRttiInstanceType;
instance : TValue;
begin
try
context := TRttiContext.Create();
rttTyp := context.FindType(typeQualifiedName);
instanceType := rttTyp.AsInstance;
instance := instanceType.GetMethod('Create').Invoke(instanceType.MetaclassType,[nil]) ;
Result := instance;
case isModal of
true : instanceType.GetMethod('ShowModal').Invoke(instance,[]);
false : instanceType.GetMethod('Show').Invoke(instance,[]);
end;
except on E: Exception do
raise Exception.Create(typeQualifiedName+ ' Tipi register edilmemiş !');
end;
end;
Kod: Tümünü seç
procedure TForm1.btnShowForm2Click(Sender: TObject);
begin
rttiFormActivator('Unit2.TForm2',true);
end;
Kod: Tümünü seç
procedure TForm1.btnShowForm3Click(Sender: TObject);
begin
rttiFormActivator('Unit3.TForm3');
end;
Yanlız şöyle önemli bir durum var.
Kullanacağınız sınıflarını register etmediğiniz zaman rtti amca findType methodu ile ilgili verdiğiniz tipi bulamıyor.
o yüzden sınıfları bulunduğu unit içinde register ederek,findType methodu ile bulmasını sağlayabiliriz.
Kod: Tümünü seç
initialization
RegisterClass(TForm2);
finalization
UnRegisterClass(TForm2);