Component da bir dialog gibi saklanır

TROIA component'leri, kontrolleri ve event'leriyle bir dialog'a çok benzer; aynı development tablolarında (SYSDIALOGS, SYSDLGCODES, SYSCONTROLS vb.) saklanır. TROIA IDE üzerinden "New Component" ile oluşturulur, dialog'larda olduğu gibi inheritance ve cross tanımlamayı destekler.

Bir dialog üzerine component eklemek için Toolbox'tan "TROIA Component" kontrolü sürüklenir ve kontrolün "Component" özelliğine component'in adı yazılır. Her component örneğinin (instance) benzersiz bir kontrol adı olmalıdır.

INITIALIZE event'i

Component'lerin, örneği oluşturulduğunda tetiklenen özel bir event'i vardır: INITIALIZE. Component'in başlangıç durumunu bu event içinde ayarlayabilirsiniz:

DATEFROM = CURRENTTIMEMILLIS();
DATETO = ADDDAYS(DATEFROM, 1);

Component'in kendi kapsamı vardır

Component'i hangi dialog üzerinde kullanacağınızı geliştirme aşamasında bilemezsiniz; bu yüzden component'ler kendi kapsamlarına sahiptir. Component içinde tanımlanan bir değişken, dialog'daki aynı isimli bir değişkenle çakışmazSYS_STATUS gibi bir sistem değişkeni bile component kapsamında dialog kapsamındakinden tamamen ayrı bir değişkendir.

Bu izolasyonun doğal sonucu: dialog kodundan component içindeki bir değişkene doğrudan erişemezsiniz. Erişim, ancak component'in tanımladığı public metotlar üzerinden mümkündür:

C1.SETVALUES('01.01.2016 10:10:10', '01.02.2017 10:10:10');

FIRECOMPONENTEVENT ile dialog'u haberdar etmek

Component'in davranışı, kullanıldığı dialog'a göre değişebilmesi gerekebilir — örneğin geçersiz bir tarih girildiğinde uyarı mesajı dialog'a göre farklılaşabilir. Bunun için component üzerinde "ACTION" olarak tanımlanan olaylar, FIRECOMPONENTEVENT ile tetiklenir:

IF DATEFROM > DATETO THEN
    FIRECOMPONENTEVENT 'INVALIDDATE';
ENDIF;

Bu event, component'i kullanan her dialog'da ayrı ayrı implemente edilir.

Sonuç

Component'i "kendi kapsamı olan mini bir dialog" gibi düşünmek en doğru zihinsel model: içindeki değişkenlere doğrudan erişemezsiniz, sadece public metotlar ve FIRECOMPONENTEVENT ile tanımlı action'lar üzerinden iletişim kurabilirsiniz.