Menü sisteminde olduğu gibi, form_driver() form sisteminde çok önemli bir rol oynamaktadır. Form sistemine yapılan tüm istekler form_driver()'dan süzülmek zorundadır.
|işlev|
Yukarıdaki örneklerin bazılarında da gördüğünüz gibi, bir döngü kurup kullanıcıdan gelen istekleri kontrol edip bunun bir veri mi yoksa kullanıcı isteği mi olduğuna karar vermeniz gerekir. Form istekleri daha sonra işlemi gerçeklemesi için form_driver()'a gönderilir.
İstekler kabaca şu alt sınıflara ayrılabilir. Değişik isteklerin kulanımları aşağıda açıklanmıştır:
Bu istekler form içerisinde sayfa bazında hareketlere sebep olur, form ekranının kayması sağlanır. Bir form pek çok sayfadan oluşmuş olabilir. Eğer çok sayıda alandan ve mantıksal bölümden oluşmuş büyük bir formunuz varsa onu sayfalara bölebilirsiniz. set_new_page() belirtilen alanda yeni bir sayfa oluşturur.
|işlev|
Aşağıdaki istekler farklı sayfalara hareket etmenizi sağlar.
Bu istekler döngüsel şekilde liste üzerinde hareket eder; yani REQ_NEXT_PAGE son sayfadan sonra ilk sayfaya gider, REQ_PREV_PAGE ilk sayfadan sonra son sayfaya gider.
Aynı sayfadaki alanlarda gezinti isteklerinde bunlar kullanılır:
Bu istekler bir sayfadaki alan listesi üzerinde döngüsel şekilde işlenir; yani REQ_NEXT_FIELD son alandan sonra ilk alana döner, REQ_PREV_FIELD ilk alandan sonra son alana döner. Bunlar için (aynı zamanda REQ_FIRST_FIELD ve REQ_LAST_FIELD) alanların sırası form dizisindeki alan göstericisinin sırasıdır (new_form() veya set_form_fields() ile oluşturulmuştur).
Alanları ekranda görüntülendikleri şekilde soldan sağa ve yukarıdan aşağı gezmek de mümkündür. Bunu gerçeklemek için sıralanmış hareket listesinden ikinci guruptakileri kullanın.
Son olarak da alanlar arasında görsel yukarı, aşağı, sağ, sol yönlerini kullanarak gezinmek mümkündür. Bunu gerçeklemek için, üçüncü guruptaki dört isteği kullanın. Bir formun bu tür işler için başlangıcının sol üst köşesi olduğunu unutmayın.
Örneğin, çok satırlı bir B alanı, tek satırlı A ve C alanlarının aynı satırda A, B, C şeklinde sıralandığını düşünün. A alanından verilmiş REQ_MOVE_RIGHT isteği A, B ve C nin aynı satırı paylaşması halinde B alanına geçmeyi sağlayacaktır. Aksi halde B ve C alanlarını atlayacaktır.
Bu istekler o an düzenlenilen alan içerisinde imlecin hareketini sağlar.
Her kelime bir önceki bir sonraki kelimeler arasında boşluk karakteriyle ayrılır. Satır veya alanın başına ve sonuna gitmeye yarayan komutlar kendi menzilleri içerisindeki ilk veya son dolgu karakteri olmayan karakteri arar.
Çalışma zamanında büyüyebilen ve açık şekilde ekranda görülmeyen satırlardan oluşmuş alanlar kaydırılabilir. Tek satırlık alanlar yatay olarak kaydırılır, çok satırlık alanlar dikey olarak kaydırılır. Pek çok kaydırma işlemi alan içi hareketlerle ve düzenleme ile başlatılır (kütüphane imleci görünür kılmak için alan içerisinde kaydırma işlemi gerçekler). Açık şekilde kaydırma işlemlerine istekte bulunmak aşağıdaki şekilde mümkündür:
Kaydırma işlemleri için, bir alanın sayfası görünür kısmının yüksekliğidir.
Form sürücüsüne bir ASCII karakter gönderdiğiniz zaman, alan veri belleğine bir karakter eklemek için bir istek olarak algılanır. Bunun bir araya ekleme mi yoksa üzerine yazma mı olduğu alanın düzenleme kipine bağlıdır (varsayılan araya eklemedir).
Aşağıdaki istekler alanı düzenlemeyi ve düzenleme kipini değiştirmeyi sağlar:
REQ_NEW_LINE ve REQ_DEL_PREV istekleri kısmen bazı form seçenek çiftleri tarafından kontrol edilen karmaşık isteklerdir. Özel durumlar imlecin alanın başında veya alanın sonunda olması durumunda etkin olur.
Önce REQ_NEW_LINE isteğini gözönüne alalım:
Araya ekleme kipinde REQ_NEW_LINE, halihazırdaki imlecin olduğu konumdan satırı keser, kalanı yeni bir satır olarak ekler ve imleci o satırın başına konumlandırır (bunu alan önbelleğine yeni satır eklemek olarak düşünebilirsiniz).
Üzerine yazma kipinde REQ_NEW_LINE, imlecin o an bulunduğu konumdan itibaren satırı satır sonuna kadar siler. Daha sonra imleç yeni satırın başına konumlanır.
Yine de alanın başında veya sonunda REQ_NEW_LINE aslında, REQ_NEXT_FIELD gerçekler. Bu özel durumun gerçekleşmesi için O_NL_OVERLOAD özelliği kapalı olmalıdır.
Şimdi de REQ_DEL_PREV isteğini ele alalım:
REQ_DEL_PREV'in normal davranışı bir önceki karakteri silmek şeklindedir. Eğer araya ekleme kipi açık, imleç satır başındaysa ve o satırdaki metin bir öncekine sığıyorsa, o anki satırın içeriğini bir öcnekinin sonuna ekler ve o anki satırı siler (bunu alan önbellek alanından bir satırın silinmesi olarak düşünebilirsiniz).
Aslında REQ_DEL_PREV alanın başında REQ_PREV_FIELD gibi davranır.
Eğer O_BS_OVERLOAD kapalıysa, bu özel davranış biçimi etkisizdir ve form sürücüsü sadece E_REQUEST_DENIED üretir.
Eğer alanınızın türü emir türünde ve verilmiş bir türün sonraki ve önceki değerlerini almakla ilişkilendirilmiş işlevler içeriyorsa, alan ön belleğinde bu değeri eşleyecek istekler vardır:
Yerleşik alan türleri için sadece TYPE_ENUM'un yerleşik önceki ve sonraki işlevleri vardır. Kendinize ait bir alan türü tanımlarsanız, kendi sıralama işlevlerinizi ilişiklendirebilirsiniz (Özel Doğrulama Türleri'ne bakınız -- Ç.N.: belgede bulunamadı).
KEY_MAX'tan büyük ve sabit MAX_COMMAND'den küçük veya eşit imleç değerleri üzerindeki form istekleri tamsayı olarak gösterilir. Bu sınır değerleri içerisindeki bir değer form_driver() tarafından ihmal edilir. Dolayısıyla bu, uygulama tarafından herhangi bir amaç için kullanılabilir. Uygulamaya özgü bir davranış olarak ele alınıp buna özgü bir davranış sergilenebilir.