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.