Alanlar ile Oynamak

Her bir form alanı birden fazla özellik ile ilintilenmiştir. İstenilen özelliği elde etmek ve eğlenmek için değiştirilebilirler. Daha ne bekliyoruz?

Alan Konumunun ve Boyutununun Alınması

Alan oluşturulması sırasında verdiğimiz parametreler field_info() ile okunabilir. Kendisine verilen parametrelere yükseklik, genişlik, y başlama koordinatı, x başlama koordinatı, görünmeyen satır sayısı ve ilave önbellek miktarını geri döndürür. new_field() bu işlevin bir çeşit ters işlevidir.

int field_info
(FIELD *alan,
/* döndürülecek alan */
int    *yukseklik,
/* alan yüksekliği */
int    *genislik,
/* alan genişliği */
int    *ust,
/* üst kenar */
int    *sol,
/* sol kenar */
int    *gorunmeyen,
/* görünmeyen satır sayısı */
int    *tampon_boyu);
/* tampon boyu */
işlev

Alanı taşımak

Alanın konumu farklı bir konuma move_field() ile taşınabilir.

int move_field
(FIELD *alan,
/* değiştirilecek alan */
int     ust,
/* yeni üst kenar */
int     sol);
/* yeni sol kenar */
işlev

Alışıldığı gibi, değişen konum bilgileri field_infor() ile alınabilir.

Alan Hizalama

Alanlar için hizalama set_field_just() işlevi ile yapılabilir.

int set_field_just
(FIELD *alan,
/* değiştirilecek alan */
int     kip);
/* ayarlanacak kip */
işlev

int field_just
(FIELD *alan);
/* alan için hizalama kipi */
işlev

Bu işlevler tarafından kullanılan ve geri döndürülen hizalama kipleri: NO_JUSTIFICATION, JUSTIFY_RIGHT, JUSTIFY_LEFT, or JUSTIFY_CENTER

Alan Görüntüleme Öznitelikleri

Gördüğünüz gibi, yukarıdaki örnekte alan için görünüm öznitelikleri set_field_fore() ve setfield_back() ile ayarlanabilir. Bu işlevler alanların ön ve artalan özelliklerini ayarlar. Aynı zamanda alanın doldurulmamış kısımları için bir tampon karakteri tanımlayabilirsiniz. Tampon karakteri set_field_pad() çağrısıyla tanımlanır. Varsayılan tampon karakteri boşluktur. field_fore(), field_back, field_pad() işlevleri ön, artalan özniteliklerini ve tampon karakterini sorgulamak için kullanılabilir. Aşağıdaki liste işlevlerin kullanımını vermektedir.

int set_field_fore
(FIELD *alan,
/* değiştirilecek alan */
chtype  öznitelik);
/* ayarlanacak öznitelik */
işlev

chtype field_fore
(FIELD *alan);
/* sorgulanacak alan */
/* önalan özniteliğini döndürür */
işlev

int set_field_back
(FIELD *alan,
/* değiştirilecek alan */
chtype  öznitelik);
/* ayarlanacak öznitelik */
işlev

chtype field_back
(FIELD *alan);
/* sorgulanacak alan */
/* artalan özniteliğini döndürür */
işlev

int set_field_pad
(FIELD *alan,
/* değiştirilecek alan */
int     dolgu_krk);
/* adımlama karakteri */
işlev

chtype field_pad
(FIELD *alan);
/* sorgulanacak alan */
/* adımlama karakterini döndürür */
işlev

Her ne kadar yukarıdaki işlevler oldukça basit gözükse de set_field_fore() ile renkleri kullanmak başlangıçta korkutucu olabilir. Öncelikle alanın ön ve artalan özniteliklerini açıklamama izin verin. Önalan özniteliği karakter ile ilişiklendirilmiştir. Bunun anlamı bir karakterin set_field_fore() ile ayarlanmış öznitelik ile gösterilmesidir. Artalan özniteliği alanın arka fonunu doldurmak için kullanılan özelliktir, bir karakter olmak zorunda değildir. Peki ya renkler? Renkler çiftler halinde tanımlandığından renklendirilmiş alanları göstermenin en iyi yolu nedir? İşte renk görüntü özelliklerini netleştiren bir özellik:

