1

Konu: #DEF ve # UNDEF ile compile-time global sabitler yaratma

Yazdığım programda birçok yerde geçen sabit değerler (Örn. bazı editbox'ların maksimum karakter sayısı v.b.) var. Bunları kullanıcılardan gelen istekler üzerine ileride değiştirebilirim diye compile zamanı değişkenlere dönüştürmek istiyorum. Anaprogramın ilk satırlarında aşağıdaki gibi bir şeyler yazmayı düşündüm ama VFP'nin Help'inde bunun sadece o program içinde geçerli olduğunu söylüyor. Ben ise tüm prg'ler, formlar ve raporlarda (global yani) bu sabitlerin geçerli olmasını istiyorum. Bunu nasıl yapabilirim?

#DEFINE nMax1 512

Teşekkürler...

2

Re: #DEF ve # UNDEF ile compile-time global sabitler yaratma

sabitler.h diye bir dosyaya yazip bu dosyayi prg, vcx, scx'lerinde include edersen olur. Ancak senin yapmak istedigin is icin bunu sabit yapmak yerine bir yere yazip okusan.

#define ile yaratilan sabitlerin en buyuk derdi, eger degistirirsen onu kullanan her prg, form vs kisacasi exe yeniden derlenmek zorunda. Benim de uzerinde en cok calistigim uygulama 1-2 include dosyasi kullaniyor ve iclerinde #define'lar var. Onlari ilk tasarlayip koyan ben degildim, ama belki de aptalliktan kullanmaya devam ettim. Simdi kurtulmak zor geldiginden hala kullaniyorum.

Onun yerine ornegin _screen'e property olarak eklesen bile daha hayirli bence. Yapman gereken tek sey onun yazildigi yerde degistirmek olur o zaman (ornegin XML dosya).

3

Re: #DEF ve # UNDEF ile compile-time global sabitler yaratma

_SCREEN 'e property eklemek çok iyi bir düşünce ama bir sorum olacak (cahilce bir soru belki ama) bu noktada; ben CONFIG.FPW dosyasında
SCREEN= OFF
komutunu koymuştum. Bu durumda hâlâ _SCREEN aktif olur mu?

4

Re: #DEF ve # UNDEF ile compile-time global sabitler yaratma

olur. sadece gözükmez...

Haksızlıklar karşısında susanlar, dilsiz şeytanlardır!
www.metinemre.com

5

Re: #DEF ve # UNDEF ile compile-time global sabitler yaratma

cetinbasoz yazdı:

#define ile yaratilan sabitlerin en buyuk derdi, eger degistirirsen onu kullanan her prg, form vs kisacasi exe yeniden derlenmek zorunda. (1.) Benim de uzerinde en cok calistigim uygulama 1-2 include dosyasi kullaniyor ve iclerinde #define'lar (3.) var. Onlari ilk tasarlayip koyan ben degildim, ama belki de aptalliktan kullanmaya devam ettim. Simdi kurtulmak zor geldiginden hala kullaniyorum.

Onun yerine ornegin _screen'e property olarak eklesen bile daha hayirli bence. Yapman gereken tek sey onun yazildigi yerde degistirmek olur o zaman (ornegin XML dosya).


3 konuyu açmanı rica ediyorum: yukarıda (1.) ve (3.) olarak işaretledim.
1. herhangi bir projeyi built -> rebuild project yapmak zor değil diye düşünüyorum.
Ben bu include ( xxx.h) dosyaları çokça kullanıyorum.
Örneğin SQLSTRINGCONNECT(SQL_BAGLANTI) i orada ev ve işyeri için aşağıdaki gibi belirledim. Nerede çalışacalsam diğerinin sonuna _ ekleyip rebuild yapıyorum....

Visual Fox Pro
#DEFI SQL_BAGLANTI 'Driver={SQL Server Native Client 10.0};'+;

   'Server=KONUKPC\SQLEXPRESS;Database=ilt;Trusted_Connection=yes;'
#DEFI SQL_BAGLANTI_ 'Driver={SQL Server Native Client 10.0}; Server=ML350\SQLEXPRESS; Database=ilt; uid=sa; pwd=72'


2. _screen' e konursa bu sefer her projeye maydonoz olur veya projeden projeye pek değiştiremezsin, daha iyisi class yaratıp, forma eklemek diye düşünüyorum.
3. include dosyasına #DEFINE dan başka ne konabilir ?

VFP9 SP2

6

Re: #DEF ve # UNDEF ile compile-time global sabitler yaratma

include dosyaları konusunda ben de çetin'le aynı fikirdeyim. ha ben de include kullandım. zamanında yaptığım c özentiliği işte. smile

build all yap diyorsun da mesela ben sadece .exe yapacağım zaman projeji build yaparım. onun dışında tek tek formlarla çalışırım. böylesi çok daha verimli oluyor. öbür türlü klasik c projesi derler gibi dakikalarca bekle her seferinde...

Haksızlıklar karşısında susanlar, dilsiz şeytanlardır!
www.metinemre.com

7

Re: #DEF ve # UNDEF ile compile-time global sabitler yaratma

1) Projeyi build etmek zor degil, dogru ama ufacik bir seyin yuzunden projeyi yeniden derleyip musteriye gondermek dert. Ustelik musteriler arasinda farkliliklar yaratan seyleri o dosyaya koyduysak gercekten dert olmaya basliyor (iste bizim header dosyasinda o hata yapilmisti duzeltmedim). Kanimca oraya yazilacaksa hakikaten sabit olan seyler yazilmali, ornegin:

