Kod kalitemizi bir adım daha ilerleteceğiz. Bu küçük ama projeyi çok sadeleştirecek bir adım olacak. Gördüğümüz gibi her tablomuz için bir TFrame oluşturuyoruz, ancak her TFrame için de onu içinde barındıracak bir zarf oluşturmak zorunda kalıyoruz. Peki bunu bir tane yapıp parametrelerini değiştirerek çalışır hale getirebilir miyiz?
Bu yazının konusu da bu işi yapmak olacak!
Öncelikle View.MyBaseFrame.pas unit'inde şu eklemeyi yapıyoruz. Bu bize daha sonra oluşturacağımız Displpayer'da yardımcı olacak bir tanımlama:
...
TframeMyBaseClass = class of TframeMyBase;
...
Sonrasında uEntityDisplayer.pas adlı bir unit ekleyelim projeye. İçinde şunlar olacak
unit uEntityDisplayer; interface uses System.Classes, uInterfaces, Vcl.Controls, Vcl.ExtCtrls, Vcl.ComCtrls, Vcl.Forms, View.MyBaseFrame; type TEntityDisplayer<T : TframeMyBase, constructor> = class(TInterfacedObject, IDisplayOnTabSheetGeneric) public procedure DisplayOnTabSheet(const aTabSheet: TTabSheet); end; implementation { TEntityDisplayer } procedure TEntityDisplayer<T>.DisplayOnTabSheet(const aTabSheet: TTabSheet); var frm : TFrame; begin frm := T(TframeMyBaseClass(T).Create(Application.MainForm)); frm.Parent := aTabSheet; frm.Align := alClient; aTabSheet.Caption := (frm as T).GetCaption; end; end.
Diğer 3 adet displayer projeden çıkarılacak ve dosyalar diskten silinecek. Yanlışlıkla onların işlem görmesini istemeyiz.
Son olarak ta uRegistration değiştirilecek
unit uRegistration;
interface
uses
Spring.Container, uInterfaces;
procedure RegisterInterfaces(aMyConnection : IMyConnection);
implementation
uses
uEntityDisplayer
,View.Inventories
,View.Customers
,View.Suppliers
;
procedure RegisterInterfaces(aMyConnection : IMyConnection);
begin
GlobalContainer.RegisterType<IDisplayOnTabSheet, TEntityDisplayer<TframeInventories>>('inventories');
GlobalContainer.RegisterType<IDisplayOnTabSheet, TEntityDisplayer<TframeCustomers>>('customers');
GlobalContainer.RegisterType<IDisplayOnTabSheet, TEntityDisplayer<TframeSuppliers>>('suppliers');
GlobalContainer.RegisterInstance<IMyConnection>(aMyConnection, 'connection');
GlobalContainer.Build;
end;
end.
Evet bundan sonra F9 yaptığımızda uygulamamız çalışacaktır.
Böylece her ekran için ayrı bir unit ve class oluşturma işinden sıyırmış olduk. Bu bizim daha sonra ekleyeceğimiz ekranlara ilişkin işlemleri hiç değiştirmeye gerek kalmadan yaptığımız bir sadeleştirme oldu.
Projenin bu şeklini şu linkten elde edebilirsiniz : DITest-5
Hiç yorum yok:
Yorum Gönder