Delphi’de Değişkenler – 2

Bir önceki yazımda tanımını yapmıştım ve veri tiplerinden bahsetmiştim.

c. Değişken Tanımlarken Dikkat Edilecek Hususlar:

Delphide değişkenleri kullanmadan önce tanımlama mecburiyeti vardır. Bir değişken kullanılmadan önce  o değişkende nasıl bir bilginin tutulacağının belirlenmesi gerekir.

Değişken tanımlanırken şu kuralların göz önünde bulundurulması gerekir:

  • Değişken adları 63 karakter uzunluğunu geçmemelidir. Değişken adının 63 karakteri geçmesi halinde 63. karakterden sonraki kısımlar göz ardı edilir.
  • Değişken adları türkçe karakter içermemelidir. ya alfabetik (ingiliz alfabesi) harflerle yada “_” karakteriyle başlamalıdır.(A..Z,a..z),0..9 arası rakamlar veya “_” (Delphi 2010 daki unicode desteği sayesinde türkçe değişken isimleri kullanılabilir)
  • Değişken adları semboller içermemelidir. ($,*,% vb)
  • Delphi komutları değişken adı olarak kullanılmamalıdır. (Chr, not,IntToStr vs.)

d. Kullanım Şekillleri

d.a. Basit Kullanım:
var bloğunda değişken ismi : değişken tipi; şeklinde tanım yapabilirsiniz.
örneğin

procudure Button1Click(Sender:TObject);
var
s:String;
begin
s:='Merhaba Ahiret';
ShowMessage(s);
end;

d.b. Sabit Değişken:
Bazı durumlarda değeri hiç değişmeyen sabit bir değişken tanımlamak
isteyebilirsiniz. Mesela matematikteki pi sayısı veya logaritmada kullanılan e
sayısı gibi, işte bu tip değişkenleri özel bir bildirimle yapmalısınız. Aşağıda bu
husus örneklendirilmiştir.

const// var la değil
pi:Double=3,14 // değer atanması zorunludur
var
ycap:integer;
alan:double;
begin
ycap:=strtoint(edit1.text) //değişkene değer atanıyor
alan:=pi*ycap*ycap;//alanı hesapla
form1.caption:='Dairenin Alanı = ' +floattostr(alan);
end;

Const’la tanımlamış olduğunuz değişkenin değerini procedure içerisinde değiştiremezsiniz (Özel birim ile yapabilirsiniz).

d.c. Local Static Değişken:
Procedure içerisinde (Global değişken olabilmesi için özel tanımlama blokları
mevcuttur, daha sonraki kısımlarda incelenecektir.) tanımlanan bir değişken,
kod işletildiği anda bellekte yaratılır, kodun tamamı işletildikten sonra da
bellekten atılır. Procedure’ü ikinci kez tekrar işlettiğiniz zaman aynı işlemler
tekrarlanacaktır. Bu durumda şöyle bir problemle karşı karşıya kalırız.
Procedure’ü ilk işlettiğimiz zaman değişkenimize en son atanan değeri, ikinci
işleteceğimiz zaman kullanmak istersek (Yani değişkenin en son aldığı değeri
bir sonraki çağrılmada hatırlamak istersek) ne yapabiliriz? Cevabı çok basit, o
değişkeni static olarak tanımlarsınız. Local bir değişkenin static olarak
tanımlanması, o procedure’ü ikinci kez (veya daha fazla) işlettiğiniz zaman
önceki tur bulduğu değeri kullanmasını sağlayacaktır. Bu olay bir çok durumda
işinize tahmininizden daha fazla yarayacaktır.
Aşağıda bu husus örneklendirilmiştir.

Formunuza bir adet button kontrolü ekleyip aşağıdaki kodu Clik Yordamına
yazın. Projeyi çalıştırdıktan sonra arka arkaya buttona tıklayın, formun
başlığındaki metne dikkat ederseniz en son bırakılan değerlerin bir sonraki
procedure işletilmesi sırasında hatırlandığını göreceksiniz.

{$j+} // bu satır static değişken tanımlamak için gerekli
procedure tForm1.button1click (sender: tObject);
const
toplam:integer=0 ;
deger:integer=1 ;
begin
toplam:=toplam+deger;// önceki toplama ekle
form1.caption:=inttostr(deger)+ //altsatıra inebilirsiniz
'e kadar olan sayıların toplamı = ' + inttostr(toplam) + 'eder' ;
deger:=deger+1 // degeri bir arttır
end;

Pencerede kullanılan {$j+} satırı, Const ile tanımlanan sabit değişkenin
değerinin procedure içerisinde yeniden atanabilmesi (değiştirilebilmesi) için
gerekli olan bir kod parçasıdır. Bu satırı eklemezseniz, Delphi size Const ile
tanımlanan bir değişkenin değerini değiştiremeyeceğinize dair hata mesajı
iletecektir. Hatırlatalım bu satırı procedure içerisinde de tanımlayabilirsiniz
(Ama Const tan sonra bildirmeniz anlamsız olacaktır).

 

d.d. Tüm Alt Yordamlar Tarafından Kullanılabilen Değişken:
Bu işleme global değişken tanımlama adını veriyoruz. Bu olayı örneklendirecek olursak; birinci buttona tıkladığınız zaman
değişkene atadığınız değeri, ikinci buttona tıkladığınız zaman kullanmak
isterseniz o değişkeni global olarak tanımlamalısınız. Aşağıdaki Delphi Unit’i
içerisinde global değişkenleri nasıl tanımlayabileceğiniz örneklendirilmiştir.
Formunuzun üzerine iki adet button kontrolü ekleyip, aşağıdaki kodları da
gerekli olan yordamlara yazınız.

implemetation
{$R *.dfm}
var
deger:integer ; // tüm alt yordamlar tarafından kullanılabilir.
procedure tForm1.button1click (sender: tObject);
begin
deger:=deger+10 ; // 10 sayı ekle
form1.caption:=inttostr(deger); //başlıkta yaz
end;
procedure tForm1.button2click (sender: tObject);
begin
deger:=deger+3 ;
form1.caption:=inttostr(deger); //başlıkta yaz
end;

Görüldüğü gibi iki procedure’de aynı “deger” isimli değişkeni kolaylıkla
kullanabilmektedir. Global değişkenler procedure’ün işletilmesi bittiği anda
bellekten atılmadıkları için, bir procedure’ün sonundaki değişkenin değeri diğer
procedure içerisinde hatırlanabilmektedir.
Şimdi uygulamanızı çalıştırıp her iki buttona tıklayın, değişkenin değerinin
hatırlandığı sanıyorum dikkatinizi çekecektir. Burada şunu sorabilirsiniz neden
bütün değişkenleri burada tanımlamıyoruz? Cevabı son derece basittir. Birincisi
bu değişkenler bellekte devamlı yer işgal edeceklerinden performansı
etkileyeceklerdir. İkincisi ise hangi değişkenin hangi procedur’ler için
tanımlandığı büyük uygulamalar için karmaşa yaratacaktır. Bu sebeplerden
dolayı önceliği hep local değişken tanımlamaya veriniz.

Global değişken tanımlamak için Delphi size başka bir blok daha sunmaktadır.
Dilerseniz Sadece o Unit içerisinde kullanmak üzere değişkeninizi Private
Declarations kısmında tanımlayabilirsiniz. Eğer global değişkeninizi bu blokta
tanımlayacaksanız, o zaman var veya const bildirisini kullanamazsınız.

type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
// global değişken burada tanımlanabilir
deger:integer; // tüm alt yordamlar tarafından kullanılabilir
{ Private declarations }
public
{ Public declarations }
end;

d.d. Tüm Yordamlar Tarafından Kullanılabilen Değişken (Halka Açık, Umumi):
Bazen A formundaki değişkene B formundan erişmeniz gerekebilir. İşte o zaman bu metodu kullanmalısınız.

type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
deger:integer; // tüm yordamlar tarafından kullanılabilir
{ Public declarations }
end;

Şimdi projenize iki form ekleyin 1. sinde Public bloğunda deger:integer; tanımını yapın. ve bir button ekleyip;

procedure tForm1.button1click (sender: tObject);
begin
form2.ShowModal;//Form2' yi Aç
//form2.Show;//buda Form2' yi Açar Farkı: ShowModal ile açtığınızda arkadaki forma erişemezsiniz.
end;

Şimdi ise 2. forma bir Button ekleyip şunları yazın;

procedure tForm2.button1click (sender: tObject);
begin
form1.deger:=form1.deger+1;//değerimizi 1 arttırdık
form1.Caption:=IntToStr(form1.Deger);//form1 in caption ına Deger değişkenini yazdırırten IntToStr() kullandık çünkü: Sayısal bir veriyi direk string olarak yazdıramayız...
Close;//formu kapattık
end;

Tags: , , ,

No comments yet.

Leave a Reply

*