Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Compiler Directive İle Değişken Kodlama
#1
Question 
Merhaba arkadaşlar,

Compiler Directive yapısı ile değişken kod yazmak istiyorum,

birden çok uygulama (exe) de kullanmak istediğim ortak formlarım var, (Örneğin ERP ve ERP yönetim uygulamaları)

directive lerin unit bazlı olması yani global olmaması nedeniyle işin içinden çıkamıyorum,

en son şöyle bir mantık kurmak istedim,


{$IF uygulamaadi='ERP' }
erpye özgü kodlar
{$ENDIF}

{$IF uygulamaadi='ERPSYS' }
yönetime özgü kodlar
{$ENDIF}


uses içerisinde ve her türlü kod arasında bu yapıyı kullanmam lazım, aklıma gelen tek yöntem bu şekilde yapmak oldu ama delphi exename i alamıyor yada işleyemiyorum,

yol gösterebilir misiniz.
There is no place like "127.0.0.1"

"Vatanını en çok seven, görevini en iyi yapandır."

Cevapla
#2
Önerim, sınıf yapısı ile kod çeşitliliği sağlamak yönündedir.

Avantajları
1. ortak fonksiyon/procedure kullandırabilirsiniz
( web çağrı, string fonksiyon, db fonksiyon vb. ortak olabilir)
2. Yönetim için bağımsız fonksiyon /proc yazabilir bunlar içerisinden ortak veya lazım oldukça istemci fonksiyon /procedure kullanabilirsiniz
3 Client için bağımsız fonksiyon / procedure yazabilir, ortak veya server procedure / function kullandırabilirsiniz.


Create zamanı (construction) exenin ne olduğuna bakıp sınıfı farklılaştırabilirsiniz.
Saygılarımla
Muharrem ARMAN

guplouajuixjzfm15eqb.gif
Cevapla
#3
(22-08-2023, Saat: 22:45)mrmarman Adlı Kullanıcıdan Alıntı: Önerim, sınıf yapısı ile kod çeşitliliği sağlamak yönündedir.

Avantajları
1. ortak fonksiyon/procedure kullandırabilirsiniz
( web çağrı, string fonksiyon, db fonksiyon vb. ortak olabilir)
2. Yönetim için bağımsız fonksiyon /proc yazabilir bunlar içerisinden ortak veya lazım oldukça istemci fonksiyon /procedure kullanabilirsiniz
3 Client için bağımsız fonksiyon / procedure yazabilir, ortak veya server procedure / function kullandırabilirsiniz.


Create zamanı (construction) exenin ne olduğuna bakıp sınıfı farklılaştırabilirsiniz.

Cevabınız için teşekkür ederim,

bilgiye erişim noktasında uğraştırıcı da olsa, çözüm gayet basit idi,

Project -> Options -> Building -> Delphi Complier -> Conditional defines bölümüne kullandığım her bir exe ye özel tanım ekledim,

daha sonra bu tanımları her prosedür veya uses bölümünü kapsayacak şekilde eklediğimde, projeye özel kod ve uses alanlarım oluşmuş oldu.

kullanmak isteyen arkadaşlar olursa bilgilerine sunarım.
There is no place like "127.0.0.1"

"Vatanını en çok seven, görevini en iyi yapandır."

Cevapla
#4
@YILDIRIMBEY
Bir hatırlatma :

Win32 / Win64 / Debug / Release tercih değişikliklerinde bu define kısmındaki tanımları tazelemeyi ihmal etmeyin.
Saygılarımla
Muharrem ARMAN

guplouajuixjzfm15eqb.gif
Cevapla
#5
@mrmarman Teşekkürler hocam, değişiklikleri "All Configurations" olarak yapmıştım zaten Smile
There is no place like "127.0.0.1"

"Vatanını en çok seven, görevini en iyi yapandır."

Cevapla
#6
//
// veteran
// 24-08-2023
//

uses
 System.SysUtils;

const
 AppType_ERP = 'ERP';
 AppType_ERPSYS = 'ERPSYS';

 AppType = AppType_ERPSYS;

begin
{$IF AppType = AppType_ERP}
   WriteLn( 'ERP' );
{$ELSEIF AppType = AppType_ERPSYS}
   WriteLn( 'ERPSYS' );
{$ELSE}
   WriteLn( '???' );
{$IFEND}

 ReadLn;
end.
.
Cevapla
#7
@veteran

Bu verdiğiniz örnek tam olarak açıklamıyor. Çünkü normal if ile yazsanız aynı sonucu vermeyecek mi ?

Şu şekilde örneklersek kapsamını daha iyi ifade ederiz diye değerlendiriyorum.

Örneğin aşağıda 
1. Uses altında iki farklı unit iki farklı duruma göre alternatifli olarak tanımlanmış oldu. 
* Hangi durumdaysa diğeri henüz derlenirken dahi yok sayılacaktır.

2. Aynı TForm1.BitBtn1Click olayını bir defa tanımladık ama iki defa içerik oluşturduk. 

Derleyici bunlara hata vermeyecektir, duruma göre pozisyon alacaktır.

Tümüyle örneklemek içindir. Anlam yüklemeyelim ... Wink


{$define ERP}

uses
  {$if defined(win32)}
    FireDac.Phys.MongoDB, // Win32 ise MongoDB kullan
  {$elseif defined(win64)}
    FireDac.Phys.MSSQL,   // Win64 ise MSSQL kullan
  {$ifend}
    System.DateUtils;

