08-02-2018, Saat: 00:45
(Son Düzenleme: 08-02-2018, Saat: 08:47, Düzenleyen: witalihakko.)
Class helper içerisinde Generic collection kullanımını bir örnek üzerinde göstermek istiyorum. Örneğimde With operatörüne benzer bir kullanımı TObject sınıfına Class helper ile implemente ettim. Bunu yaparken Generic collection kütüphanesinden yararlandım. Aşağıda oluşturduğum Class helper bulunmakta.
Class Helper :
TObject sınıfına &With adında bir procedure tanımlamış oldum. Bu procedure ye generic yardımı ile TObject ten türemiş istediğim herhangi bir sınıfı gönderip işlem yaptırabileceğim. Örnek kullanımı da şu şekildedir. Örneğim ADOQuery ye parametreli SQL cümlesi gönderip bu SQL'in henüz çalışmadan önceki parametreleri yazılmış halini almak.
Kodda görüldüğü gibi TObject sınıfından türemiş herhangi bir nesneyi bir anonim procedure'de kullanabiliyorum.
Sonuç:

Buradan kodlara ulaşabilirsiniz | Yandex Disk
Class Helper :
TDCObjectHelper = class helper for TObject
procedure &With<T:Class>(Action:TProc<T>);
end;
.
.
.
implementation
{ TDCObjectHelper }
procedure TDCObjectHelper.&With<T>(Action: TProc<T>);
begin
Action(Self);
end;
TObject sınıfına &With adında bir procedure tanımlamış oldum. Bu procedure ye generic yardımı ile TObject ten türemiş istediğim herhangi bir sınıfı gönderip işlem yaptırabileceğim. Örnek kullanımı da şu şekildedir. Örneğim ADOQuery ye parametreli SQL cümlesi gönderip bu SQL'in henüz çalışmadan önceki parametreleri yazılmış halini almak.
Memo1
.&With<TMemo>
(
procedure(mm:TMemo)
begin
ADOQuery1
.&With<TADOQuery>(
procedure(ADO:TADOQuery)
var SQLText : string;
begin
SQLText := 'SELECT * FROM USERS WHERE U_NAME=:U_NAME AND U_ID=:U_ID AND U_SURNAME=:U_SURNAME';
ADO.SQL.Text := SQLText;
ADO.ParamCheck := True;
ADO
.Parameters
.&With<TParameters>
(
procedure(Pr:TParameters)
begin
Pr.ParamByName('U_NAME').Value := 'Hakan';
Pr.ParamByName('U_ID').Value := 123;
Pr.ParamByName('U_SURNAME').Value := 'UÇAR';
Pr
.ForEach
(
procedure(P:TParameter)
begin
mm.Lines.Add(P.Name +' : '+VarTypeAsText(p.Value.GetType));
SQLText := SQLText.Replace(':'+P.Name,P.Value.GetConvertVar);
end
);
end
);
mm.Lines.Add('');
mm.Lines.Add(SQLText);
end
);
end
);
Kodda görüldüğü gibi TObject sınıfından türemiş herhangi bir nesneyi bir anonim procedure'de kullanabiliyorum.
Sonuç:

Buradan kodlara ulaşabilirsiniz | Yandex Disk