Örnek 5.31. Form Öznitelikleri Örneği

#include <form.h>

int main()
{ FIELD *field[3];
  FORM  *my_form;
  int ch;

  /* Curses kipini ilklendir */
  initscr();
  start_color();
  cbreak();
  noecho();
  keypad(stdscr, TRUE);

  /* Bazı renk çiftlerini ilklendir */
  init_pair(1, COLOR_WHITE, COLOR_BLUE);
  init_pair(2, COLOR_WHITE, COLOR_BLUE);

  /* alanları ilklendir */
  field[0] = new_field(1, 10, 4, 18, 0, 0);
  field[1] = new_field(1, 10, 6, 18, 0, 0);
  field[2] = NULL;

  /* Alan özelliklerini ayarla */
  /* Alanların arka fonunu mavi yap */
  set_field_fore(field[0], COLOR_PAIR(1));
  /* ön fonun beyaz ya */
  set_field_back(field[0], COLOR_PAIR(2));
  /* karakterler beyaz olarak gösterilir         */
  /* bu alan dolduğunda */
  field_opts_off(field[0], O_AUTOSKIP);
  /* sonraki alana geçme           */
  set_field_back(field[1], A_UNDERLINE);
  field_opts_off(field[1], O_AUTOSKIP);

  /* Alanı oluştur ve ekrana yaz */
  my_form = new_form(field);
  post_form(my_form);
  refresh();

  /* Renklendirilmiş alana odaklan */
  set_current_field(my_form, field[0]);
  mvprintw(4, 10, "Değer 1:");
  mvprintw(6, 10, "Değer 2:");
  mvprintw(LINES - 2, 0,
      "Alanlar arasında geçiş için YUKARI ve AŞAĞI ok tuşlarını kullanın");
  refresh();

  /* Kullanıcı isteklerini almak için döngü */
  while((ch = getch()) != KEY_F(1))
  { switch(ch)
    { case KEY_DOWN:
        /* Sonraki alana git */
        form_driver(my_form, REQ_NEXT_FIELD);
        /* O anki önbelleğin sonuna git */
        /* Son karakterde döngüden çık */
        form_driver(my_form, REQ_END_LINE);
        break;
      case KEY_UP:
        /* Önceki alana git */
        form_driver(my_form, REQ_PREV_FIELD);
        form_driver(my_form, REQ_END_LINE);
        break;
      default:
        /* Eğer bu normal bir karakterse */
        /* ekrana yazılır                */
        form_driver(my_form, ch);
        break;
    }
  }

  /* Formu ekrandan sil ve ayrılan belleği geri ver */
  unpost_form(my_form);
  free_form(my_form);
  free_field(field[0]);
  free_field(field[1]);

  endwin();
  return 0;
}

Renk çiftleriyle oynayarak ön ve artalan özniteliklerini anlamaya çalışın. Genelde sadece set_field_back() ile artalanı ayarlarım. Curses tek tek renk özniteliklerinin doğrudan ayarlanmasını izin vermemektedir.

Alan Seçenek Bitleri

Bunların yanında ayrıca form işlemenin pekçok yönünü kontrol etmenizi sağlayan geniş bir alan seçenekleri bit kümesi de bulunmaktadır. Şu işlevlerle bunları değiştirebilirsiniz:

int set_field_opts
(FIELD *alan,
/* değiştirilecek alan */
int     öznitelik);
/* ayarlanacak öznitelik */
işlev

int field_opts_on
(FIELD *alan,
/* değiştirilecek alan */
int     öznitelik);
/* etkinleştirilecek öznitelik */
işlev

int field_opts_off
(FIELD *alan,
/* değiştirilecek alan */
int     öznitelik);
/* etkisizleştirilecek öznitelik */
işlev

