Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
{$} Nedir
#11
Örnek konusunda yardımcı olayım.

* Çok farklı çeşitlerde direktif tanımlanabilir. Aynı UNIT altına üst kısımlarda bir yerlerde tanımlanabileceği gibi tüm projede tanınabilen halleri de vardır. Burada ona örnek vereceğim.

* Aynı projenin üç farklı modülü var diyelim. Aynı veritabanına erişiyor fakat modüle özel yetkiler ile donatılması gerekiyor.
* Modüllerden birisi Koordinasyon, diğeri Birim, bir diğeri de Gözlemci modülü olsun.

* Her üçünde de ortak olan kodları bir UNIT altında toplarız, kod ekonomisi dışında eğer bir güncelleme gerekirse aynı anda üç proje için ayrı ayrı kod yazmaktan kurtuluruz değil mi ? Bu güncelleme ne olabilir : Veritabanı alanlarından daha önce olmayan yeni bir alan eklediniz ve projenizde bu alana atıfta bulunacak değişiklikler yapacaksınız. Ortak UNIT içerisinde yapılan değişiklik her üç modül proje için de geçerli olacaktır. Adı üzerinde ortak modül. -tabii demeye gerek yok ama diyeyim, yeniden derlemek şartıyla- 

* Şimdi konumunza gelip DEFINE olayını nasıl kullanıyoruz onu anlatayım.

Modüllerden Koordinasyon Modülü en kapsayıcı olanı olsun, her türlü menü elemanına erişsin. Birim Modülü orta seviye yetkili olsun sadece ilgili birimi ilgilendiren kısımlara erişsin. Gözlemci modülü en düşük yetkili olsun o da sadece raporlama alabilsin.

* Projenin 
ycatatqsoxcdn3xwio4j.png

Projenin istediğiniz bir UNIT'inde eğer o kısım birden farklı projenizde veya modülde kullanılacaksa aşağıdaki şekilde USES kısımlarını ayırabilirsiniz.

fovvxyiqwuz0frfvlc23.png
Aynı zamanda kod içerisinde -örneğin aşağıdaki excel export kısmından bir kesit var- modüle göre raporlamalada kiminde kişinin telefon numarası görünsün, kimisinde görünmesin ama bu defa epostası görünsün istendiğinden bu şekilde tasarlandı. 

ge60dwxjkmly14fb4whg.png

Dolayısıyla aynı rapor fonksiyonu/procedure üç farklı projede çalışırken direktife göre farklı çıktı sunacaktır.

Bu sadece bir örnek, direktif olarak bir UNIT'in başında onun Windows altında çalışırken şöyle kullan, Android altında şöyle, FMX ise şöyle, VCL ise böyle kullan diyebilirsiniz. Onun için bu verdiğim örnek gibi değil direkt unit'in ilk satırlarına 
// Platform Selection
// -------------------------
//{$DEFINE HAS_FMX}
  {$DEFINE HAS_VCL}
// -------------------------

şeklinde bir tanım koyarsınız, birisinin başına // koyup comment altına alıp devre dışı bırakırsınız.

Kodlarınızı da aşağıdaki şekilde çift ihtimalli yazarsınız.
  {$IF defined(HAS_FMX)}
    FMX.Dialogs, FMX.Graphics,
    FMX.DialogService,
    FireDAC.FMXUI.Wait, {FDGUIxWaitCursor.Provider := 'FMX'}
  {$ENDIF}
  {$IF defined(HAS_VCL)}
    Vcl.Dialogs,
    FireDAC.VCLUI.Wait, {FDGUIxWaitCursor.Provider := 'Forms'}
  {$ENDIF}


Projeyi derlemeden önce proje tipiniz hangisi ise // olanı diğerine koyarsınız aynı kodun diğer versiyonunu kullanırsınız.

Umarım karışıklık yaratmadan özetleyebilmişimdir.
 
Saygılarımla
Muharrem ARMAN

guplouajuixjzfm15eqb.gif


