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ı: 9)

Ç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ı: 18)
WWW
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Uygulamaya responsive görünüm nasıl kazandırabilriz ? delphicim 0 218 04-01-2024, Saat: 15:24
Son Yorum: delphicim
  Delphi 7 ye göre MB Döviz kurları nasıl alırız maydin60 7 1.057 31-12-2023, Saat: 02:18
Son Yorum: maydin60
  Optik form kodlama baloglurecep 8 1.294 16-11-2023, Saat: 16:23
Son Yorum: COMMANDX
  ReadProcessMemory ile veri okuma nasıl yapılır eraendless 2 450 07-09-2023, Saat: 00:35
Son Yorum: veteran
  ARRAYi nasıl for'la dönerim. PREDATOR 16 10.041 26-08-2023, Saat: 14:33
Son Yorum: veteran



Konuyu Okuyanlar: 1 Ziyaretçi