Delphi direktifleriyle derleyici versiyonunu elde etmek

Yazdığınız makaleleri ve üyelerimizin işine yarayacağını düşündüğünüz kodlarınızı gönderebilirsiniz. Bu foruma soru sormayın!
Cevapla
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3077
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Delphi direktifleriyle derleyici versiyonunu elde etmek

Mesaj gönderen sabanakman »

İyi günler. Aslında gugıl'a sorunca cevabını hemen yapıştırıyor ama el altında olması açıcından bir de ben paylaşayım istedim :mrgreen: . Kodlarınız hangi delphi versiyonunda derleniyor bunu bulan basit bit yapı. Malum farklı derleyicilerde değişen şekillerde çalıştığı durumlar olabiliyor, bu durumu kontrol altına almak için kullanılabilir bir yapı (aradabir lazım olsa da lazım olduğunda aramaktan sıkıldım, artık buradan bakarım :twisted: ).

Kod: Tümünü seç

function DelphiVersiyonu:String;
begin
  Result:=
{$IF Defined(VER80)}
  'Delphi 1'
{$ELSEIF Defined(VER90)}
  'Delphi 2'
{$ELSEIF Defined(VER100)}
  'Delphi 3'
{$ELSEIF Defined(VER120)}
  'Delphi 4'
{$ELSEIF Defined(VER130)}
  'Delphi 5'
{$ELSEIF Defined(VER140)}
  'Delphi 6'
{$ELSEIF Defined(VER150)}
  'Delphi 7'
{$ELSEIF Defined(VER160)}
  'Delphi 8'
{$ELSEIF Defined(VER170)}
  'Delphi 2005'
{$ELSEIF Defined(VER180)}
  'Delphi 2006'
{$ELSEIF Defined(VER190)}
  'Delphi 2007'
{$ELSEIF Defined(VER200)}
  'Delphi 2009'
{$ELSEIF Defined(VER210)}
  'Delphi 2010'
{$ELSE}
  'Bilinmeyen yeni versiyon'
{$IFEND};
end;
şeklindeki bir fonksiyon (ShowMessage(DelphiVersiyonu)) programı hangi versiyonda derlediğinizi söyleyecektir. Mesela Unicode desteği Delphi 2009 ve sonrasında geldiği için karakter parametre alan bazı fonksiyonlar sorun çıkarabilmektedirler. Mesele aşağıdaki yapı ile çözülebilir. Bunun gibi farklı delphi versiyonlarında farklı çalışan kodları şekillendirip, versiyonlar arası sorunsuz çalışan kodlar bu bildirimlerle sağlanılabilmektedir. Örnek olarak MessageBox fonsiyonu ele alınırsa

Kod: Tümünü seç

{$IF Defined(VER80)}
  {$DEFINE Delphi1}
{$ELSEIF Defined(VER90)}
  {$DEFINE Delphi2}
{$ELSEIF Defined(VER100)}
  {$DEFINE Delphi3}
{$ELSEIF Defined(VER120)}
  {$DEFINE Delphi4}
{$ELSEIF Defined(VER130)}
  {$DEFINE Delphi5}
{$ELSEIF Defined(VER140)}
  {$DEFINE Delphi6}
{$ELSEIF Defined(VER150)}
  {$DEFINE Delphi7}
{$ELSEIF Defined(VER160)}
  {$DEFINE Delphi8}
{$ELSEIF Defined(VER170)}
  {$DEFINE Delphi2005}
{$ELSEIF Defined(VER180)}
  {$DEFINE Delphi2006}
{$ELSEIF Defined(VER190)}
  {$DEFINE Delphi2007veUstu}
{$ELSEIF Defined(VER200)}
  {$DEFINE Delphi2007veUstu}
  {$DEFINE Delphi2009veUstu}
{$ELSEIF Defined(VER210)}
  {$DEFINE Delphi2007veUstu}
  {$DEFINE Delphi2009veUstu}
  {$DEFINE Delphi2010veUstu}
{$ELSE}
  {$DEFINE Delphi2007veUstu}
  {$DEFINE Delphi2009veUstu}
  {$DEFINE Delphi2010veUstu}
  {$DEFINE Delphi2010Ustu}
{$IFEND}

type
  myPChar=
{$IFDEF Delphi2009veUstu}
  PWideChar
{$ELSE}
  PChar
{$ENDIF};

procedure TForm1.Button1Click(Sender: TObject);
var S:String;
begin
  Caption:=DelphiVersiyonu;
  S:='Deneme';
  MessageBox(Handle,myPChar(S),'Dikkat',0);