int field_opts
(FIELD *alan);
/* sorgulanacak alan */
işlev

set_field_opts() işlevi bir alanın özelliklerini değiştirmek için doğrudan kullanılabilir veya field_opts_on() ve field_opts_off() ile bazı özellikleri seçime göre etkinleştirebilir veya kapatabilirsiniz. Herhangi bir zamanda bir alanın özelliklerini field_opts() ile sorugulayabilirsiniz. Aşağıda kullanılabilir özellikler listesi bulunmaktadır. Öntanımlı olarak, tüm özellikler etkindir.

O_VISIBLE
Alanın ekranda görünüp görünmediğini kontrol eder. Ana alanın özelliğine bağlı olarak form işleme sırasında alanları saklamak ya da göstermek için kullanılır.

O_ACTIVE
Form işleme sırasında alanın etkin olup olmadığını kontrol eder (örn. form gezinti tuşları tarafından ziyaret edilimiş mi?). Kullanıcı tarafından değil ama form uygulamasının kendisi tarafından değiştirilebilen önbellek değerleri ile türetilmiş alanlar veya etiketler yapmak için kullanılabilir.

O_PUBLIC
Alana veri girişi sırasında verinin gösterilip gösterilmediğini kontrol eder. Eğer bu seçenek bir alan için kapatılırsa kütüphane, alan içerisindeki verileri alıp düzenleyecek, fakat veriler görülebilir olmayacak ve görünmesi gereken imleç de ilerlemeyecektir. Parola alanlarını tanımlamak için O_PUBLIC bitini kapatabilirsiniz.

O_EDIT
Bir alan verisinin değiştirilip değiştirilemeyeceğini kontrol eder. Bu özellik kapalı olduğunda, REQ_PREV_CHOICE ve REQ_NEXT_CHOICE dışındaki tüm düzenleme istekleri sekteye uğrayacaktır. Bu sadece okunabilir alanlarda yardım iletileri için faydalı olabilir.

O_WRAP
Çok satırlı alanlarda satırın sarmalanmasını sağlar. Normal çalışma şeklinde (boşluklarla ayrılmış) bir kelimenin herhangi bir karakteri o anki satırın sonuna geldiğinde, kelimenin tamamı bir sonraki satıra (yeni bir satır olduğunu varsayıyoruz) olduğu gibi taşınır. Bu seçenek etkisizleştirildiğinde satırsonu ile beraber kelime parçalanacaktır.

O_BLANK
Alanların boşaltılmasını kontrol eder. Bu seçenek etkin olduğunda, alanın ilk konumuna bir karakter girmek tüm alanı siler (hali hazırda var olan karakterler dışında).

O_AUTOSKIP
Alanın kendisi dolduğunda otomatik olarak sonraki alana atlamayı kontrol eder. Normalinde, form kullanıcısı alana alabileceğinden fazlasını yazmaya kalkarsa yazılanlar sonraki alana geçer. Bu seçenek etkisiz olduğunda kullanıcı imleci alanın sonunda ilerlemeden duracaktır. Bu özellik çalışma zamanında boyutları değişen alanlar için ihmal edilir.

O_NULLOK
Boş alanlara doğrulama yapılıp yapılmadığını kontrol eder. Normal olarak, bu yapılmaz; kullanıcı bir alanı boş bırakıp çıkabilir. Eğer bu seçenek bir özellik için etkisizse, alandan çıkarken doğrulama yapılır.

O_PASSOK
Alandaki odaklanmadan her ayrılmada doğrulama yapılacak mı yoksa sadece alan değiştiğinde mi bir doğrulama yapılacak diye kontrol eder. Normalinde sonuncusu doğrudur. O_PASSOK'u ayarlamak form işlemeniz sırasında eğer alanın doğrulama işlevi değişiyorsa faydalı olabilir.

