Neden bir buton rengini kod içinden okumak isteyesiniz

TROIA Client'ta kullanıcılar arayüz temasını (Blue Flat, CherryFlat, Flat Yellow gibi hazır temalardan biri, ya da SYST13'te tanımlanmış özel bir tema) kendileri seçebiliyor. Bu esneklik, statik olarak sabitlenmiş bir rengi kodda hardcode etmenin neden kötü bir fikir olduğunu da açıklıyor: kullanıcı temayı değiştirdiğinde, sabit renk kodunuz yeni temayla uyumsuz kalabilir (örneğin koyu bir tema üzerinde okunmaz hale gelen açık renkli bir metin). Bunun çözümü tema değişkenlerini dinamik olarak okumak.

Statik ve standart değişken ayrımı

Tema değişkenleri iki gruba ayrılıyor:

  • Statik tema değişkenleri: Temalar arası değişmeyen değerler — çoğunlukla veri satırı renklendirmesi için (BACKCOLOR1...BACKCOLOR22, BACKCOLORERROR, BACKCOLOROK, BACKCOLORWARNING gibi). Özel bir temada tanımlanmasalar bile otomatik olarak dahil edilirler.
  • Standart tema değişkenleri: Temadan temaya değişen ve geçerli bir tema için zorunlu olan değerler (buton, tablo, toolbar, header, groupbox gibi kontrol kategorilerine göre onlarca değişken: BBACKCOLOR, TFONT, TOOLBARBCK, HEADERBCK...). Belgelerde altı çizilen önemli bir kural var: bir temada zorunlu standart değişkenlerden biri eksikse, o tema geçersiz sayılır.

Değişkeni kod içinden okumak: GETTHEMEVARIABLE

LOCAL:
    STRING RENK;
    STRING DEGISKENADI;

RENK = GETTHEMEVARIABLE('HEADERBCK');

DEGISKENADI = 'HEADERBCK';
RENK = GETTHEMEVARIABLE(DEGISKENADI);

SETSTYLE BACKCOLOR RENK TO BUTTON1;

GETTHEMEVARIABLE(), tek parametre olarak bir tema değişkeni adı alır ve o anki aktif temada bu değişkene karşılık gelen değeri döner. İkinci örnekte gördüğünüz gibi, değişken adı da bir string değişkende tutulup dinamik olarak sorgulanabilir — bu, örneğin bir durum koduna göre farklı bir "backcolor" değişkeni seçmek istediğinizde işe yarar.

Gerçek bir örnek: duruma göre satır rengi seçmek

/* Bir onay durumuna göre uygun tema rengini seçip tabloya uygular. */
PARAMETERS:
    STRING DURUM;

LOCAL:
    STRING RENK;

IF DURUM = 'ONAYLANDI' THEN
    RENK = GETTHEMEVARIABLE('BACKCOLOROK');
ELSE
    IF DURUM = 'REDDEDILDI' THEN
        RENK = GETTHEMEVARIABLE('BACKCOLORERROR');
    ELSE
        RENK = GETTHEMEVARIABLE('BACKCOLORWARNING');
    ENDIF;
ENDIF;

SETSTYLE BACKCOLOR RENK TO TABLE1;

Bu, BACKCOLOROK/BACKCOLORERROR/BACKCOLORWARNING gibi statik değişkenleri kullandığı için, kullanıcı hangi temayı seçerse seçsin "onaylandı" satırının hep tutarlı bir şekilde "olumlu" bir renk taşımasını garanti eder — sabit bir RGB değeri yazmış olsaydınız bu tutarlılık temaya bağlı olarak bozulabilirdi.

Sık yapılan hatalar

  • Var olmayan ya da yanlış yazılmış bir değişken adı vermek — GETTHEMEVARIABLE fonksiyonu, belgelenmemiş bir isim için tutarlı bir hata fırlatmayabilir; sonuç genelde beklenmedik/boş bir değer olur. Yeni bir tema değişkeni kullanmadan önce SYST13'teki tema tanımında ya da SYST99 üzerinden değişkenin gerçekten var olduğunu doğrulamak zaman kazandırır.
  • Font-cross ile karıştırmak — GETTHEMEVARIABLE renk/stil değişkenleri içindir; yazı tipi eşlemeleri (bir fontun PDF üretiminde başka bir fontla değiştirilmesi gibi) SYSFONTREF/SYSUSERFONTREF tabloları üzerinden ayrı bir mekanizmayla yönetilir — ikisini aynı yerde çözmeye çalışmak karışıklığa yol açar.
  • Değeri her seferinde yeniden okumak — bir dialog'un OnShow gibi bir olayında tek seferlik okunması yeterliyken, değeri döngü içinde tekrar tekrar GETTHEMEVARIABLE ile sorgulamak gereksiz sunucu çağrısı yaratır; bir kez okuyup MEMBER/LOCAL bir değişkende saklamak daha performanslıdır.

Sıradaki adım

Tema değişkenlerinin SETSTYLE ile birlikte kullanımını gördük; dialog yaşam döngüsü (OnShow, Before, After olayları) konusunu bir sonraki yazıda ele alacağım — tema ayarlarının genelde tam olarak bu olaylardan birinde uygulandığını göreceksiniz.