wiki-framework-arama-kerneli

ARAMA KERNELI

Konu başlıkları

[düzenle] Arama Kernelı Nedir ?

'NOT : BU DÖKÜMANI OKUMADAN ÖNCE BATCH KERNEL VE SEÇİM KERNELINE GÖZ ATMANIZ FAYDALI OLACAKTIR..'

Arama Kernelı , Batch Kernel'den türetilmiş dolayısıyla Batch Kernelın tüm özelliklerini miras olarak alan , Seçim Kernelı gibi oluşturulmuş kombine bir sınıftır. Arama Kernelı ile önceden oluşturduğumuz veri tabanı , veri tablosu gibi bir yerden belirlediğimiz kriterlere göre ara yapabilir ve yaptığımız arama sonuçlarından istediğimizi seçip seçtiğimiz veri ile ilgili işlemler yapabiliriz.Burada arama kriterlerini oluşturma ve kontrol etme Batch Kernel mekanizması ile , arama sonuçlarından istediğimizi seçme ve seçtiğimiz veriyle işlem yapma Seçim Kernelı mantığıyla halledilir.Mesela , elimizde öğrenci numarası , öğrenci adı/soyadı ve öğrenci numarası bilgileri olan 5 tane öğrencinin verisi olsun.Bu öğrenciler arasından gireceğimiz numara aralığına göre öğrencileri listelemek ve bu listedeki öğrenciler arasından istediğimizi seçip seçilen öğrencinin bilgilerini mesaj olarak ekrana bastırmak isteyelim.( Bu örneği anlatım kısmından sonra gerçekleştirece ğiz.. ).İşte burda numara aralığını girmeyi , girilen aralıkları kontrol etme ve boş alan bırakılmasını engelleme gibi işlemleri batch kernel mekanizması ile kriterlerimizi oluşturduktan sonra bu kriterlere göre aramayı ve sonuçlar içierinden seçim yapmayı seçim kernelı mantığıyla halledebiliriz.Şimdi Arama Kernel sınıfı nı yakından inceleyelim..

[düzenle] Arama Kernel Sınıfı

Arama Kernelı , Batch Kernelı sınıfından miras alınarak oluşturulmuş abstract Seçim Kernelı sınıfıdır.Arama Kernelı sınıfından miras alarak farklı aramalar yapacak yeni arama kernelleri oluşturulabilir.Oluşturduğumuz yeni sınıfta zorunlu fonksiyonları override etmek ve kernelın çalışması için hazır fonksiyonlar ile ayarlamalar yapmamız gerekmektedir.Bahsettiğimiz zorunlu ve hazır fonksiyonları inceleyelim..

[düzenle] Zorunlu Fonksiyonlar

Bu fonksiyonlar pure virtual fonksiyonlardır.Miras alınan yeni sınıfta implement edilmek zorundadırlar.Arama kriterlerimizi ve seçim işlemimizi bu fonksiyonlar sayesinde yapabiliriz.

[düzenle] SETUP_FORM()

Bu fonksiyon Batch Kernel'den miras alınan zorunlu fonksiyondur. Batch mekanizması için tasarladığımız formu ayarlamamızı ve arama sonuçlarını listeleyeceğimiz tablewidget ile ilgili ayarlamalar yapmamızı sağlar.Form başlığı , RUN_BATCH fonksiyonunu çalıştıracak olan butonun adı , butonu üzerindeki icon , sistem çalıştığında odaklanılacak ilk widget , arama sonuçlarının listeleneceği tablewidget'ın kolon isimlerini , arama sonuçlarının sıralı liste halinde mi yoksa oluşturulma sırasına göre mi olacağı gibi ayarlamaları bu fonksiyonun içinde hazır fonksiyonları çağırarak yaparız.

  • Elimizde 5 tane öğrenci ve her öğrencinin numara , isim/soyisim , sınıf bilgileri olsun.Bu öğrencileri vereceğimiz numara aralığına göre listeleyelim ve sonuç ekranından herhangi bir öğrenciyi seçtiğimizde , seçilen öğrencinin bilgilerini ekrana mesaj olarak basacak Arama kernel'ı tasarlayalım..
  • Arama yapacağımız ekranımız.. :
ARAMA_EKRANI_TASARIMI
  • Örneğimize göre fonksiyonumuzu yazalım.. Bu fonksiyonda , form ayarlamalarımızı yapıyoruz..