{$if defined(win32)}
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
  {$if defined(ERP)}
    Showmessage('ERP ve Win32 Projesidir');
  {$else}
    Showmessage('Standart ve Win32 Projesidir');
  {$ifend}
end;
{$else}
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
  {$if defined(ERP)}
    Showmessage('ERP ve Win64 Projesidir');
  {$else}
    Showmessage('Standart ve Win64 Projesidir');
  {$ifend}
end;
{$endif}


Saygılarımla
Muharrem ARMAN

guplouajuixjzfm15eqb.gif
Cevapla
#8
(24-08-2023, Saat: 21:54)mrmarman Adlı Kullanıcıdan Alıntı: @veteran

Bu verdiğiniz örnek tam olarak açıklamıyor. Çünkü normal if ile yazsanız aynı sonucu vermeyecek mi ?

Şu şekilde örneklersek kapsamını daha iyi ifade ederiz diye değerlendiriyorum.

Örneğin aşağıda 
1. Uses altında iki farklı unit iki farklı duruma göre alternatifli olarak tanımlanmış oldu. 
* Hangi durumdaysa diğeri henüz derlenirken dahi yok sayılacaktır.

2. Aynı TForm1.BitBtn1Click olayını bir defa tanımladık ama iki defa içerik oluşturduk. 

Derleyici bunlara hata vermeyecektir, duruma göre pozisyon alacaktır.

Tümüyle örneklemek içindir. Anlam yüklemeyelim ... Wink


{$define ERP}

uses
  {$if defined(win32)}
    FireDac.Phys.MongoDB, // Win32 ise MongoDB kullan
  {$elseif defined(win64)}
    FireDac.Phys.MSSQL,   // Win64 ise MSSQL kullan
  {$ifend}
    System.DateUtils;

{$if defined(win32)}
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
  {$if defined(ERP)}
    Showmessage('ERP ve Win32 Projesidir');
  {$else}
    Showmessage('Standart ve Win32 Projesidir');
  {$ifend}
end;
{$else}
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
  {$if defined(ERP)}
    Showmessage('ERP ve Win64 Projesidir');
  {$else}
    Showmessage('Standart ve Win64 Projesidir');
  {$ifend}
end;
{$endif}



Sayın @mrmarman, emeğinize sağlık. Tebrikler  Cool 
Kod, "if" ifadesi gibi çalışmaz "$IFDEF" ifadesi gibi çalışır:     
Yazdıklarınızı bildiğini varsayarak (ki temel olarak bilinmesi gerekiyor) alternatif bilgi sundum sadece  Wink
.
Cevapla
#9
Mesajımı okumamış ön yargılı yazmışsınız. Sizi üzdüysem kusura bakmayın.

Sadece verdiğiniz örnekte çalışır çalışmaz demek istemedim.

Verdiğiniz örnek içerisinde conditional if/else/end ile normal if / then arasındaki olan farkını bu başlığı okuyanlar için açıklayıcı bulmadığımı ifade ettim.

Onun için vakit ayırıp daha genel bir örnek ile tamamlamayı istedim.

Bu sayede daha ileri bir düzeyde cevap yazma ihtiyacı duydunuz bu da haklı olduğumu gösteriyor sanki... Üzdüğüm için tekrar özür dilerim.
Saygılarımla
Muharrem ARMAN

guplouajuixjzfm15eqb.gif
Cevapla
#10
(24-08-2023, Saat: 22:17)mrmarman Adlı Kullanıcıdan Alıntı: Mesajımı okumamış ön yargılı yazmışsınız. Sizi üzdüysem kusura bakmayın.

Sadece verdiğiniz örnekte çalışır çalışmaz demek istemedim.

Verdiğiniz örnek içerisinde conditional if/else/end ile normal if / then arasındaki olan farkını bu başlığı okuyanlar için açıklayıcı bulmadığımı ifade ettim.

Onun için vakit ayırıp daha genel bir örnek ile tamamlamayı istedim.

Bu sayede daha ileri bir düzeyde cevap yazma ihtiyacı duydunuz bu da haklı olduğumu gösteriyor sanki... Üzdüğüm için tekrar özür dilerim.

Değerli @mrmarman, şartlı direktifler (conditional directions) her programcı tarafından bilinmesi gereken konuların başında geliyor. Açıklamamın sebebi, şartlı direktiflerin derleyici tarafında etkisini de göstermektir. Kısaca; bir şartlı direktif gerçeklenebiliyorsa sadece o direktifin kapsadığı alan içerisindeki kodlar derleyici tarafından değerlendirilir. Diğerleri ise göz ardı edilir. Ümit ederim değerli okuyucuların dikkatini bu konuya çekebilmiş ve faydalı olabilmişizdir. 

Nezaketiniz ve açıklayıcı örneğiniz için teşekkür ederim.
.
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Optik form kodlama baloglurecep 8 2.374 16-11-2023, Saat: 16:23
Son Yorum: COMMANDX
  Array oluşan değişken (ÇÖZÜLDÜ) KUNTAY 1 886 10-02-2022, Saat: 01:40
Son Yorum: KUNTAY
  Fonksiyona gönderdiğim parametrelerin değişken olması ssmr 10 6.728 04-12-2021, Saat: 13:07
Son Yorum: CesuR
  değişken değerlere göre filtreleme seyyah 12 8.453 12-01-2020, Saat: 03:37
Son Yorum: seyyah
  değişken sayıyı belirli sayılara dağıtma osiso 6 4.082 10-09-2019, Saat: 11:28
Son Yorum: osiso



Konuyu Okuyanlar: 1 Ziyaretçi