Konuyu Oyla:
  • Derecelendirme: 5/5 - 1 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Form içinde Generics Sınıfı Nasıl Kullanırım
#1
Aşağıdaki şekilde bir yapı kurmaya çalışıyorum. Fakat derleyici hatalar veriyor.
Yapmak istediğim yapı şu şekilde

TTable sınıfını Generic olarak tanımlıyorum. Burada sorun yok. Bu Base sınıf üzerinden yeni sınıflar üreterek kullanıyorum. Örneğin TArac = class(TTable<TArac>), TStok = class(TTable<TStok>) gibi 

Ben bu Generic TTable<T> sınıfı ufrmBase içinde kullanmak istiyorum. Fakat T nedir anlamıyorum diyor. Formu da Generic olarak(TfrmBase<T> = class(TForm)) yaptığımda da farklı hatalar alıyorum. Nasıl yol alabilirim.

Bu form yapısını Generics kullanmadan sorunsuz bir şekilde çalıştırıyorum. Bu Base formların üzerinde TfrmArac, TfrmAraclar gibi son katman formlarda mevcut. Fakat List sınıfı için sürekli olarak type cast kullanmak zorunda kalıyorum.

Bu durumu aşmak için Interface mi kullanmam gerekiyor? Bu durumu nasıl aşarım.

_______________
|             |=============> Input DB Form
|             |___ 
|             |  |=========> Input Form
|             |  |___
|             |  |  |======> Base Form
|_____________|  |  |
  |              |  |
  |______________|  |
     |              |
     |______________|

_______________
|             |=============> Output DB Form
|             |___ 
|             |  |=========> Output Form
|             |  |___
|             |  |  |======> Base Form
|_____________|  |  |
  |              |  |
  |______________|  |
     |              |
     |______________|
unit uTable;

interface

uses 
  System.Classes, System.Generics.Collections;

type
 TTable<T> = class
 private
   FList: TList<T>;
   FTableName: string;

   function GetTableName(): string;
   procedure SetTableName(ATableName: string);
 published
   constructor Create(pOwnerDatabase: TDatabase); virtual;
   destructor Destroy(); override;
 public
   property TableName: string read GetTableName write SetTableName;

   property List: TList<T> read FList;
 end;


unit ufrmBase;

interface

uses
   Winapi.Windows
 , Winapi.Messages
 , System.SysUtils
 , System.Classes
 , Vcl.Controls
 , Vcl.Forms
 , Vcl.StdCtrls
 , Vcl.Menus
 , System.Generics.Collections
 ;

type
 TfrmBase = class(TForm)
   pnlBottom: TPanel;
   pnlMain: TPanel;
   btnAccept: TButton;
   btnDelete: TButton;
   btnClose: TButton;
   stbBase: TStatusBar;
 private
   FTable: TTable<T>;
 protected
 public
   constructor Create(
     AOwner: TComponent;
     AParentForm: TForm = nil;
     ATable: TTable<T> = nil;
     AFormMode: TInputFormMode = ifmNone;
     AFormDecimalMode: TFormDecimalMode = fomNormal;
     AFormViewMode: TInputFormViewMode = ivmNormal;
     AAcceptBtnDoAction: Boolean = True);reintroduce;overload;
 end;

constructor TfrmBase.Create(
  AOwner: TComponent;
  AParentForm: TForm;
  ATable: TTable<T>;
  AFormMode: TInputFormMode;
  AFormDecimalMode: TFormDecimalMode;
  AFormViewMode: TInputFormViewMode;
  AAcceptBtnDoAction: Boolean);
begin
  FWithCommitTransaction := True;
  FWithRollbackTransaction := True;

  FParentForm := AParentForm;
  FFormMode := AFormMode;
  FFormViewMode := AFormViewMode;
  FFormDecimalMode := AFormDecimalMode;
  FTable := ATable;
  FAcceptBtnDoAction := AAcceptBtnDoAction;

  inherited Create(AOwner);
end;
PostgreSQL - Linux - Delphi, Poliüretan
WWW
Cevapla
#2
(20-08-2020, Saat: 14:55)3ddark Adlı Kullanıcıdan Alıntı: Ben bu Generic TTable<T> sınıfı ufrmBase içinde kullanmak istiyorum. Fakat T nedir anlamıyorum diyor. Formu da Generic olarak(TfrmBase<T> = class(TForm)) yaptığımda da farklı hatalar alıyorum. Nasıl yol alabilirim.
type

 TStok = class

 end;

 TTable<T> = class
 private
   FList: TList<T>;
 public
   property List: TList<T> read FList;
 end;

  TBaseForm<T> = class(TForm)
  protected
    FTable : TTable<T>;
  public
    constructor Create(
     AOwner: TComponent;
     AParentForm: TForm = nil;
     ATable: TTable<T> = nil);reintroduce;overload;
  end;

  TForm1 = class(TBaseForm<TStok>)
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TBaseForm<T> }
constructor TBaseForm<T>.Create(
     AOwner: TComponent;
     AParentForm: TForm = nil;
     ATable: TTable<T> = nil);
begin
   inherited Create(AOwner);
end;

