Challenge 3

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
thelvaci
Kıdemli Üye
Mesajlar: 770
Kayıt: 11 Tem 2010 07:17
Konum: Istanbul
İletişim:

Challenge 3

Mesaj gönderen thelvaci »

Umarım bu challenge'lar ile sizleri sıkmıyorumdur ?

Yeni bir challenge ile karşınızdayım :)

Konu: Herhangi bildiğiniz bir tablo yapısından generic bir liste sınıfı nasıl oluşturursunuz ?

Örneğin:

Kod: Tümünü seç

  Personel Tablosu
  ---------------------------------
  ID   : Int
  Adi : Varchar(20)
  Soyadi : Varchar(20)
  Yasi : TinyInt 
yapısında Personel tablosu için aşağıdaki sınıfların ilgili metodlarını yazınız.

Kod: Tümünü seç

TCustomPersonel = class
public
  class function FromRecord<T : ?>(const ADataSet : TDataSet) : T; static; // ?
end;

TPersonel = class(TCustomPersonel)
private
 ?
public
 ?
end;

TCustomList<T : ?> = class(TObjectList<T>)
public
  class function FromDataSet<T>(const ADataSet : TDataSet) : T; static; // ?
end;

TPersoneller = class(TObjectList<TPersonel>)
public
end;
Kurallar:
1- Run time Type Information kullanılmalıdır.(Rtti)
thelvaci
Kıdemli Üye
Mesajlar: 770
Kayıt: 11 Tem 2010 07:17
Konum: Istanbul
İletişim:

Re: Challenge 3

Mesaj gönderen thelvaci »

thelvaci yazdı:Umarım bu challenge'lar ile sizleri sıkmıyorumdur ?

Yeni bir challenge ile karşınızdayım :)

Konu: Herhangi bildiğiniz bir tablo yapısından generic bir liste sınıfı nasıl oluşturursunuz ?

Örneğin:

Kod: Tümünü seç

  Personel Tablosu
  ---------------------------------
  ID   : Int
  Adi : Varchar(20)
  Soyadi : Varchar(20)
  Yasi : TinyInt 
yapısında Personel tablosu için aşağıdaki sınıfların ilgili metodlarını yazınız.

Kod: Tümünü seç

TCustomPersonel = class
public
  class function FromRecord<T : ?>(const ADataSet : TDataSet) : T; static; // ?
end;

TPersonel = class(TCustomPersonel)
private
 ?
public
 ?
end;

TCustomList<T : ?> = class(TObjectList<T>)
public
  class function FromDataSet<T>(const ADataSet : TDataSet) : T; static; // ?
end;

TPersoneller = class(TObjectList<TPersonel>)
public
end;
Kurallar:
1- Run time Type Information kullanılmalıdır.(Rtti)

Sınıfınızın içine tablonuzun içindeki kolonları birer property olarak ekledikten sonra aşağıdaki gibi bir kod kullanabilirsiniz;

Kod: Tümünü seç

type
  TConverter = class
  public
    class function FromDataSet<T : class, constructor>(const ADataSet : TDataSet) : T; static;
  end;

class function TConverter.FromDataSet<T>(const ADataSet: TDataSet): T;
var
  ctx       : TRttiContext;
  typ       : TRttiType;
  DBField   : TField;
  RttiField : TRttiField;
begin
  if not Assigned(ADataSet) then
    Exit(nil);

  if ADataSet.RecordCount <= 0 then
    Exit(nil);

  Result := T.Create;

  typ := ctx.GetType(Result.ClassInfo);

  for DBField in ADataSet.Fields do
  begin
    RttiField := typ.GetField('f' + DBField.FieldName);

    if RttiField <> nil then
      RttiField.SetValue(TObject(Result), TValue.FromVariant(DBField.Value));
  end; // for fld in ADataSet.Fields do
end;
Kullanıcı avatarı
kimimben
Üye
Mesajlar: 129
Kayıt: 28 Oca 2016 04:41
Konum: İstanbul

Re: Challenge 3

Mesaj gönderen kimimben »

Tuğrul bey tam benlikmiş bu meydan okuma

Bu arada sanırım mesajım arkalarda kaldığı için gözden kaçtı.
Cevapla