Variant tipleri kullanabilirsin. Genelde yavaş diye tavsiye edilmez, ama programın kodunu kullanıcıya yazdırıyorsan bahsedilen yavaşlık seni pek ilgilendirmez sanırım.
Variant'ı hemen de kullanabilirsin, ama güvenli olsun, kontrolümde olsun ve bir kere bütün veri tiplerini tanımlayım, ondan sonra da işim çok kolay olsun diyorsan aşağıdaki kod işini görecektir.
Yeni bir projede formun üstüne bir tane buton ekle. Butonun adı Button1 olsun. Formun adı da Form1 olarak kalsın. Unit1 olarak kaydet ve aşağıdaki kodun tamamını kopyala:
Kod: Tümünü seç
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TDegiskenClass = class of TDegisken;
TDegisken = class(TPersistent)
private
FAd: string;
FDeger: Variant;
protected
function GetDeger: Variant; virtual; abstract;
procedure SetDeger(AValue: Variant); virtual; abstract;
public
constructor Create; virtual;
property Ad: string read FAd write FAd;
property Deger: Variant read GetDeger write SetDeger;
end;
TIntDegisken = class(TDegisken)
protected
function GetDeger: Variant; override;
procedure SetDeger(AValue: Variant); override;
public
constructor Create; override;
end;
TStringDegisken = class(TDegisken)
protected
function GetDeger: Variant; override;
procedure SetDeger(AValue: Variant); override;
public
constructor Create; override;
end;
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
function CreateDegisken(AClassName: string): TDegisken;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
{ TIntDegisken }
constructor TIntDegisken.Create;
begin
inherited;
FDeger := 0;
end;
function TIntDegisken.GetDeger: Variant;
begin
Result := VarAsType(FDeger, varInteger);
end;
procedure TIntDegisken.SetDeger(AValue: Variant);
begin
try
FDeger := VarAsType(AValue, varInteger);
except
on E:Exception do
raise E;
end;
end;
{ TDegisken }
constructor TDegisken.Create;
begin
FDeger := varNull;
end;
{ TStringDegisken }
constructor TStringDegisken.Create;
begin
inherited;
FDeger := '';
end;
function TStringDegisken.GetDeger: Variant;
begin
Result := VarAsType(FDeger, varString);
end;
procedure TStringDegisken.SetDeger(AValue: Variant);
begin
FDeger := VarAsType(AValue, varString);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
Deneme: TDegisken;
begin
Deneme := CreateDegisken('TIntDegisken');
Deneme.Deger := 3;
ShowMessage(IntToStr(Deneme.Deger));
Deneme.Free;
Deneme := CreateDegisken('TStringDegisken');;
Deneme.Deger := 'Bahadır Alkaç';
ShowMessage(Deneme.Deger);
Deneme.Free;
end;
function TForm1.CreateDegisken(AClassName: string): TDegisken;
var
AClass: TPersistentClass;
begin
AClass := FindClass(AClassName);
Result := TDegiskenClass(AClass).Create;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
RegisterClass(TIntDegisken);
RegisterClass(TStringDegisken);
end;
end.
İlla bellek yönetimli bir çözüm istiyorsan elbette o da mümkün. Ama projen ne kadar büyük olursa olsun yazacağın kod değmez. Çünkü o zaman örneğin int için bellekten sizeof(int) kadar yer alacaksın. Bunun için get/set fonksiyonları yazman gerekiyor. Fonksiyonların return/parametre tipleri birbirine uygun olmadığı için genel bir sınıf yapısı kullanamayacaksın. Dolayısıyla projeyi kodlarken çok daha fazla vakit kaybedeceksin (hem kodlama, hem de programın çalışma hızı).
Son olarak Pascal script (ya da diğer diller olabilir) kullanmak çok daha mantıklı. Ve hepsinden önemlisi, son kullanıcıya kod yazdıracaksak, biz ne iş yapacağız? Delphi'yi üreten firma da son kullanıcıya (yani bize

Kolay gelsin,
Bahadır Alkaç
Kolay gelsin,
Bahadır Alkaç