WWW
Cevapla
#3
(20-08-2020, Saat: 22:04)ismailkocacan Adlı Kullanıcıdan Alıntı:
(20-08-2020, Saat: 14:55)3ddark Adlı Kullanıcıdan Alıntı: Ben bu Generic TTable<T> sınıfı ufrmBase içinde kullanmak istiyorum. Fakat T nedir anlamıyorum diyor. Formu da Generic olarak(TfrmBase<T> = class(TForm)) yaptığımda da farklı hatalar alıyorum. Nasıl yol alabilirim.
type

 TStok = class

 end;

 TTable<T> = class
 private
   FList: TList<T>;
 public
   property List: TList<T> read FList;
 end;

  TBaseForm<T> = class(TForm)
  protected
    FTable : TTable<T>;
  public
    constructor Create(
     AOwner: TComponent;
     AParentForm: TForm = nil;
     ATable: TTable<T> = nil);reintroduce;overload;
  end;

  TForm1 = class(TBaseForm<TStok>)
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TBaseForm<T> }
constructor TBaseForm<T>.Create(
     AOwner: TComponent;
     AParentForm: TForm = nil;
     ATable: TTable<T> = nil);
begin
   inherited Create(AOwner);
end;


İsmail hocam cevap için teşekkürler fakat o şekilde de olmuyor. Olmama sebebi ise form create edilirken verdiğimiz TStok sınıfından dolayı
Project xxx.exe raised exception class EResNotFound with message 'Resource TfrmStok<uStok.TStok> not found'.
veriyor.

Ayrıca bu şekilde formların tasarım ekranlarına ulaşmak isterken hatalar alıyorum.
Error in module ufrmBase: Declaration of class TfrmBase is missing or incorrect.

Projenin deneme kodlarını ekliyorum.
.zip   GenericCollectionTest.zip (Dosya Boyutu: 4,39 KB / İndirme Sayısı: 5)

Çok fazla kombinasyon denedim fakat doğru yolu bulamadım.

Aynı yapıyı Generics olmadan kullandığımda sorunsuz çalışıyor. Fakat bu şekilde kullanımın tek dev avantajı TList kullanırken liste içine doldurulan sınıfı cast etmek veya kontrol kullanmak gerekiyor. Ayrıca BaseForm da tanımlı Table sınıfını kullanırken TTable sınıfından türetilmiş diğer sınıflara özel kullanmak için cast veya kontrol yapmam gerekiyor. Otomatik olarak Table sınıfı TStok olmuyor.
PostgreSQL - Linux - Delphi, Poliüretan
WWW
Cevapla
#4
(20-08-2020, Saat: 22:28)3ddark Adlı Kullanıcıdan Alıntı:
(20-08-2020, Saat: 22:04)ismailkocacan Adlı Kullanıcıdan Alıntı:
type

 TStok = class

 end;

 TTable<T> = class
 private
   FList: TList<T>;
 public
   property List: TList<T> read FList;
 end;

  TBaseForm<T> = class(TForm)
  protected
    FTable : TTable<T>;
  public
    constructor Create(
     AOwner: TComponent;
     AParentForm: TForm = nil;
     ATable: TTable<T> = nil);reintroduce;overload;
  end;

  TForm1 = class(TBaseForm<TStok>)
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TBaseForm<T> }
constructor TBaseForm<T>.Create(
     AOwner: TComponent;
     AParentForm: TForm = nil;
     ATable: TTable<T> = nil);
begin
   inherited Create(AOwner);
end;


İsmail hocam cevap için teşekkürler fakat o şekilde de olmuyor. Olmama sebebi ise form create edilirken verdiğimiz TStok sınıfından dolayı
Project xxx.exe raised exception class EResNotFound with message 'Resource TfrmStok<uStok.TStok> not found'.
veriyor.

Ayrıca bu şekilde formların tasarım ekranlarına ulaşmak isterken hatalar alıyorum.
Error in module ufrmBase: Declaration of class TfrmBase is missing or incorrect.

Projenin deneme kodlarını ekliyorum.

Çok fazla kombinasyon denedim fakat doğru yolu bulamadım.

Aynı yapıyı Generics olmadan kullandığımda sorunsuz çalışıyor. Fakat bu şekilde kullanımın tek dev avantajı TList kullanırken liste içine doldurulan sınıfı cast etmek veya kontrol kullanmak gerekiyor. Ayrıca BaseForm da tanımlı Table sınıfını kullanırken TTable sınıfından türetilmiş diğer sınıflara özel kullanmak için cast veya kontrol yapmam gerekiyor. Otomatik olarak Table sınıfı TStok olmuyor.
.dfm'si olan bir base form eklememiştim.Örnek ekliyorum.


Ek Dosyalar
.zip   GenericCollectionTest.zip (Dosya Boyutu: 7,19 KB / İndirme Sayısı: 11)
WWW
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  webbrowser form file nesnesine dosya ekleme ugorkem 4 220 20-01-2021, Saat: 12:30
Son Yorum: ugorkem
  Ana Form içinde açılır kapanır form akuyumcu63 3 203 20-01-2021, Saat: 11:35
Son Yorum: mrmarman
  servis uygulamasında debug nasil yapilir ? adelphiforumz 11 396 14-01-2021, Saat: 11:56
Son Yorum: tuna
  Delphi BluetoothLE Nasıl Kullanılır? batuhan53 1 170 26-12-2020, Saat: 22:22
Son Yorum: 41linea41
  Resmin efectli geçiş ile gelmesi nasıl yapılır? Cyb3r 29 1.656 26-12-2020, Saat: 21:08
Son Yorum: Cyb3r



Konuyu Okuyanlar: 1 Ziyaretçi