Пример программы

Перейдём к практике. Рассматриваемый ниже исходный код взят с авторского сайта Vala и слегка подкорректирован для удобства работы. Это программа просмотра текстовых файлов в отдельном окне с панелью инструментов, панелями прокрутки и всплывающим окном выбора файла, в общем, со всеми элементами графического интерфейса пользователя.

using Gtk;

 public class TextFileViewer : Window
 {
   private TextView text_view;

   public TextFileViewer() 
   {
     this.title = "Просмотр текстового файла";
     this.position = WindowPosition.CENTER;
     set_default_size( 500, 400 );

     var toolbar = new Toolbar();
     var open_button = new ToolButton.from_stock( STOCK_OPEN );
     toolbar.add( open_button );
     open_button.clicked.connect( on_open_clicked );

     this.text_view = new TextView();
     this.text_view.editable = false;
     this.text_view.cursor_visible = false;

     var scroll = new ScrolledWindow( null, null );
     scroll.set_policy( PolicyType.AUTOMATIC, PolicyType.AUTOMATIC );
     scroll.add( this.text_view );

     var vbox = new VBox( false, 0 );
     vbox.pack_start( toolbar, false, true, 0 );
     vbox.pack_start( scroll, true, true, 0 );
     add( vbox );
   }

   private void on_open_clicked() 
   {
     var file_chooser = new FileChooserDialog( "Открыть файл", this,
                              FileChooserAction.OPEN,
                              STOCK_CANCEL, ResponseType.CANCEL,
                              STOCK_OPEN, ResponseType.ACCEPT, null );
    if( file_chooser.run() == ResponseType.ACCEPT ) 
     {
       open_file( file_chooser.get_filename() );
     }
     file_chooser.destroy();
   }

   private void open_file( string filename ) 
   {
     try 
     {
       string text;
       size_t size;
       FileUtils.get_contents( filename, out text, out size );
       this.text_view.buffer.set_text( text, (int) size );
     } catch( Error e ) 
       {
         stderr.printf( "Ошибка: %s\n", e.message );
       }
   }

   public static int main( string[] args ) 
   {
     Gtk.init( ref args );
     var window = new TextFileViewer();
     window.destroy.connect( Gtk.main_quit );
     window.show_all();
     Gtk.main();
     return 0;
   }
 }

При компиляции потребуется библиотека gtk+, поэтому необходимо проверить, установлена ли она в вашей системе.

Важное замечание: документацию (на английском языке) по всем классам, методам и атрибутам, используемым в данной программе, можно найти на специализированном сайте документации по Vala(слева в списке пакетов-библиотек выберите тот, который вам нужен). Например, в нашем случае следует обратиться к странице по gtk+-2.0, найти на ней класс Window и т.д. Полезную информацию также можно извлечь из файлов описания API-интерфейсов (код на языке C), расположенных в каталоге /usr/share/vala/vapi.

После директивы, объявляющей использование библиотеки Gtk (строка 1), начинается определение класса с открытым доступом (public) TextFileViewer, являющегося подклассом Window (строка 3).

Наш новый тип объекта – класс TextFileViewer – содержит один закрытый (private) член-переменную text_view (строка 5) и четыре члена-метода, из которых два являются открытыми (public) – конструктор TextFileViewer (строка 7) и точка входа в программу main (строка 56) – и два закрытыми (private), недоступными извне – функции on_open_clicked (строка 32) и open_file (строка 42). По их именам можно понять, что они делают.

Те, кто знаком с языками C++ и C#, обратят внимание на отсутствие деструктора. Дело в том, что задачу управления памятью Vala берет на себя, но при необходимости вы можете написать собственный деструктор. Синтаксис точно такой же, как в упомянутых выше языках: префикс "тильда" (~) и имя класса. В рассматриваемом примере деструктор выглядел бы так:

~TextFileViewer() { ... }

В методах часто используется ключевое слово this, известное всем ОО-программистам, которое позволяет ссылаться на текущий объект, конкретный экземпляр данного класса.

В строках 9–11 определяются характеристики окна: заголовок, положение, размеры.

Строки 13–16 – создание панели инструментов и размещение на ней кнопки открытия файла. Здесь следует отметить функцию связывания события "щелчок по кнопке" и метода обработки этого события on_open_clicked (строка 16).

В строках 18–20 внутренняя переменная класса text_view инициализируется вновь создаваемым объектом TextView – панелью просмотра текста, без возможности редактирования и без вывода курсора.

Панель с возможностью прокрутки в обоих направлениях (ScrolledWindow) создаётся и связывается с только что организованной областью просмотра текста в строках 22–24.

Далее в строках 26–29 создаётся контейнер VBox. В него упаковывается сначала панель инструментов (строка 27), заполняющая всё пространство по ширине, но без возможности увеличения размера по вертикали, затем панель просмотра текста с прокруткой (строка 28), которая заполняет всю ширину контейнера и может увеличивать свой размер по вертикали. Созданный контейнер вписывается в главное окно приложения.

Со строки 32 начинается метод-обработчик щелчка по кнопке. Здесь создаётся, инициализируется и запускается панель выбора открываемого файла, в которой можно либо выбрать нужный файл и щёлкнуть по кнопке Open (Открыть), либо отказаться от выбора, щёлкнув по кнопке Cancel (Отмена). В любом случае эта панель закрывается, а соответствующий объект удаляется (строка 39).

Строки 42–54 – метод open_file, непосредственно выполняющий процедуру открытия заданного файла. Отметим, что вызывается этот метод из предыдущей функции on_open_clicked (см. строку 37).

Завершающим в определении класса является "главный" метод main – точка входа в программу (строки 56–64). Разумеется, он должен быть общедоступным (public). Здесь инициализируется Gtk-среда (строка 58), создаётся экземпляр нашего класса (строка 59), выполняется связывание закрытия и удаления данного окна с gtk-функцией завершения приложения (строка 60), активизируются и выводятся все элементы в иерархии контейнера (строки 61 и 62).

Компиляция программы выполняется с помощью команды:

valac --pkg gtk+-2.0 text-file-viewer.vala

Отметим использование ключа компилятора --pkg, который позволяет включить в программу vapi-интерфейсы для связывания с соответствующим пакетом. В данном случае включается файл gtk+-2.0.vapi, обеспечивающий связь с библиотекой gtk+.

Подводя итог, можно отметить лаконичность и компактность исходного кода, которую обеспечивает язык Vala при написании объектно-ориентированных программ с графическим интерфейсом, а также "защиту" прикладного разработчика от необходимости разбора многочисленных деталей реализации этого интерфейса.

Заключение

Итак, мы изучили возможности объектно-ориентированного программирования в языке Vala. Следующая, заключительная статья цикла будет посвящена расширенным возможностям языка, а также применению штатных инструментальных средств и утилит.

Last updated