Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка Windows Forms > Timer и объекты формы


Автор: Валерия 19.12.2007, 20:23
Код

using System;
using System.Windows.Forms;
using t = System.Threading;

namespace doroga
{
    public partial class Form1 : Form
    {
        static int x = 0;
        static int y = 0;
        public Form1()
        {
            InitializeComponent();

            t.Timer tmr = new t.Timer(test, "testing...", 1000, 1000);

        }

        static void test(object data)
        {
            button1.Location = new System.Drawing.Point(++x, ++y);
        }

    }
}


Вот такое выдает:
Код

An object reference is required for the nonstatic field, method, or property 'doroga.Form1.button1'


Т.е нужно что бы кнопка была static
А если я её делаю статик, то выдает много:
Код

Static member 'doroga.Form1.button1' cannot be accessed with an instance reference; qualify it with a type name instead    


Добавлено через 1 минуту и 22 секунды
Собственно мне нужно что бы кнопка двигалась каждую секунду smile

Добавлено через 9 минут и 12 секунд
Разобралась. Нада не делать test статическим.
Но теперь выкидывает ошибку отладчик:
Cross-thread operation not valid: Control 'button1' accessed from a thread other than the thread it was created on.

Автор: mr.DUDA 19.12.2007, 20:45
Цитата(Валерия @  19.12.2007,  20:23 Найти цитируемый пост)
Cross-thread operation not valid: Control 'button1' accessed from a thread other than the thread it was created on.

Юзать не System.Threading.Timer а System.Windows.Forms.Timer, ИЛИ делать так:
Код
        void test(object data)
        {
            this.Invoke(new MethodInvoker(delegate()
            {
                   button1.Location = new System.Drawing.Point(++x, ++y);
            }));
        }


P.S. вопрос про потоки и WinForms уже тыщу раз поднимался...

Автор: Валерия 19.12.2007, 21:01
Спасибо, работает smile
Но заметила еще одну проблему.
Вообще я делаю cветoфор smile
Так вот, "mашинка" только до 225 едет, а потом просто вырубаются все таймеры и всё замирает (не зависает)
Код

using System;
using System.Windows.Forms;
using t = System.Threading;

namespace doroga
{
    public partial class Form1 : Form
    {
        static int x = 0;
        static int s = 0;
        public Form1()
        {
            InitializeComponent();

            t.Timer car = new t.Timer(gocar, "test", 0, 40);
            t.Timer svet = new t.Timer(gosvet, "", 0, 4000);

        }

        void gosvet(object data)
        {
            if (s == 0)
            {
                button3.Text = "K";
                s = 1;
            }
            else
            {
                button3.Text = "З";
                s = 0;
            }
        }

        void gocar(object data)
        {
            if (x == 200 && s == 1) { }
            else
            {

                this.Invoke(new MethodInvoker(delegate()
                {
                button1.Location = new System.Drawing.Point(++x, 0);
                textBox1.Text = x.ToString();
                }));
                
                
            }


        }

    }
}

Автор: Валерия 19.12.2007, 21:30
Да и в консольном приложении - таймер работает до поры до времени, а потом просто вырубаеться

Автор: Валерия 19.12.2007, 22:01
Еще вопрос, если создать класс и с него попытаться обратиться к какомуто объекту формы - то вообще никак smile

Автор: mr.DUDA 20.12.2007, 12:48
В gosvet тоже нужен Invoke. И снова вопрос, почему бы просто не перетянуть на форму Timer с тулбокса, выставить Enabled=true и подписаться на Tick? Ведь проще же, и гемора с Invoke не нужно.

Цитата(Валерия @  19.12.2007,  22:01 Найти цитируемый пост)
Еще вопрос, если создать класс и с него попытаться обратиться к какомуто объекту формы - то вообще никак 

В свойствах объектов формы (кнопок и т.п.) выставить Modifier = Public.


Модератор: Пожалуйста, один топик - один вопрос.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)