Cevapla
#12
Burada aşağıdaki DUMMY_VALUE define kısmını açıklama satırından çıkarırsanız. Bir alttaki ifdef bloğu aktif olur. Hatta bu durumu DEBUG modunda kendiniz derleyerek kontrol edebilirsiniz. ifdef içindeki satırlara break point ekleyebilir ve derleyicinin orada durmasını sağlayabilirsiniz.

Fakat define kısmı açıklama olarak kalırsa yani öyle bir tanımlama yoksa ifdef içindeki blok derlemeye dahil edilmez. DEBUG işleminde de orada break point ekleme ve durdurma işlemini yapamazsınız.

Ben bu işler için projeye bir .inc dosyası dahil ediyorum. Bu inc dosyasını projenin tüm dosyalarında {$I DosyaAdiniz.inc} şeklinde dahil ediyorum ve bu DEFINE tanımlarını da buradan aktif veya pasif ediyorum.

//{$DEFINE DUMMY_VALUE}
{$ifdef DUMMY_VALUE}
  if FormMode = ifmNewRecord then
  begin
    edtstok_kodu.Text := 'ELMKA';
    edtstok_adi.Text := 'KIRMIZI ELMA AMASYA';
    edtsatis_fiyat.Text := '3';
  end;
{$EndIf}
PostgreSQL - Linux - Delphi, Poliüretan
WWW
Cevapla
#13
Herkese Cok tesekur ederım.. Gayet açıklayıcı Olmuş Smile

(23-02-2021, Saat: 15:35)3ddark Adlı Kullanıcıdan Alıntı: Burada aşağıdaki DUMMY_VALUE define kısmını açıklama satırından çıkarırsanız. Bir alttaki ifdef bloğu aktif olur. Hatta bu durumu DEBUG modunda kendiniz derleyerek kontrol edebilirsiniz. ifdef içindeki satırlara break point ekleyebilir ve derleyicinin orada durmasını sağlayabilirsiniz.

Fakat define kısmı açıklama olarak kalırsa yani öyle bir tanımlama yoksa ifdef içindeki blok derlemeye dahil edilmez. DEBUG işleminde de orada break point ekleme ve durdurma işlemini yapamazsınız.

Ben bu işler için projeye bir .inc dosyası dahil ediyorum. Bu inc dosyasını projenin tüm dosyalarında {$I DosyaAdiniz.inc} şeklinde dahil ediyorum ve bu DEFINE tanımlarını da buradan aktif veya pasif ediyorum.

//{$DEFINE DUMMY_VALUE}
{$ifdef DUMMY_VALUE}
  if FormMode = ifmNewRecord then
  begin
    edtstok_kodu.Text := 'ELMKA';
    edtstok_adi.Text := 'KIRMIZI ELMA AMASYA';
    edtsatis_fiyat.Text := '3';
  end;
{$EndIf}
hatta böyle bir örnek var..
"{$Define TEST-DERLEMESI}" tanımlı ise procedure kodları haricinde calisıyor.
{$Define TEST-DERLEMESI}
procedure islemYap;
begin

 //prosedür kodları ..


 {$IFDef TEST-DERLEMESI}
   ShowMessage('Islem yap prosedürü çalıştı..');
 {$EndIf}

end;
Çok Teşekur hepinize  Shy
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Excel Veri Okuma Yöntemi Tercihiniz Nedir? pro_imaj 12 1.060 11-11-2020, Saat: 22:14
Son Yorum: anemos
  Kodun anlaşılabilirliği için nasıl bir yol izliyorsunuz standartlarınız nedir ? boreas 9 3.597 05-12-2018, Saat: 17:38
Son Yorum: cinarbil
  Youtube için kesin çözüm nedir Lord_Ares 20 8.112 24-02-2018, Saat: 08:47
Son Yorum: Lord_Ares
  Bu ifade nedir? savasabd 9 5.679 24-09-2017, Saat: 04:38
Son Yorum: The_aLiEn
  Nvarchar ve varchar farkı nedir? Mericx 1 1.940 24-01-2017, Saat: 10:49
Son Yorum: yhackup



Konuyu Okuyanlar: 1 Ziyaretçi