form_driver: Form sisteminin dolap beygiri

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.

int form_driver
(FORM *form,
/* değiştirilecek form */
int    istek);
/* form istek kodu */
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:

Sayfada Gezinti İstekleri

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.

int set_new_page
(FIELD *alan,
/* değiştirilecek alan */
bool    sayfa_kesme);
/* sayfa kesmesi yapılacak mı? */
işlev

Aşağıdaki istekler farklı sayfalara hareket etmenizi sağlar.

  • REQ_NEXT_PAGE Sonraki form sayfasına hareket
  • REQ_PREV_PAGE Önceki form sayfasına hareket
  • REQ_FIRST_PAGE İlk form sayfasına hareket
  • REQ_LAST_PAGE Son form sayfasına hareket

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.

Alan İçi Gezinti İstekleri

Aynı sayfadaki alanlarda gezinti isteklerinde bunlar kullanılır:

  • REQ_NEXT_FIELD Sonraki alana git
  • REQ_PREV_FIELD Önceki alana git
  • REQ_FIRST_FIELD İlk alana git
  • REQ_LAST_FIELD Son alana git
  • REQ_SNEXT_FIELD Sıralanmış sonraki alana git
  • REQ_SPREV_FIELD Sıralanmış önceki alana git
  • REQ_SFIRST_FIELD Sıralanmış ilk alana git
  • REQ_SLAST_FIELD Sıralanmış son alana git
  • REQ_LEFT_FIELD Alanın soluna git
  • REQ_RIGHT_FIELD Alanın sağına git
  • REQ_UP_FIELD Alanın yukarısına git
  • REQ_DOWN_FIELD Alanın aşağısına git

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.

Alan İçi Dahili Gezinti İstekleri

Bu istekler o an düzenlenilen alan içerisinde imlecin hareketini sağlar.

  • REQ_NEXT_CHAR Bir sonraki karaktere git
  • REQ_PREV_CHAR Bir önceki karaktere git
  • REQ_NEXT_LINE Bir sonraki satıra git
  • REQ_PREV_LINE Bir önceki satıra git
  • REQ_NEXT_WORD Bir sonraki kelimeye git
  • REQ_PREV_WORD Bir önceki kelimeye git
  • REQ_BEG_FIELD Alanın başına git
  • REQ_END_FIELD Alanın sonuna git
  • REQ_BEG_LINE Satır başına git
  • REQ_END_LINE Satır sonuna git
  • REQ_LEFT_CHAR Alan içerisinde sola git
  • REQ_RIGHT_CHAR Alan içerisinde sağa git
  • REQ_UP_CHAR Alan içerisinde yukarı git
  • REQ_DOWN_CHAR Alan içerisinde aşağı git

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.

Kaydırma İstekleri

Ç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:

  • REQ_SCR_FLINE Bir satırın ilerisine dikey olarak kaydırma
  • REQ_SCR_BLINE Bir satırın gerisine dikey olarak kaydırma
  • REQ_SCR_FPAGE Bir sayfanın ilerisine dikey kaydırma
  • REQ_SCR_BPAGE Bir sayfanın gerisine dikey olarak kaydırma
  • REQ_SCR_FHPAGE Bir sayfanın yarısına ileri yönde dikey kaydırma
  • REQ_SCR_BHPAGE Bir sayfanın yarısına geri yönde dikey kaydırma
  • REQ_SCR_FCHAR Yatay olarak bir karakter ilerisine kaydırma
  • REQ_SCR_BCHAR Yatay olarak bir karakter gerisine kaydırma
  • REQ_SCR_HFLINE Yatay olarak bir alan ilerisine kaydırma
  • REQ_SCR_HBLINE Yatay olarak bir alan gerisine kaydırma
  • REQ_SCR_HFHALF Yatay olarak yarım alan ilerisine kaydırma
  • REQ_SCR_HBHALF Yatay olarak yarım alan gerisine kaydırma

Kaydırma işlemleri için, bir alanın sayfası görünür kısmının yüksekliğidir.

İstekleri Düzenlemek

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_INS_MODE Araya ekleme kipini ayarla
  • REQ_OVL_MODE Üzerine yazma kipini ayarla
  • REQ_NEW_LINE Yeni satır isteği (açıklama için aşağıya bakınız)
  • REQ_INS_CHAR Karakterin olduğu konuma boşluk yerleştir
  • REQ_INS_LINE Karakterin olduğu konuma boş satır ekle
  • REQ_DEL_CHAR İmlecin olduğu konumdaki karakteri sil
  • REQ_DEL_PREV İmlecin olduğu konumdan önceki kelimeyi sil
  • REQ_DEL_LINE İmlecin olduğu satırı sil
  • REQ_DEL_WORD İmlecin olduğu konumdaki kelimeyi sil
  • REQ_CLR_EOL Satırı sonuna kadar temizle
  • REQ_CLR_EOF Alanı sonuna kadar temizle
  • REQ_CLR_FIELD Alanın tüm içeriğini temizle

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.

Emir İstekleri

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:

  • REQ_NEXT_CHOICE O anki değerden sonrakini önbelleğe yerleştir.
  • REQ_PREV_CHOICE O anki değerin öncekisini önbelleğe yerleştir.

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ı).

Uygulama Komutları

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.