#define PI         3.14159265358979323846

* Enum - ornegin ana yonler (gercek uygulamalar buyuk olasilikla ara yinleri de alir ve 16 tane filan olur)
#define KUZEY 0
#define BATI 1
#define GUNEY 2
#define DOGU 3

* diller arasi benzerlik nedeniyle kullanilan sabitler
#define TRUE .T.
#define FALSE .F.
#define _TRUE 1
#define _FALSE 0

gibi. Bunlar hakikaten bir kere yaz ve unut, Tekrar derleme diye bir ihtiyacin da olmaz.

Senin SQL_BAGLANTI sabitini dusun. O #define yerine metod olsaydi:

* SQL_BAGLANTI.prg
* ...
return ...

O zaman:
-Gercek baglanti stringi exe'nin icerisinde olmazdi (notepad ile bile alinabilir)
-Baglanti stringi herhangi bir yerde sifrelenmis sekilde veya acikca saklanabilir, ya da calisma sirasinda kullaniciya sorulabilir. Bu saklama, okuma, sorma vs islerin sorumlulugu istedigin zaman degistirebilecegin o parcada olur. Burada o metod icerigini degistirmek o metodun yeniden derlenmesini gerektirir. O dogru ama programin geri kalan kismi  hic etkilenmez. Sen mesela basitce notepad kullanarak bir XML icerigini degistiriyor olabilirsin:
< root >< row >
< Driver > {SQL Server Native Client 10.0}< /Driver >
< Server >KONUKPC\SQLEXPRESS< /Server >
< Database >ilt< /Database >
< other >Trusted_Connection=yes< /other >
< /row >< /root >

bu sifrelenip saklanmistir 99%.

SQL_BAGLANTI:

Visual Fox Pro
local lcXML

lcXML = Decrypt( FileToStr( 'baglanti.xml' ))
 
XMLToCursor(m.lcXML,'baglanti')
text to lcBaglanti textmerge noshow
Driver=<< baglanti.Driver >>;Server = << baglanti.Server >>;Database=<< baglanti.database >>;<< other >>
endtext
return m.lcBaglanti

Uzun lafin kisasi eger birsey yuzde yuz sabit degil ise, #define olarak kullanma derim.

2) _screen'e koymak benim yaptigim birsey degil aslinda. Ben public olan bir custom class baslatiyorum Main.prg'de:

Visual Fox Pro
* main.prg

* ...
public oApp
oApp = createobject('BazUygulama')
* ...
oApp.AddProperty( "TumUygulamayaGerekliBirsey", deger )
* ...
 
define class BazUygulama as custom
  MakineAdi = ''
  DataMode = 'SQL'
  DataConnectionString = ''
  CurrentUserName = ''
 
  * bir suru metod - GetDataConnectionString(), GetMachineNAme(), GetSettings(), ChangeCurrentUser() ....
  * ortak ozellikleri tum uygulamaya ortak metod ve propertyler olmasi
 
enddefine

Public degiskenlere karsiyim tabii ki. Bu oApp tum uygulamada public olmasina izin verilen tek degisken. Uygulama birsey paylasmak istiyorsa, kendi icinde, public degisken yerine oApp propertylerini kullaniyor. _screen'den kastim, public degisken filan yaratma, nasil olsa _screen public olarak hazirda var, ona property ekle seklinde idi (ve acikcasi, oApp nasil yaratilip kullanilir konusunu aciklamak o sirada zor gelmisti, tembellik yaparak _screen dedim). Normalde oApp _screen'den daha iyi bir yaklasim cunku ona propertylerin yani sira metodlar filan eklenebilir.

3) #define disinda #undef, #include ve emin degilim ama diger compile time directiveler (#ifdef #if #elif #else ...) konabiliyor. #define, #undef ve #include disindakileri denemedim hic.