Впервые начал писать windows forms приложение и столкнулся с проблемой.
Ситуация следующая:
Имеется форма Form1. Необходимо из подпрограммы изменить параметры элемента данной формы (для простоты пусть будет некий Label1).
Для этого я внутри формы создал функцию (label1_change(string x)), принимающую в качестве аргумента x и изменяющую параметр Label1->Text на это x.
Однако при попытке вызова этой функции выдает ошибку. Пробовал разные варианты вызова (Form1->label1_change(x) или Form1::label1_change(x) и др.) но ни один не сработал.
Подскажите, пожалуйста как осуществляется вызов функций формы и изменение параметров элементов формы в целом.
12 июня 2008 в 21:02
попробуй добавить Application::DoEvents() в обработчике клавы
либо
попробуй сделать второй тред чтоб он занимался обновлением астероидов только учти что из него нельзя менять визуальные свойства компонентов формы. это можно делать только через метод Invoke формы
12 июня 2008 в 20:00
Именно. Событие по таймеру отвечает за движение астероидов. А событие по клавише – за движение корабля. Мне нужно, чтобы астероиды двигались независимо от того, движется ли корабль (нажата ли кнопка). Однако, пока клавиша нажата они стоят на месте – событие по таймеру не происходит.
12 июня 2008 в 17:05
не очень понятно чего ты хочешь добиться) объясни как-нить попонятнее
судя по коду события по таймеру и по клавиатуре оперируют разными объектами.
12 июня 2008 в 16:03
В процессе написания появился еще один вопрос.
Для формы задан ивент по нажатию (удержанию) клавиши (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;
};
4 июня 2008 в 17:03
это называется "абстрагировать"
4 июня 2008 в 16:04
Хмм… а вот это уже интересно. Пожалуй, так и реализую. Спасибо.
4 июня 2008 в 13:01
ты прав про код немаленькой программы)
в твоем случае логично было бы чтоб read_data возвращало стринг
тогда в своем старт клике ты бы вызвал read_data получил данные и записал их в label. проблем бы не было
4 июня 2008 в 10:04
2 Александр limpalex Ренев:
Handler на реф класс нельзя сделать глобальным.
Пытался делать Form1 ^ аргументом read_data, но this она отказывается воспринимать.
Собственно, в конечном итоге и пришлось вставить функцию read_data внутрь формы, однако хотелось разобраться как можно реализовать по-другому. Нельзя же весь код немаленькой программы пихать внутрь формы.
2 Алексей Claymore Бобьяков:
1) На C# перейду на следующем курсе. Пока же задача ставилась именно под MS VS C++.
2) Так и пришлось сделать.
Всем спасибо за ответы.
4 июня 2008 в 10:02
1) Писать вместо этого на C#;
2.1) Сделать «void read_data()» методом Form1: void Form1::read_data();
2.2) Вставить содержимое read_data() в Start_click(…).
4 июня 2008 в 1:02
а что мешает тебе включить функцию read_data в класс формы?
4 июня 2008 в 1:02
либо сделай переменную Form1 ^rpsform глобальной
либо сделай чтоб read_data принимала параметр типа Form1^ и передавай ей this
либо вообще удали эту функцию и замени ее вызов ее содержимым
4 июня 2008 в 1:01
Вот в этом-то и суть вопроса. Как тыкнуть ее носом в этот самый объект. Какую ссылку ей передать? Как заставить ее с ней работать?
4 июня 2008 в 0:00
Я конечно не дотнетовец, но последняя функция вызывает у меня большие сомнения
Откудова ф-я read_data() знает про сущ-вание объекта класса Form1 ?
3 июня 2008 в 21:05
Ну вот собственно сам код:
Основноая программа:
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) // собственно именно этот вызов мне нужно заставить работать.
}
3 июня 2008 в 19:01
дотнееет
3 июня 2008 в 19:00
запости текст программы тебе сразу укажут что и где исправить.
если ты не понял что имелось в виду выше)
3 июня 2008 в 17:05
как я понимаю Form1 это класс, а функция label1_change(string x) не статичная. Вызов нестатичных функций можно осуществлять только у объектов.