void TEST_OGRENCI_ARAMA::SETUP_FORM ()
{
   REGISTER_TABLE_WIDGET ( m_ui->tableWidget_secim_ekrani );
   REGISTER_ARAMA_BUTTONS_WIDGET ( m_ui->widget_batch_buttons );
   SET_HEADERS ( QStringList() << tr("Öğrencinin Numarası") << tr("Öğrencinin Adı/Soyadı") << tr("Öğrencinin Sınıfı") );
   SET_SORTING ( false );
   SET_FIRST_FOCUS_WIDGET ( m_ui->lineEdit_ogrenci_numara_aralik_1 );
   SET_PAGE_TITLE    (tr("TEST_OGRENCI_ARAMA EKRANI"));
   SET_HELP_PAGE     ("TEST_OGRENCI_ARAMA.html");
   m_ui->tableWidget_secim_ekrani->setColumnWidth( 3   , 10);
   SET_SETTING_NAME  ("TEST_OGRENCI_ARAMA");
   SET_ENTER_KEY_FOR_RUN_BATCH ( true );
   SET_FIND_BUTTON_NAME ( "Öğrenci Bul" );
   CREATE_DATA();
}
  • Kernel oluşturulduğunda arama ekranı bu akış ile hazırlanır..

 

 

 

ARAMA_KERNEL_ACILIS_AKISSEMASI

 

 

 

[düzenle] CHECK_VAR()

Bu fonksiyon , Batch Kernel sınıfından miras aldığımız fonksiyonlardandır.Arama Kernelınde bu fonksiyonda arama kriterlerimizi oluşturacağız ve kriterlere uymayan arama girişlerinde hata oluşturarak arama işlemine geçişi engelleyeceğiz.

  • Öğrenci Arama örneğimize göre , fonksiyonumuzu kodlayalım.. Bu fonksiyonda , arama yapmak için girilen değerlerin 0 ile 5 arasında olup olmadığını kontrol edelim..
int TEST_OGRENCI_ARAMA::CHECK_VAR ( QObject * object )
{
   if( object EQ m_ui->lineEdit_ogrenci_numara_aralik_1 ){
       if( m_ui->lineEdit_ogrenci_numara_aralik_1->text().toInt()< 0 OR
               m_ui->lineEdit_ogrenci_numara_aralik_1->text().toInt() > 5 ){
           MSG_ERROR("HATA : Numara araliğı 0'dan küçük , 5 ten buyuk olamaz..", this);
           return CEREN_FAIL;
       }
   }
   if( object EQ m_ui->lineEdit_ogrenci_numara_aralik_2 ){
       if( m_ui->lineEdit_ogrenci_numara_aralik_2->text().toInt() < 0 OR
               m_ui->lineEdit_ogrenci_numara_aralik_2->text().toInt() > 5 ){
           MSG_ERROR("HATA : Numara araliğı 0'dan küçük , 5 ten buyuk olamaz..", this);
           return CEREN_FAIL;
       }
   }
   return CEREN_OK;
}
  • Örneğimizi çalıştırarak fonksiyonumuzu test edelim.. Önce birinci alana değerler girilerek kontrol ediliyor.. :
CHECK_VAR_TEST_1
CHECK_VAR_TEST_2
  • İkinci alana girilen değerler kontrol ediliyor.. :
CHECK_VAR_TEST_3
CHECK_VAR_TEST_4
  • Girilen değerler kernel tarafından , bu akış şemasına göre kontrol edilir..

 

 

 

CHECK_VAR_AKISSEMASI

 

 

 

[düzenle] CHECK_RUN()

Bu fonksiyonda Batch Kernel'den miras alınan zorunlu fonksiyondur.Batch mekanizması çalışırken işlem yapılacak bilgilerde eksik var mı diye kontrol edilir.Hata , eksik olması halinde odaklanılan widget değiştirilmeden bir sonraki adıma geçmesi engellenir. Bu fonksiyonu arama yapmadan önce , arama kriterlerimizde eksik bilgi olup olmadığını kontrol etmek için kullanacağız.

  • Öğrenci Arama örneğine göre bu fonksiyonu kodlayalım.. Bu fonksiyonda arama öncesinde arama kriterlerinin boş bırakılıp bırakılmadığı kontrol ediliyor.. :
int TEST_OGRENCI_ARAMA::CHECK_RUN ()
{
   if( m_ui->lineEdit_ogrenci_numara_aralik_1->text() EQ NULL  OR
       m_ui->lineEdit_ogrenci_numara_aralik_2->text() EQ NULL ) {
       MSG_ERROR("HATA : Numaraya göre arama kıstas alanları boş bırakılamaz.." , this);
       return CEREN_FAIL ;
   }
   if( m_ui->lineEdit_ogrenci_numara_aralik_1->text().toInt() >=
       m_ui->lineEdit_ogrenci_numara_aralik_2->text().toInt() ) {
       MSG_ERROR("HATA : Birinci alan ikinci alandan büyük olamaz.." , this);
       return CEREN_FAIL ;
   }
   return CEREN_OK;
}
  • Örneğimizi çalıştırarak , fonksiyonumuzu test edelim.. Öğrenci numara alanlarını boş bıraktığımızda CHECK_RUN'a takılıyoruz.. :
