Bir dialog açılırken tam olarak ne oluyor
Bir CANIAS ekranını açtığınızda arka planda üç olay sırayla tetikleniyor, ve hangi kodun hangi olayda çalışması gerektiğini bilmemek, "neden bu kontrol henüz görünmüyor" ya da "neden bu veri henüz hazır değil" tarzı hatalara yol açıyor.
Üç temel olay, sırasıyla
- BEFORE: Dialog açıldığında tetiklenen ilk olay. Kontroller tanımlanmış ama dialog henüz görünür değil.
- AFTER:
BEFORE'dan hemen sonra tetiklenir; dialog hâlâ görünür değil. - ONSHOW:
AFTER'dan sonra, dialog kullanıcı arayüzünde görünür hale geldiğinde tetiklenir.
Bu üçünü elle de tetikleyebilirsiniz: THIS.AFTER(); ya da THIS.ONSHOW(); — örneğin bir formu sıfırlarken AFTER'daki başlangıç mantığını tekrar çalıştırmak istediğinizde.
Hangi kod hangi olaya gitmeli
- BEFORE: Veri hazırlığı, varsayılan değer atamaları, kontrollerin başlangıç durumunu (aktif/pasif, görünür/gizli) ayarlamak — dialog henüz görünmediği için burada yapılan görsel değişiklikler kullanıcıya "titreme" olarak yansımaz.
- AFTER:
BEFORE'da hazırlanan veriye bağlı ek mantık, kontroller arası bağımlılıkların kurulması. - ONSHOW: Dialog gerçekten ekranda göründükten sonra çalışması gereken şeyler — örneğin bir kontrole odaklanmak (focus vermek) ya da kullanıcıya görünür bir mesaj göstermek.
BEFORE/AFTER'da birMESSAGEçağırmak, dialog henüz görünmediği için kafa karıştırıcı bir kullanıcı deneyimine yol açabilir.
Kontroller ve temel olayları
Kontroller SYSCONTROLS'ta tanımlanır, konum/boyut/görünürlük/renk/aktiflik gibi özellikler taşır. Bir textfield kontrolünün üç temel olayı:
- GainFocus: Kullanıcı textfield'a odaklandığında.
- LoseFocus: Kullanıcı başka bir kontrole geçtiğinde.
- TextChanged: Kullanıcı değeri değiştirdiğinde,
LoseFocus'tan önce tetiklenir.
TextChanged ile LoseFocus'u karıştırmak yaygın bir hata: bir alanın her tuş vuruşunda anlık doğrulama yapmak istiyorsanız TextChanged, kullanıcı alandan tamamen ayrıldığında (örneğin sunucuya sorgu atacaksanız) LoseFocus doğru seçimdir.
Ekranlar arası geçiş: CALL DIALOG
CALL DIALOG {dialogadi};
Bu komut çağıran metodun çalışmasını durdurur, yeni dialog'u istemcide açar; kullanıcı yeni dialog'u kapattığında (SHUTDOWN; ile) çağıran metodun kalan kısmı kaldığı yerden devam eder. Bu senkron davranış, .NET/Web dünyasından gelenler için alışılmadık: bir "modal" açmak değil, gerçekten kodun akışını o dialog kapanana kadar askıya almak gibi düşünülmeli.
/* Kullanıcı adayı seçtirip, seçim tamamlanınca devam eder. */
CALL DIALOG MUSTSEC;
/* MUSTSEC dialog'u SHUTDOWN ile kapatılana kadar buraya gelinmez. */
IF SECILENMUSTERI <> '' THEN
MESSAGE BAS I010 WITH SECILENMUSTERI;
ENDIF;
Zamanlayıcı: SETTIMER
SETTIMER {milisaniye};
Belirtilen periyotta ONTIMER olayını tetikler. Önemli bir güvence: eğer bir ONTIMER çalışması, timer periyodundan daha uzun sürerse, sistem event kuyruğunda birden fazla ONTIMER biriktirmez. Yani ağır bir işlemi ONTIMER içine koyarsanız, timer'ın "art arda patlayıp" sistemi boğması riski yok — ama bu, işlemin süresi periyottan uzun sürdüğünde bir sonraki tetiklemenin gecikeceği anlamına da geliyor.
Sık yapılan hatalar
- BEFORE/AFTER'da kullanıcıya görsel geri bildirim vermeye çalışmak — dialog henüz görünmediği için bu noktada gösterilen bir
MESSAGEya da odak değişikliği kullanıcıyı şaşırtabilir; görsel geri bildirimONSHOW'a ait. CALL DIALOG'u senkron olmayan bir çağrı gibi düşünmek — kodun bu satırda durup açılan dialog kapanana kadar beklediğini unutup,CALL DIALOG'dan hemen sonraki satırda "dialog zaten kapandı, seçim yapıldı" varsayımıyla kod yazmak aslında doğru — ama tersini düşünüpCALL DIALOG'un arka planda çalışıp hemen sonraki satıra geçeceğini varsaymak yaygın bir yanlış anlamadır.- Ağır bir sorguyu
ONTIMER'a koyup periyodu çok kısa tutmak — periyot çok kısaysa ve her tetiklemede bir veritabanı sorgusu çalışıyorsa, application server'da gereksiz yük oluşur; periyodu gerçek ihtiyaca göre (saniyeler değil, çoğu zaman on saniyeler/dakikalar) ayarlamak gerekir. - TextChanged'de ağır bir doğrulama/sorgu çalıştırmak — her tuş vuruşunda tetiklendiği için, burada bir veritabanı sorgusu çalıştırmak arayüzü yavaşlatır; anlık doğrulamalar için hafif, sorgu gerektirenler için
LoseFocustercih edilmeli.
Sıradaki adım
Class'ların _VARIABLES/_CONSTRUCTOR özel metodlarına ve THIS/@ operatörüne bir sonraki yazıda değineceğim.
Yorumlar (0)
Yorum Yaz