end;
gibi bir yapı kurarak myPChar tip tanımı ile versiyonlar arası sorunsuz çalışan bir yapımız olacaktır (myPChar Delphi2009veUstu versiyonlar için PWideChar daha eski sürümler için PChar tipinde olacaktır ve MessageBox(Handle,myPChar(S),'Dikkat',0); kodu hiç bir delphi versiyonunda hata vermeden çalışacaktır). Buna paralel olarak farklı mantık yapıları da kurulabilir tabi. Maksat bilgi paylaşımı olsun :D . İyi çalışmalar.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
Kullanıcı avatarı
Lost Soul
Üye
Mesajlar: 1064
Kayıt: 01 Nis 2007 02:55
Konum: mekan ANKARA toprak ELAZIĞ
İletişim:

Re: Delphi direktifleriyle derleyici versiyonunu elde etmek

Mesaj gönderen Lost Soul »

Bu da benim katkım olsun aşağıdaki kod bir çok kütüphane için kullanılan hazır bir şablon.
inc dosyası olarak kaydedip unitlerden

Kod: Tümünü seç

{$I Ornek.inc} 
şeklinde çağrabilirsiniz.
d2010, free pascal ve c builder de mevcut içinde.

Kod: Tümünü seç

{$B-} {- Complete Boolean Evaluation }
{$R-} {- Range-Checking }
{$T-} {- Typed @ operator }
{$P+} {- Open string params }
{$H+} {- Use long strings by default }

{$IFNDEF FPC}
  {$V-} {- Var-String Checking }
  {$X+} {- Extended syntax }
  {$J+} {- Writeable structured consts }
{$ENDIF}

{$IFDEF VER120}      // Delphi 4.0
  {$DEFINE Delphi4}
{$ENDIF}

{$IFDEF VER130}      // Delphi 5.0
  {$DEFINE Delphi4}
  {$DEFINE Delphi5}
{$ENDIF}

{$IFDEF VER140}      // Delphi 6.0
  {$DEFINE Delphi4}
  {$DEFINE Delphi5}
  {$DEFINE Delphi6}
  {$WARN SYMBOL_PLATFORM OFF}
  {$WARN UNIT_PLATFORM OFF}
{$ENDIF}

{$IFDEF VER150}      // Delphi 7.0
  {$DEFINE Delphi4}
  {$DEFINE Delphi5}
  {$DEFINE Delphi6}
  {$DEFINE Delphi7}
  {$WARN UNSAFE_CODE OFF}
  {$WARN UNSAFE_TYPE OFF}
  {$WARN UNSAFE_CAST OFF}
  {$WARN SYMBOL_PLATFORM OFF}
  {$WARN UNIT_PLATFORM OFF}
{$ENDIF}

{$IFDEF VER170}      // Delphi 9.0
  {$DEFINE Delphi4}
  {$DEFINE Delphi5}
  {$DEFINE Delphi6}
  {$DEFINE Delphi7}
  {$DEFINE Delphi9}
  {$WARN UNSAFE_CODE OFF}
  {$WARN UNSAFE_TYPE OFF}
  {$WARN UNSAFE_CAST OFF}
  {$WARN SYMBOL_PLATFORM OFF}
  {$WARN UNIT_PLATFORM OFF}
  {$WARN SYMBOL_DEPRECATED OFF}
  {$WARN UNIT_DEPRECATED OFF}
{$ENDIF}

{$IFDEF VER180}      // Delphi 10.0
  {$DEFINE Delphi4}
  {$DEFINE Delphi5}
  {$DEFINE Delphi6}
  {$DEFINE Delphi7}
  {$DEFINE Delphi9}
  {$DEFINE Delphi10}
  {$DEFINE RICHBCB}
  {$WARN UNSAFE_CODE OFF}
  {$WARN UNSAFE_TYPE OFF}
  {$WARN UNSAFE_CAST OFF}
  {$WARN SYMBOL_PLATFORM OFF}
  {$WARN UNIT_PLATFORM OFF}
  {$WARN SYMBOL_DEPRECATED OFF}
  {$WARN UNIT_DEPRECATED OFF}
{$ENDIF}