O_STATIC
Alanın ilk boyutunda sabit olup olmadığını kontrol eder. Bu seçeneği etkisizleştirdiğinizde, alan çalışma zamanında değişken bir hal alır ve yazılan girdiye göre genişleyebilir bir özellik kazanır.

Bir alanın özelliği o alan seçildiği anda değiştirilemez. Yine de, henüz seçilmemiş fakat ekranda gözüken alanların seçenekleri değiştirilebilir.

Seçenek değerleri bit maskeleridir ve açık şekilde, mantıksal VEYA kullanarak oluşturulabilir. O_AUTOSKIP değerinin etkisizleştirilmesini daha önce görmüştünüz. Aşağıdaki örnek birkaç seçeneğin daha kullanımını açıklamaktadır. Diğer seçenekler gerekli görüldüğü yerde açıklanmıştır.

Örnek 5.32. Alan Özelliklerini Kullanım Örneği

#include <form.h>

#define STARTX 15
#define STARTY 4
#define WIDTH 25

#define N_FIELDS 3

int main()
{ FIELD *field[N_FIELDS];
  FORM  *my_form;
  int ch, i;

  /* Curses kipini ilklendir */
  initscr();
  cbreak();
  noecho();
  keypad(stdscr, TRUE);

  /* Alanları ilklendir */
  for(i = 0; i < N_FIELDS - 1; ++i)
    field[i] = new_field(1, WIDTH, STARTY + i * 2, STARTX, 0, 0);
  field[N_FIELDS - 1] = NULL;

  /* Alan özelliklerini ayarla */
  set_field_back(field[1], A_UNDERLINE);  /* Seçenek için bir satır yaz  */

  field_opts_off(field[0], O_ACTIVE); /* Bu alan durağan bir etiket */
  field_opts_off(field[1], O_PUBLIC); /* Bu alan bir parola alanı gibi*/
  field_opts_off(field[1], O_AUTOSKIP); /* Son karakter girildikten sonra */
                                        /* aynı alana girişi önlemek için */

  /* Alanı oluştur ve ekrana yaz */
  my_form = new_form(field);
  post_form(my_form);
  refresh();

  set_field_just(field[0], JUSTIFY_CENTER); /* Ortalama ayarı */
  set_field_buffer(field[0], 0, "Bu durağan bir alandır");
                                            /* Alanı ilklendir  */
  mvprintw(STARTY, STARTX - 10, "Alan 1:");
  mvprintw(STARTY + 2, STARTX - 10, "Alan 2:");
  refresh();

  /* Kullanıcıdan elen istekler için dögü */
  while((ch = getch()) != KEY_F(1))
  { switch(ch)
    { case KEY_DOWN:
        /* Sonraki alana git */
        form_driver(my_form, REQ_NEXT_FIELD);
        /* O anki önbelleğin sonuna git */
        /* Son karakterde döngüden çık */
        form_driver(my_form, REQ_END_LINE);
        break;
      case KEY_UP:
        /* Önceki alana git */
        form_driver(my_form, REQ_PREV_FIELD);
        form_driver(my_form, REQ_END_LINE);
        break;
      default:
        /* Eğer bu normal bir karakterse */
        /* Ekrana yazılır                                */
        form_driver(my_form, ch);
        break;
    }
  }

  /* Formu ekrandan sil ve tahsis edilen belleği geri ver */
  unpost_form(my_form);
  free_form(my_form);
  free_field(field[0]);
  free_field(field[1]);

  endwin();
  return 0;
}

Bo örnek, işe yaramaz olsa da, seçeneklerin kullanımını göstermektedir. Eğer düzgün kullanılırsa, bir form içerisindeki bilgileri çok verimli şekilde gösterebilirler. O_PUBLIC olmayan ikinci alan yazdığınız karakterleri göstermez.

Alan Durumu

