GTKSharp программирование - инкапсуляция (Доступ к свойствам виджетов)

Модератор: Модераторы разделов

Аватара пользователя
Atrill
Сообщения: 27
ОС: openSUSE

GTKSharp программирование - инкапсуляция

Сообщение Atrill »

Код: Выделить всё

// project created on 16.06.2008 at 11:38
using System;
using Gtk;

namespace gtkProject1
{
    class MainClass
    {
        public static void Main()
        {
            Application.Init();
            Window window = new Window( "Окошко" );
            VBox vbox = new VBox();
            Button btn = new Button( "Жми" );
            vbox.Add( btn );
            Label label = new Label( "И дивись" );
            vbox.Add( label );
            btn.ButtonPressEvent += new ButtonPressEventHandler( btnPress );
            window.Add( vbox );
            window.Resize( 300, 200 );
            window.DeleteEvent += new DeleteEventHandler( winClose );
            window.ShowAll();
            Application.Run();
        }

        public static void btnPress( object sender, ButtonPressEventArgs args )
        {

        }

        public static void winClose( object sender, DeleteEventArgs args )
        {
            Application.Quit();
        }
    }
}


Итак, нужно чтобы при нажатии кнопки, панель изменила свой текст на "Привет мир". Однако инкапсуляция. Как ещё сделать это?
Спасибо сказали:
Аватара пользователя
Atrill
Сообщения: 27
ОС: openSUSE

Re: GTKSharp программирование - инкапсуляция

Сообщение Atrill »

/

Код: Выделить всё

/ project created on 19.06.2008 at 15:04
using System;
using Gtk;

namespace gtkSharp
{
    class MainClass
    {
        public static void Main()
        {
            Application.Init();
            Window window = new Window( "Окошко" );
            window.DeleteEvent += new DeleteEventHandler( WinClose );
            VBox vbox = new VBox();
            Button btn = new Button( "Жми" );
            btn.ButtonPressEvent += new ButtonPressEventHandler( BtnPress );
            Widget label = new Label( "Читай" );
            vbox.Add( btn );
            vbox.Add( label );
            window.Add( vbox );
            window.Resize( 300, 200 );
            window.ShowAll();
            Application.Run();
        }

        згидшс static void BtnPress( object sender, ButtonPressEventArgs args )
        {
            ((Label)label).Text = "Привет, Мир!!!";
        }

        public static void WinClose( object sender, DeleteEventArgs args )
        {
            Application.Quit();
        }

        public Label label;
    }
}


Всё ещё пытаюсь заставить это работать. Выдаёт ошибку:
An object reference is required for the nonstatic field, method or property(CS0120: `gtkSharp.MainClass.label')
Но, если сделать метод нестатическим, то выдаётся другая ошибка:
Method Name expected
Пожалуйста, подскажите что здесь делать те, кто сталкивался.
Спасибо сказали:
Аватара пользователя
Atrill
Сообщения: 27
ОС: openSUSE

Re: GTKSharp программирование - инкапсуляция

Сообщение Atrill »

Решение:

Код: Выделить всё

// project created on 20.06.2008 at 15:18
using System;
using Gtk;

namespace gtkProject
{
    class MainWindow
    {
        public MainWindow( string strName )
        {
            Window window = new Window( strName );
            VBox vbox = new VBox();
            Button button = new Button( "Нажми любую кнопку" );
            button.KeyPressEvent += new KeyPressEventHandler( ButtonPress );
            vbox.Add( button );
            Label label = new Label( "...." );
            vbox.Add( label );
            window.Add( vbox );
            window.Resize( 300, 200 );
            window.DeleteEvent += new DeleteEventHandler( CloseWindow );
            window.ShowAll();
        }

        void ButtonKeyPress( object sender, KeyPressEventArgs args)
        {
            label.Text = "Привет, мир !!!";
        }

        static void CloseWindow( object sender, DeleteEventArgs args )
        {
            Application.Quit();
        }

        Window window;
        Label label;
        Button button;
    }

    class MainClass
    {
        public static void Main(string[] args)
        {
            Application.Init();
            MainWindow window = new MainWindow( "Окошко" );
            Application.Run();
        }
    }
}


Однако теперь выдаётся следующее:

Код: Выделить всё

Exception in Gtk# callback delegate
  Note: Applications can use GLib.ExceptionManager.UnhandledException to handle the exception.
System.NullReferenceException: Object reference not set to an instance of an object
  at gtkProject.MainWindow.ButtonKeyPress (System.Object sender, Gtk.KeyPressEventArgs args) [0x0000b] in /home/vts/mySources/gtkProject/gtkProject/Main.cs:31
  at Gtk.Widget.KeyPressEventSignalCallback (IntPtr arg0, IntPtr arg1, IntPtr gch) [0x00000]
   at GLib.ExceptionManager.RaiseUnhandledException(System.Exception e, Boolean is_terminal)
   at Gtk.Widget.KeyPressEventSignalCallback(IntPtr arg0, IntPtr arg1, IntPtr gch)
   at Gtk.Widget.KeyPressEventSignalCallback(IntPtr , IntPtr , IntPtr )
   at Gtk.Application.gtk_main()
   at Gtk.Application.gtk_main()
   at Gtk.Application.Run()
   at gtkProject.MainClass.Main(System.String[] args) in /home/vts/mySources/gtkProject/gtkProject/Main.cs:line 56
Спасибо сказали:
Аватара пользователя
Atrill
Сообщения: 27
ОС: openSUSE

Re: GTKSharp программирование - инкапсуляция

Сообщение Atrill »

Проблема оказалась в версии MonoDevelop. В версии 1.0 её нет. Код работает хорошо и стабильно.
Примечание: событие "щелчок мышью" описывается:
button.clicked += new EventHandler( имя_метода );
Спасибо сказали: