Her türlü veritipini kıyaslamak için..

// 15 Mayıs 2009 // Delphi, Programlama

Şimdi veritiplerinin kıyaslanması ile alakalı bir dökümana ne gerek var diye düşünebilirsiniz, haklı da olabilirsiniz :) Ama ben yine değişik bir yolla nasıl yapıldığını göstermeye çalışacağım.. Ve bu yol çok esnek bir yol olacak. Şimdi sizlerle bir fonksiyon yazacağız, bu fonksiyon; içerisine karşılaştırılacak veritiplerini alacak ve byte byte kıyaslama yapacak.(En sağlam yöntem :) ) Ardından da sonucu Boolean olarak döndürecek.

Yazmaya başlayalım..

function IsEqual(var Source , Dest ; Size : Integer) : Boolean;
type
	TBytes = array[0..MaxInt-1] of Byte;
var
	N : Integer;
begin
	N := 0;
  while (N <= Size) and (TBytes(Source)[N] = TBytes(Dest)[N]) do Inc(N);
  Result := (N = Size);
end;

Şimdi bu da nedir demeyin, açıklayalım..

Source ve Dest isimli parametreler Delphi’de Untyped Parameters olarak adlandırılırlar..Yani tipi olmayan parametreler.Bu fonksiyona istediğiniz tipte parametre geçebileceğiniz anlamına gelir. Yani integer, word, single, string, record, object, array vs. keyfinize göre ne geçmek isterseniz. Son parametre olan “Size” ise karşılaştırma yapılacak tiplerin veri büyüklüğünü içerir. Şimdi daha iyi anlayabilmek adına bir kaç örnek verelim..

var
	iValue_1 : Integer;
	iValue_2 : Integer;
begin
	iValue_1 := 100;
  iValue_2 := 100;

	if IsEqual(iValue_1, iValue_2 , SizeOf(Integer))
  then ShowMessage('İki değişken birbirine eşit')
  else ShowMessage('İki değişken birbirinden farklı');
end;

Eh şimdi yukarıdaki kıyaslamada bizim çok fazla işimize yaramadı gibi görünüyor bu yeni fonksiyonu kullanmak.Diyebilirsiniz ki “bir if ifadesinde işi bitirebilirdim , ne gerek var canım bu kadar uğraşmaya..” Doğru haklısınız, peki o zaman örneklere devam edelim :)

TMyRecord = record
	Field_1 : String[10];
	Field_2 : Integer;
end;

var
	myRec_1,
	myRec_2 : TMyRecord;
begin
  myRec_1.Field_1 := 'Deneme';
  myRec_1.Field_2 := 2006;

  myRec_2.Field_1 := 'Test';
  myRec_2.Field_2 :=  '2008';

	if IsEqual(myRec_1, myRec_2 , SizeOf(TMyRecord))
	then ShowMessage('İki değişken birbirine eşit')
	else ShowMessage('İki değişken birbirinden farklı');
end;

Peki bu nasıldı, işe yarar mı ;) Şimdi bir başka örnek daha verelim..

var
	iValue : Integer;
	wValue: Word;
begin
	iValue := 100;
	wValue := 100;

	if IsEqual(iValue, wValue , SizeOf(Integer))
	then ShowMessage('İki değişken birbirine eşit')
	else ShowMessage('İki değişken birbirinden farklı');
end;

Peki yukarıdaki test neticesinde ekranda ne yazmasını bekleriz.? “İki değişken birbirine eşit” mesajını bekleriz değil mi, çünkü değişkenlerin içerikleri eşit. Ancak değişkenlerin boyutları birbirinden farklı. Integer 4 byte ve word 2 byte..Biz ise SizeOf(Integer) yazarak 4 byte karşılaştırma yapacağımızı belirttiğimiz için haliyle bu iki değişken birbirine eşit olamıyor. Ama kodumuzdaki SizeOf(Integer) ifadesini SizeOf(Word) olarak değiştirirsek iki değişkenimizinde ilk 2 Byte’ı kıyaslamaya tabi olacakları için sonuç beklediğimiz gibi olur ve değişkenler eşit mesajı verilir. Bu ve buna benzer pek çok kıyaslama yapabilirsiniz. Herhangi bir tipte olan iki array’i de karşılaştırabilirsiniz.. Hayalgücünüze kalmış gerisi..

Kaynak: Delphi Language Guide

Saygılar, sevgiler

“Her türlü veritipini kıyaslamak için..” için 2 Yorum

  1. Özkan Danacı diyor ki:

    hmmmm.
    Böyle bir şey benim aklıma geliyordu bu sıralar..
    Bunu nasıl yapabiliriz yine aklımı kurcalıyordu.
    Araştırma yapmaya da vakit bulamadık işlerin yoğunluğundan.
    Derken abimiz bir site açtı.
    Sabah yenilikleri incelerken ne göreyim. Benim mevzu.
    Dedim bu kadar tevafuk olur.
    Bu tabiki değişik hertürlü iş için kullanılabilir.

    Teşekkür ediyoruz devamını bekliyoruz…

  2. Tuğrul HELVACI diyor ki:

    Teşekkür ederim özkancım, devamı gelecek inşallah. Bunlar eski makalelerim, yenilerini de haftasonunda hazırlamayı düşünüyorum.

Tuğrul HELVACI için yorum yazın