Окно чата с Gtk+

Я пишу что-то вроде чата в Ada, используя Gtk+ (технически GtkAda). И у меня проблемы с некоторыми Gtk. Мое окно состоит из Entry, TextView и Button (Отправить).

Сложная часть находится в обработчике On_Button_Send_Clicked (процедура, которая обрабатывает сигнал «нажатие» на кнопку). Я хочу прочитать текстовую форму Entry и поместить ее в TextView, но как я могу получить доступ к TextView и Entry из процедуры, которая имеет доступ только к Button, так как я связываю сигнал с обработчиком таким образом:

package Handlers is new Gtk.Handlers.Callback
    (Widget_Type => Gtk_Widget_Record);

procedure On_Button_Send_Clicked
    (Object : access Gtk_Widget_Record'Class);
...

Handlers.Connect
   (Button, "clicked", Handlers.To_Marshaller (On_Button_Send_Clicked'access);

Мой вопрос: существуют ли какие-либо методы, такие как Get_Gtk_Entry или Get_Text_View, которые были бы простыми? Или есть другой способ, но такой же простой?

Я также наткнулся на решение, в котором я объявляю запись:

type Widget_Collection_Record is new Glib.Object.GObject_Record with record
    Terminal   : Gtk.GEntry.Gtk_Entry;
    Text_Field : Gtk.Text_View.Gtk_Text_View;
end record;

и сделайте обратный вызов следующим образом:

package Widget_Collection_Cb is new Gtk.Handlers.Callback
    (Widget_Type => Widget_Collection_Record);

procedure On_Button_Send_Clicked
    (Object : access Widget_Collection_Record'Class);

Но теперь у меня другой вопрос: как связать сигнал от Button с обработчиком, ведь виджет Button не входит в состав моего Widget_Collection_Record?

Я не уверен, ясно ли я говорю...

Поэтому, пожалуйста, если вы знаете что-то, что может решить мою проблему, пожалуйста, напишите - это может быть C, C++, Python - я попытаюсь преобразовать это в Ada ;D

И резюме моей проблемы:

Как я могу написать обработчик для чтения из Entry и записи в Text_View при нажатии Button?

Изменить: вопрос закрыт. Я знаю, что неясно, о чем я просил, и поэтому я выбрал способ передачи записи User_Data в обратный вызов... и теперь моя новая проблема здесь


person thim    schedule 16.01.2012    source источник
comment
Если вы не получили ответ здесь, вы можете попробовать на comp.lang.ada, некоторые знающие разработчики GtkAda тусуются там.   -  person Marc C    schedule 16.01.2012
comment
Также может быть полезно подготовить sscce.   -  person trashgod    schedule 16.01.2012
comment
См. также этот ответ.   -  person trashgod    schedule 17.01.2012
comment
См. также этот пример.   -  person trashgod    schedule 20.01.2012
comment
Спасибо TrashGod за это действительно хороший пример; D Кстати: вы знаете другой пример с gtk.builder и даже gtkada.builder, потому что у меня тоже проблемы с этим (и /testgtk/create_builder.adb помогает только в этом)   -  person thim    schedule 21.01.2012
comment
Я обновил этот ответ ссылкой на glade; сгенерированный исходный код Ады может быть полезен.   -  person trashgod    schedule 21.01.2012


Ответы (1)


Обычно я использую эту ссылку: http://www.univ-orleans.fr/sciences/info/ressources/webada/doc/gtkada/gtkada_rm/index.html

Вы не предоставили много информации об организации вашего проекта. Но если у вас есть простая процедура, в которой вы объявляете все, то:

procedure foo is
    -- variables
    E : GTk_GEntry;
    T : Gtk_Text_View;
    ...
    procedure On_Button_Send_Clicked (Object : access Gtk_Widget_Record'Class) is
    begin
       S : String := Get_Text (E);
       B : Gtk_Text_Buffer := Get_Buffer (T);
    begin
       Set_Text (B, S);
       ...
    end On_Button_Send_Clicked;
begin
   ...
   Handlers.Connect
      (Button, "clicked", Handlers.To_Marshaller (On_Button_Send_Clicked'access);
   ...
end foo
person hachachin    schedule 01.05.2012
comment
Насколько я помню, проблема заключалась в том, что я не мог добраться до Text_View, потому что у меня не было никакой переменной Text_View внутри обработчика Btn_clicked. (В этой области не было Text_View) Но ведь я основывал свое приложение на gtk_bulder, и с помощью этого движка я смог добраться до любого объекта окна. В любом случае, спасибо за ответ, хотя 5 месяцев после того, как вопрос был задан, это довольно много времени = P - person thim; 01.05.2012