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
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…
Teşekkür ederim özkancım, devamı gelecek inşallah. Bunlar eski makalelerim, yenilerini de haftasonunda hazırlamayı düşünüyorum.