Alan durumu alan üzerinde düzenleme yapılıp yapılmadığını söyler. Başlangıçta FALSE değerindedir. Kullanıcı bir takım veriler girdiğinde ve veri belleğini değiştirdiğinde TRUE değerini alır. Dolayısıyla bir alanın durum bilgisi, alan verisi üzerinde değişiklik yapılıp yapılmadığının kontrolü için kullanılabilir. Aşağıdaki işlevler bu türden işlemlere yardım edebilir:

int set_field_status
(FIELD *alan,
/* değiştirilecek alan */
int     durum);
/* atanacak durum */
işlev

int field_status
(FIELD *alan);
/* sorgulanacak alan */
/* alanın durumu ile döner */
işlev

Alanın durumunu alandan ayrılırken kontrol etmek, veri doğrulama halen devam ettiğinden ve veri önbelleği henüz değişmemiş olabileceğinden daha sağlıklıdır. Dönen doğru değeri almak için, alanın ayrılma ile ilgili kısmına veya alan veya formun ilklendirme veya sonlandırılma kısımlarında veya hemen form sürücüsü tarafından REQ_VALIDATION isteği işlendikten sonra field_status() çağrılmalıdır.

Alan Kullanıcı Göstericisi

Her alan yapısı kullanıcı tarafından değişik amaçlar için kullanılabilen bir gösterici içerir. Form kütüphanesi tarafından kullanılmaz ama kullanıcı tarafından herhangi bir amaç için kullanılabilir. Sıradaki işlevler kullanıcı göstericilerini ayarlar ve onları eşler.

int set_field_userptr
(FIELD *alan,
/* değiştirilecek alan */
char   *kull_gost);
/* ilişiklendirilecek kullanıcı göstericisi */
işlev

int field_userptr
(FIELD *alan);
/* sorgulanacak alan */
/* kullanıcı göstericisini döndürür */
işlev

Değişken Boydaki Alanlar

Eğer çalışma zamanında değişken genişlikte bir alan istiyorsanız bu, tüm özellikleri ile kullanmanız gereken bir özelliktir. Bu, kullanıcının, asıl alan boyundan daha büyük değerler girmesini ve alanın büyümesini sağlar. Alan, yerleştirilme konumuna göre yeni girilen veriler ile bütünleşik olabilmek için yatay veya dikey kaydırılabilir olacaktır.

Bir alanın dinamik olarak büyümesini sağlamak için O_STATIC seçeneği etkisiz olmalıdır. Bu da,

field_opts_off(field_pointer, O_STATIC);

ile yapılabilir. Fakat bir alanın sonsuz boyda uzamasına izin vermek pek de tavsiye edilmez. Alanın genişleyebileceği en fazla büyüklüğü tanımlayabilirsiniz.

int set_max_field
(FIELD *alan,
/* değiştirilecek alan */
char    azami_büyüme);
/* alan için olası azami büyüme miktarı */
işlev

Dinamik olarak büyüyebilen bir alandan bilgiler şu şekilde alınabilir:

int dynamic_field_info
(FIELD *alan,
/* değiştirilecek alan */
int    *sat_say,
/* sığdırılacak satır sayısı */
int    *sut_say,
/* sığdırılacak sütun sayısı */
int    *azm_buy_mik);
/* sığdırılacak azami büyüme miktarı */
işlev

field_inf bildik şekilde çalışmasına rağmen, çalışma zamanında genişleyen alanların özellikleri ile ilgili bilgileri bu işlevi kullanarak almanız tavsiye edilir.

new_field kütüphane yordamını hatırlayın; bir birim yüksekliğinde ve tek satırlık bir alan oluşturuluyordu. Bir birimden fazla yüksekliğe sahip alanlar çok satırlı alanlar olarak tanımlanacaklardır.

O_STATIC özelliği etkisizleştirilmiş tek satırlık bir alan tek bir sabit satır içerecektir, fakat sütun sayısı kullanıcının ilk alanın taşıyabileceğinden fazlasını girmesi durumunda artabilir. Görüntülenen alan sayısı sabit kalacak ve ilave veriler kaydırılabilir olacaktır.