CHECK_RUN_TEST
[düzenle] SEARCH()

Bu fonksiyon , Batch Kernel'daki RUN_BATCH fonksiyonudur.Bu fonksiyonda oluşturduğumuz kriterlere göre aramamızı yapacak ve arama sonuçlarımızı tablewidget'ta listeleyeceğiz.

  • Örneğimize göre öğrencileri verilen kriterlere göre aradık.Bu fonksiyonda sonuçları tablewidget'ta gösteriyoruz.. :
void TEST_OGRENCI_ARAMA::SEARCH ()
{
   m_ui->tableWidget_secim_ekrani->clearContents();
   int counter = 0 ;
   for( int i = 0 ; i < 5 ; ++i ){
       if( data_list[i][0].toInt() >= m_ui->lineEdit_ogrenci_numara_aralik_1->text().toInt() AND
               data_list[i][0].toInt() <= m_ui->lineEdit_ogrenci_numara_aralik_2->text().toInt() ){
           counter = ADD_NEW_ROW();
           m_ui->tableWidget_secim_ekrani->item( counter , 0 )->setText( data_list[i][0]);
           m_ui->tableWidget_secim_ekrani->item( counter , 1 )->setText( data_list[i][1]);
           m_ui->tableWidget_secim_ekrani->item( counter , 2 )->setText( data_list[i][2]);
       }
   }
   m_ui->lineEdit_ogrenci_numara_aralik_1->setText("");
   m_ui->lineEdit_ogrenci_numara_aralik_2->setText("");
}
  • Örneği çalıştırarak fonksiyonumuzun nasıl çalıştığına bakalım.. Arama koşullarına göre arama yapılıyor ve sonuçlar tablewidget'ta gösteriliyor.. :
RUN_BATCH_TEST
  • Kernel arama işlemini , bu akışa göre yapar..

 

 

 

SEARCH_AKISSEMASI

 

 

 

[düzenle] SINGLE_LINE_SELECTED()

Bu fonksiyon , Arama Kernel sınfına Seçim Kernel'inin özelliklerini yüklemek için oluşturulmuş abstract bir fonksiyondur.

Bu fonksiyonda arama sonuçlarının olduğu tablewidget üzerindeki verilerden istenilen seçildiğinde , seçilen veri ile ilgili işlemler yapılacaktır.

  • Bu fonksiyonda , sonuç ekranından bir kayıt seçildiğinde kayıtla ilgili bilgileri ekrana mesaj olarak basıyoruz ve tekrar arama ekranını dönüyoruz.. :
int TEST_OGRENCI_ARAMA::SINGLE_LINE_SELECTED ( int selected_row_number )
{
   QString str = "SELECTED Kayıt Bilgileri : \n";
   str.append( "Numara : " ) ;
   str.append( m_ui->tableWidget_secim_ekrani->item( selected_row_number , 0 )->text() );
   str.append("\nIsim : ") ;
   str.append( m_ui->tableWidget_secim_ekrani->item( selected_row_number , 1 )->text() );
   str.append("\nSinif : ");
   str.append( m_ui->tableWidget_secim_ekrani->item( selected_row_number , 2 )->text() );
   MSG_INFO( str , this);
   m_ui->tableWidget_secim_ekrani->setEnabled(false);
   m_ui->lineEdit_ogrenci_numara_aralik_1->setEnabled(true);
   m_ui->lineEdit_ogrenci_numara_aralik_2->setEnabled(true);
   return CEREN_CONTINUE;
}
  • Örneğimizi çalıştırarak fonksiyonu test edelim.. Seçme ekranından bir öğrenci seçerek bu fonksiyonu test ediyoruz.. Mesajdan sonra tekrar arama ekranına dönüyoruz.. :
CHECK_RUN_TEST
CHECK_RUN_TEST
  • Kernel , tablodan kayıt seçme işlemini , bu akış şemasına göre yapar..

 

 

 

SINGLE_LINE_SELECTED_AKISSEMASI

 

 

 

[düzenle] MULTI_LINE_SELECTED()