{$IFDEF VER185}      // Delphi 11.0
  {$DEFINE Delphi4}
  {$DEFINE Delphi5}
  {$DEFINE Delphi6}
  {$DEFINE Delphi7}
  {$DEFINE Delphi9}
  {$DEFINE Delphi10}
  {$DEFINE Delphi11}
  {$DEFINE RICHBCB}
  {$WARN UNSAFE_CODE OFF}
  {$WARN UNSAFE_TYPE OFF}
  {$WARN UNSAFE_CAST OFF}
  {$WARN SYMBOL_PLATFORM OFF}
  {$WARN UNIT_PLATFORM OFF}
  {$WARN SYMBOL_DEPRECATED OFF}
  {$WARN UNIT_DEPRECATED OFF}
{$ENDIF}

{$IFDEF VER190}      // Delphi 11.0
  {$DEFINE Delphi4}
  {$DEFINE Delphi5}
  {$DEFINE Delphi6}
  {$DEFINE Delphi7}
  {$DEFINE Delphi9}
  {$DEFINE Delphi10}
  {$DEFINE Delphi11}
  {$DEFINE RICHBCB}
  {$WARN UNSAFE_CODE OFF}
  {$WARN UNSAFE_TYPE OFF}
  {$WARN UNSAFE_CAST OFF}
  {$WARN SYMBOL_PLATFORM OFF}
  {$WARN UNIT_PLATFORM OFF}
  {$WARN SYMBOL_DEPRECATED OFF}
  {$WARN UNIT_DEPRECATED OFF}
{$ENDIF}

{$IFDEF VER200}      // Delphi 12.0
  {$DEFINE Delphi4}
  {$DEFINE Delphi5}
  {$DEFINE Delphi6}
  {$DEFINE Delphi7}
  {$DEFINE Delphi9}
  {$DEFINE Delphi10}
  {$DEFINE Delphi11}
  {$DEFINE Delphi12}
  {$DEFINE RICHBCB}
  {$WARN UNSAFE_CODE OFF}
  {$WARN UNSAFE_TYPE OFF}
  {$WARN UNSAFE_CAST OFF}
  {$WARN EXPLICIT_STRING_CAST OFF}
  {$WARN EXPLICIT_STRING_CAST_LOSS OFF}
  {$WARN SYMBOL_PLATFORM OFF}
  {$WARN UNIT_PLATFORM OFF}
  {$WARN SYMBOL_DEPRECATED OFF}
  {$WARN UNIT_DEPRECATED OFF}
{$ENDIF}

{$IFDEF VER210} // Rad Studio 13.0
  {$DEFINE Delphi4}
  {$DEFINE Delphi5}
  {$DEFINE Delphi6}
  {$DEFINE Delphi7}
  {$DEFINE Delphi9}
  {$DEFINE Delphi10}
  {$DEFINE Delphi11}
  {$DEFINE Delphi12}
  {$DEFINE Delphi14}
  {$DEFINE RICHBCB}
  {$WARN UNSAFE_CODE OFF}
  {$WARN UNSAFE_TYPE OFF}
  {$WARN UNSAFE_CAST OFF}
  {$WARN EXPLICIT_STRING_CAST OFF}
  {$WARN EXPLICIT_STRING_CAST_LOSS OFF}
  {$WARN SYMBOL_PLATFORM OFF}
  {$WARN UNIT_PLATFORM OFF}
  {$WARN SYMBOL_DEPRECATED OFF}
  {$WARN UNIT_DEPRECATED OFF}
{$ENDIF}


{$IFDEF VER125}      // Borland C++ Builder 4.0
  {$DEFINE Delphi4}
  {$ObjExportAll On}
  {$DEFINE BCB}
  {$DEFINE RICHBCB}
{$ENDIF}

{$IFDEF VER130}      // Borland C++ Builder 5.0
  {$IFDEF BCB}
    {$ObjExportAll On}
    {$DEFINE RICHBCB}
  {$ENDIF}
{$ENDIF}

{$IFDEF VER140}      // Borland C++ Builder 6.0
  {$IFDEF BCB}
    {$ObjExportAll On}
    {$DEFINE RICHBCB}
  {$ENDIF}
{$ENDIF}

{$IFDEF FPC} // Free pascal compiler
  {$MODE DELPHI}

  {$DEFINE Delphi4}
  {$DEFINE Delphi5}
  {$DEFINE Delphi6}
{$ENDIF}
savasgti
Üye
Mesajlar: 103
Kayıt: 07 Eki 2008 06:13

Re: Delphi direktifleriyle derleyici versiyonunu elde etmek

Mesaj gönderen savasgti »

Lostsoul üstat bu gönderdiğiniz kod ne işe yarıyor.
Cevapla