singlepost

Windows Forms в MS Visual C++ 2005 << На главную или назад  

Впервые начал писать windows forms приложение и столкнулся с проблемой.
Ситуация следующая:
Имеется форма Form1. Необходимо из подпрограммы изменить параметры элемента данной формы (для простоты пусть будет некий Label1).
Для этого я внутри формы создал функцию (label1_change(string x)), принимающую в качестве аргумента x и изменяющую параметр Label1->Text на это x.
Однако при попытке вызова этой функции выдает ошибку. Пробовал разные варианты вызова (Form1->label1_change(x) или Form1::label1_change(x) и др.) но ни один не сработал.
Подскажите, пожалуйста как осуществляется вызов функций формы и изменение параметров элементов формы в целом.

17 ответов в теме “Windows Forms в MS Visual C++ 2005”

  1. 17
    Александр Ренев ответил:

    попробуй добавить Application::DoEvents() в обработчике клавы
    либо
    попробуй сделать второй тред чтоб он занимался обновлением астероидов только учти что из него нельзя менять визуальные свойства компонентов формы. это можно делать только через метод Invoke формы

  2. 16
    Михаил Аронов ответил:

    Именно. Событие по таймеру отвечает за движение астероидов. А событие по клавише – за движение корабля. Мне нужно, чтобы астероиды двигались независимо от того, движется ли корабль (нажата ли кнопка). Однако, пока клавиша нажата они стоят на месте – событие по таймеру не происходит.

  3. 15
    Александр Ренев ответил:

    не очень понятно чего ты хочешь добиться) объясни как-нить попонятнее
    судя по коду события по таймеру и по клавиатуре оперируют разными объектами.

  4. 14
    Михаил Аронов ответил:

    В процессе написания появился еще один вопрос.
    Для формы задан ивент по нажатию (удержанию) клавиши (Key_Down(System::Object^sender, System::Windows::Forms::KeyEventArgs^e);). Также в форме есть таймер (Timer_asteroids), по истечению которого должен осуществляться вызов функции (move_asteroids(System::Object^sender, System::EventArgs^e);).
    Проблема в том, что при удержании клавиши событие по таймеру не запускается до тех пор, пока клавишу не отпустишь. Как сделать, чтобы по истечении таймера событие по нажатии клавиши прерывалось и вызывалась функция по таймеру?

    Листинг:

    void Form1::move_asteroids(System::Object^sender, System::EventArgs^e) {
    this->Big_asteroid->Location = System::Drawing::Point(this->Big_asteroid->Location.X, this->Big_asteroid->Location.Y+3);
    this->Big_asteroid->Refresh();
    };

    void Form1::Key_Down(System::Object^sender, System::Windows::Forms::KeyEventArgs^e) {
    e->KeyCode
    switch (e->KeyCode)
    {
    case VK_LEFT:
    this->Starship->Location = System::Drawing::Point(this->Starship->Location.X-3, this->Starship->Location.Y);
    this->Starship->Refresh();
    break;
    case VK_RIGHT:
    this->Starship->Location = System::Drawing::Point(this->Starship->Location.X+3, this->Starship->Location.Y);
    this->Starship->Refresh();
    break;
    };

  5. 13
    Дмитрий Матвеев ответил:

    это называется "абстрагировать"

  6. 12
    Михаил Аронов ответил:

    Хмм… а вот это уже интересно. Пожалуй, так и реализую. Спасибо.

  7. 11
    Александр Ренев ответил:

    ты прав про код немаленькой программы)
    в твоем случае логично было бы чтоб read_data возвращало стринг
    тогда в своем старт клике ты бы вызвал read_data получил данные и записал их в label. проблем бы не было

  8. 10
    Михаил Аронов ответил:

    2 Александр limpalex Ренев:
    Handler на реф класс нельзя сделать глобальным.
    Пытался делать Form1 ^ аргументом read_data, но this она отказывается воспринимать.
    Собственно, в конечном итоге и пришлось вставить функцию read_data внутрь формы, однако хотелось разобраться как можно реализовать по-другому. Нельзя же весь код немаленькой программы пихать внутрь формы.
    2 Алексей Claymore Бобьяков:
    1) На C# перейду на следующем курсе. Пока же задача ставилась именно под MS VS C++.
    2) Так и пришлось сделать.
    Всем спасибо за ответы.

  9. 9
    Алексей Бобьяков ответил:

    1) Писать вместо этого на C#;
    2.1) Сделать «void read_data()» методом Form1: void Form1::read_data();
    2.2) Вставить содержимое read_data() в Start_click(…).

  10. 8
    Александр Ренев ответил:

    а что мешает тебе включить функцию read_data в класс формы?

  11. 7
    Александр Ренев ответил:

    либо сделай переменную Form1 ^rpsform глобальной
    либо сделай чтоб read_data принимала параметр типа Form1^ и передавай ей this
    либо вообще удали эту функцию и замени ее вызов ее содержимым

  12. 6
    Михаил Аронов ответил:

    Вот в этом-то и суть вопроса. Как тыкнуть ее носом в этот самый объект. Какую ссылку ей передать? Как заставить ее с ней работать?

  13. 5
    Дмитрий Матвеев ответил:

    Я конечно не дотнетовец, но последняя функция вызывает у меня большие сомнения

    Откудова ф-я read_data() знает про сущ-вание объекта класса Form1 ?

  14. 4
    Михаил Аронов ответил:

    Ну вот собственно сам код:
    Основноая программа:
    int main(array<System::String ^> ^args)
    {
    Application::EnableVisualStyles();
    Application::SetCompatibleTextRenderingDefault(false);
    Form1 ^rpsform;
    rpsform=gcnew Form1;
    Application::Run(rpsform);
    return 0;
    }

    Функции формы:
    // функция, вызываемая при нажатии кнопки на форме
    void Form1::Start_click(System::Object^sender, System::EventArgs^e)
    {
    read_data();
    };
    //Функция для изменения параметра элемента label1 формы Form1
    void Form1::label1_change(string x)
    {
    this->label1->Text = x;
    }

    Функция, считывающая данные из файла input и посылающая их форме:
    void read_data()
    {
    input >> data1;
    Form1::label1_change(data1) // собственно именно этот вызов мне нужно заставить работать.
    }

  15. 3
    Дмитрий Матвеев ответил:

    дотнееет

  16. 2
    Александр Ренев ответил:

    запости текст программы тебе сразу укажут что и где исправить.
    если ты не понял что имелось в виду выше)

  17. 1
    Алексей Федоров ответил:

    как я понимаю Form1 это класс, а функция label1_change(string x) не статичная. Вызов нестатичных функций можно осуществлять только у объектов.

Клуб программистов работает уже ой-ой-ой сколько, а если поточнее, то с 2007 года.