GTK - Как правильно вызвать процедуру(функцию) из меню?

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

GTK - Как правильно вызвать процедуру(функцию) из меню?

Сообщение javaca » 01.04.2012 20:19:02

Доброго времени суток!
Прошу сильно не пинать ногами, так как во FreePascal, как и в GTK я новичок. Данный пример пишется на Linux с использованием Geany. И так приступим по порядку к сути воспроса.

В моем GTK меню есть пункт - "Подпункт меню"
Код: Выделить всё
  kartmenu := gtk_menu_new();
  kart := gtk_menu_item_new_with_mnemonic('_Меню');
  gtk_menu_item_set_submenu(GTK_MENU_ITEM(kart), kartmenu);
  kardet := gtk_menu_item_new_with_label('Подпункт меню');
  gtk_menu_shell_append(GTK_MENU_SHELL(kartmenu), kardet);


если нажать на "Подпункт меню" то должна запускаться процедура (функция) создания вкладки.

Код: Выделить всё
// тестовая процедура для вызова из меню
procedure test_label_book( notebook : pGtkWidget); cdecl;
var
  hbox, labels, button, image : pGtkWidget;
  w, h : gint;
  style   : pGtkRcStyle;
begin
  hbox := gtk_hbox_new(FALSE, 3);
  labels := gtk_label_new('Тестовая закладка');
  gtk_box_pack_start(GTK_BOX(hbox), labels, TRUE, TRUE, 0);
  image := gtk_image_new_from_stock(GTK_STOCK_CLOSE, GTK_ICON_SIZE_MENU);
  gtk_icon_size_lookup (GTK_ICON_SIZE_MENU, @w, @h);
  button := gtk_button_new();
  gtk_widget_set_size_request(GTK_WIDGET(button), 16, 16);
  gtk_signal_connect_object(pGTKOBJECT(button), 'clicked', GTK_SIGNAL_FUNC(@remove_book), pGTKOBJECT(notebook));
  gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0);
  gtk_container_add (GTK_CONTAINER(button), image);
  style := gtk_rc_style_new();
  style^.xthickness := 0;
  style^.ythickness := 0;
  gtk_widget_modify_style(GTK_WIDGET(button),style);
  gtk_widget_show_all(hbox);
 
  gtk_notebook_append_page (GTK_NOTEBOOK (notebook), gtk_label_new('Проверка'), hbox);
end;


Если вызвать напрямую данную процедуру (функцию) test_label_book(notebook), то прекрасно работает. Я использую так же VBox.

Код: Выделить всё
  notebook := gtk_notebook_new();
  gtk_container_set_border_width(GTK_CONTAINER(notebook), 15);
  gtk_notebook_set_tab_pos(GTK_NOTEBOOK (notebook), GTK_POS_TOP);

test_label_book(notebook);

  vbox := gtk_vbox_new(FALSE, 2);
  gtk_container_add(GTK_CONTAINER(window), vbox); 
  gtk_box_pack_start(GTK_BOX(vbox), mb, FALSE, FALSE, 0); // здесь меню
  gtk_box_pack_start(GTK_BOX(vbox), notebook, TRUE, TRUE, 0);
  gtk_box_pack_start(GTK_BOX(vbox), status_bar, FALSE, FALSE, 0);//здесь статусбар


Вопрос заключается в следующем. Как создать корректный запрос к данной процедуре (функции) "test_label_book" из меню? Ниже приведенный запрос в разных вариациях у меня не заработал.

Код: Выделить всё
gtk_signal_connect_object(pGTKOBJECT(kardet), 'activate', GTK_SIGNAL_FUNC(@test_label_book), pGTKOBJECT(notebook));
javaca
незнакомец
 
Сообщения: 1
Зарегистрирован: 01.04.2012 19:49:49

Re: GTK - Как правильно вызвать процедуру(функцию) из меню?

Сообщение Сквозняк » 03.04.2012 09:25:57

Если размер бинарника не критичен, то проще с GTK работать через лазарус, вручную мало кто этим занимается - почти все в этом вопросе новички. Обычно жмут на несколько кнопок и появляется меню и нужные вкладки. Полученный код легко портируется на другие тулкиты. Тот кто писал лазарусный биндинг к GTK, конечно знал как вызвать его функцию вручную, для остальных это навроде ассемблера.
Сквозняк
энтузиаст
 
Сообщения: 1126
Зарегистрирован: 29.06.2006 22:08:32


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5

Рейтинг@Mail.ru