Çok satırlı ve O_STATIC özelliği etksizleştrilmiş bir alan ise (çalışma zamanında genişleyebilen) sabit sayıda sütun içerecek, fakat satır sayısı alanın ilk tutabileceği değerden daha fazlası girilmesi durumunda artacaktır. Görüntülenen satır sayısı sabit olacak ve ilave veriler kaydırılabilir olacaktır.

Yukarıdaki iki paragraf çalışma zamanında genişleyen alanların davranış özellikleriyle ilgili oldukça açıklayıcıdır. Diğer form alanlarının davranış özellikleri aşağıda açıklanmıştır:

  1. O_AUTOSKIP seçeneği eğer O_STATIC etkisiz ve alan için tanımlanmış azami büyüyebilme miktarı tanımlı değilse gözardı edilecektir. Şu anda, kullanıcı alanın en sonuna gelip bir karakter yazdığında O_AUTOSKIP otomatik şekilde REQ_NEXT_FIELD form sürücüsü isteğini üretmektedir. En fazla büyüyebilme miktarı tanımlanmamış genişleyebilir bir alanda son karakter için bir konum yoktur. Eğer en fazla genişleme oranı tanımlanmışsa, O_AUTOSKIP seçeneği eğer alan en büyük değerine kadar genişlediyse normal çekilde çalışacaktır.

  2. O_STATIC özelliği eğer etkisizse alan içerisinde hizalama gözardı edilecektir. Şu anda, set_field_just tek satıra JUSTIFY_LEFT, JUSTIFY_RIGHT, JUSTIFY_CENTER özellikleri kazandırmak için kullanılabilir. Genişleyebilir tek satırlık alan yatay olarak genişleyip kaydırılabilir ve hizalanabilen çok daha fazla veri içerebilir. field_just'ten geri dönen değer değişmemiş olacaktır.

  3. Aşırı yüklenmiş form sürücü isteği REQ_NEW_LINE, O_NL_OVERLOAD form seçeneğinde O_STATIC değerinin etkisiz olmasına ve alan için en fazla genişleme miktarı tanımlanmamasına bakmaksızın aynı şekilde çalışır. Şu anda eğer O_NL_OVERLOAD etkinse, REQ_NEW_LINE eğer alanın son satırında çağrılırsa gizli olarak REQ_NEXT_FIELD üretir. Eğer bir alan sınırlara bağlı kalmadan genişleyebiliyorsa, son bir satır yoktur, REQ_NEW_LINE hiç bir zaman gizli olarak REQ_NEXT_FIELD üretmez. Eğer en fazla büyüme miktarı belirtilmişse ve O_NL_OVERLOAD form özelliği etkinse, eğer alan büyüyebileceği en büyük büyüklüğe gelmiş ve son satırda ise REQ_NEW_LINE sadece gizli olarak REQ_NEXT_FIELD üretecektir.

  4. dup_field çağrısı bilindiği gibi çalışır; alanı o anki önbellek boyunu ve alanın içeriği ile ikileştirecektir. Belirtilmiş en fazla büyüme miktarı da ikileştirilecektir.

  5. link_field bilindiği gibi çalışacaktır; O an bağlanan alan ile birlikte tüm alan özelliklerini ve paylaşılan önbelleği ikileştirecektir. Eğer O_STATIC alan seçeneği alanı paylaşımlı önbellek tarafından ardışıl olarak değiştirilirse, önbelleğin sahip olduğu veri miktarından fazlasının alana girilmesi durumunda nasıl davranış göstereceği o anki alanın özellik ayarına bağlıdır.

  6. field_info bilindiği gibi çalışacaktır; sat_say değişkeni new_field'a yapılan asıl çağrının değerini tutacaktır. Kullanıcı o anki önbellek boyutunu sorgulamak için dynamic_field_info'yu kullanmalıdır.

Yukarıdakilerin bazıları sadece form sürücüsünden sonra açıklanınca anlam kazanmaktadır. Sonraki bir kaç kısımda buna bakıyor olacağız.