Bu fonksiyonda Arama Kernel sınıfına , Seçim Kernelı mantığı kazandırılmak için oluşturulmuş virtual fonksiyondur.Bu fonksiyon tablewidget'tan birden fazla satır seçilidiğinde seçilen satırları list şeklinde verir.Bu fonksiyonu seçilen satırlarla istediğimiz işlemi yapabiliriz.

[düzenle] SELECTED_LINE()

Bu fonksiyonda, programcıya seçilen satır gönderilir.Programcı fonksiyonda program mantığına göre satır ile ilgili işlemlerini burada yapabilir.

[düzenle] Hazır Fonksiyonlar

Bu fonksiyonlar Arama Kernelının çalışabilmesi için hazırlanmış , kernel ile ilgili ayarlamaları yapmamızı sağlayan fonksiyonlardır.

[düzenle] START_ARAMA_KERNEL()

Verilen database ile birlikte kernelı başlatır.

[düzenle] ADD_NEW_ROW()

TableWidget'taki satırların sonuna yeni bir satır ekler.

[düzenle] REGISTER_TABLE_WIDGET

Arama sonuçlarının gösterileceği TableWidget bu fonksiyon ile kernele tanıtılır.Fonksiyona parametre olarak gönderilen TableWidget , bizim arama sonuçlarımızı liste şeklinde gösteren ekranımız olur.Kernel bu ekranı arama sonuçlarına göre otomatik olarak doldurur.

[düzenle] SET_FIND_BUTTON_NAME

Tıklandığında aramayı başlatacak olan butona , istediğimiz ismi atayacak fonksiyondur.

[düzenle] REGISTER_ARAMA_BUTTONS_WIDGET

Arama sonucunda , aram kriterleri için kullandığımız tüm widgetların , arama sonunda erişilemez olmasını sağlayan fonksiyondur.

  • NOT : Bu widget'lar tasarım esnasında frame içerisine yerleitirilmelidir.
[düzenle] SET_HEADERS

Bu fonksiyon arama sonuçlarının listeleneceği TableWidget'ta kolon isimlerini vereceğimiz isim listesine göre doldurur.

  • NOT : Kolon başlıkları QStringList olarak gönderilmelidir.
[düzenle] SET_SORTING

Arama sonuçlarının TableWidget'ta sıralı listelenmesi özelleğini açar veya kapatır.Default olarak sıralıdır.Fonksiyon false parametresi ile çağırıldığında bu özellik devre dışı olur.

  • NOT : Bu özelliği devre dışı bırakmak istiyorsak INIT_KERNEL fonksiyonundan önce kullanmalıyız.
[düzenle] REFRESH_ARAMA

Aramayı mevcut kriterlere göre tekrar yapar.

[düzenle] SET_FIRST_FOCUS_WIDGET

Program başladığında arama ekranında ilk odaklanılacak widget'ı parametre olarak gönderdiğimiz widget yapar.

[düzenle] SET_PAGE_TITLE

Arama ekranının başlığını verdiğimiz başlık yapar.

[düzenle] SET_HELP_PAGE

Yardım sayfasını parametre olarak verdiğimiz sayfa yapar.

[düzenle] SET_ENTER_KEY_FOR_RUN_BATCH

Arama kriterleri girildikten sonra 'Enter' tuşuna basıldığında arama yapuılmasını aktif eder.

[düzenle] SET_FIND_BUTTON_NAME

Arama kriterlerine göre tıklandığında aramayı başlatacak olan butona isim vermemizi sağlar.

[düzenle] ARAMA KERNELI Tasariminda Dikkat Edilmesi Gereken Kurallar

  • Arama Kernelı , Batch Kernel ve Seçim Kernelı özelliklerini taşıdığı için Batch ve Seçim Kernellerinin çalışma mantığına uygun görev dağılımı yapılmalı.Arama kriterlerini oluşturma ve arama yapma rutin işlemlerini Batch Kernel fonksiyonlarında , arama sonuçlarına göre seçim yapmayıda Seçim Kernel fonksiyonlarında yapmalıyız.
  • Arama kriterlerini oluşturmak için kullanacağımız widget'lar frame içerisinde olmalıdır.Arama ekranı tasarlarken buna dikkat etmeliyiz.
  • Arama kriterlerinin kontrolleri CHECK_VAR fonksiyonunda , widget'ların boş olup olmadığı CHECK_RUN fonksiyonunda kontrol edilmelidir.
  • Arama ve Batch ekranlarinda kullanilan kernel button widgetlarin sizepolicy'leri vertical ve horizontal icin fixed olmalıdır.
  • Arama ekranı için default olarak dialog kullanılmalıdır.Ayrıca layout olarak GridLayout kullanılmalıdır.Bunun dışında layoutlarda program crash olabilir.