AleksP |
Отправлено: 31.01.2007, 13:55 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 34
|
На форме есть меню в виде нескольких кнопок, сгруппированных в GroupBox. Меню может находится в двух состояниях, что определяется надписями на кнопках и их свойствами Enabled. Требуется создать структуру, которая имела бы логическую переменную для описания состояния меню и метод для переключения состояния меню. Как можно это сделать и в каком файле проекта (*.cpp,*.h) разместить? |
|
nawok78 |
Отправлено: 31.01.2007, 15:26 |
|
Станционный диспетчер
Группа: Участник
Сообщений: 115
|
ты что-то загоняешься?
создай переменную типа bool и все
допустим кнопки на форме Form1 (Unit1.cpp, Unit1.h)
тогда в Unit1.h
там где объявляется класс TForm1 находишь
private: // User declarations
и дописываешь
CODE |
bool State
void __fastcall SetState(bool);
|
потом в Unit1.cpp
дописываешь функцию
CODE |
void __fastcall TForm1::SetState(bool state)
{
State = state;
Button1->Caption="";
Button2->Caption="";
}
|
и т.д
|
|
AleksP |
Отправлено: 31.01.2007, 23:02 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 34
|
В Unit1.h добавил:
CODE | private: // User declarations
bool State;
void __fastcall SetState(void);
|
в Unit1.cpp:
CODE | bool State = true;
void __fastcall TForm1::SetState(void)
{
if (State)
{
Button2->Caption = "Отмена";
Button3->Enabled = false;
Button4->Enabled = false;
Button5->Enabled = false;
DBGrid1->DataSource->DataSet->Append();
State = false;
}
else
{
Button2->Caption = "Добавить";
Button3->Enabled = true;
Button4->Enabled = true;
Button5->Enabled = true;
DBGrid1->DataSource->DataSet->Cancel();
State = true;
}
}
void __fastcall TForm1::Button2Click(TObject *Sender)
{
SetState();
}
|
После запуска приложения изменение состояния меню происходит только после второго нажатия на Button2, потом изменение происходит после каждого нажатия. В чем может причина?
Отредактировано AleksP — 31.01.2007, 23:10 |
|
Grigoriy |
Отправлено: 31.01.2007, 23:16 |
|
Мастер участка
Группа: Участник
Сообщений: 381
|
После запуска приложения до нажатий на Кнопки нужно инициализировать значение State=true
Отредактировано Grigoriy — 31.01.2007, 23:17
|
|
AleksP |
Отправлено: 01.02.2007, 19:08 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 34
|
Решил сделать три состояния меню, для это в Unit1.h добавил:
CODE | private: // User declarations
int State;
void __fastcall SetState(int state);
|
в Unit1.cpp:
CODE | void __fastcall TForm1::SetState(int state)
{
switch (state){
case 0:
Button1->Enabled = false;
Button2->Caption = "Добавить";
Button3->Enabled = true;
Button4->Enabled = true;
Button5->Enabled = true;
case 1:
Button1->Enabled = false;
Button2->Caption = "Отмена";
Button3->Enabled = false;
Button4->Enabled = false;
Button5->Enabled = false;
case 2:
Button1->Enabled = true;
Button2->Caption = "Отмена";
Button3->Enabled = false;
Button4->Enabled = false;
Button5->Enabled = false;
}
State = state;
}
|
Почему при вызове функции SetState с любым параметром происходит действие, запрограммированное при state равным 2? |
|
Grigoriy |
Отправлено: 01.02.2007, 19:57 |
|
Мастер участка
Группа: Участник
Сообщений: 381
|
QUOTE (AleksP @ 01.02.2007, 19:08) |
...
Почему при вызове функции SetState с любым параметром происходит действие, запрограммированное при state равным 2? |
в Unit1.cpp:
CODE | void __fastcall TForm1::SetState(int state)
{
switch (state){
case 0:
Button1->Enabled = false;
Button2->Caption = "Добавить";
Button3->Enabled = true;
Button4->Enabled = true;
Button5->Enabled = true;
break;
case 1:
Button1->Enabled = false;
Button2->Caption = "Отмена";
Button3->Enabled = false;
Button4->Enabled = false;
Button5->Enabled = false;
break;
case 2:
Button1->Enabled = true;
Button2->Caption = "Отмена";
Button3->Enabled = false;
Button4->Enabled = false;
Button5->Enabled = false;
break;
}
State = state;
}
|
после выполнения каждой последовательности операторов блоков при case необходимо вызвать оператор break; — покинуть составной оператор switch
Отредактировано Grigoriy — 01.02.2007, 19:59
|
|
AleksP |
Отправлено: 02.02.2007, 13:25 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 34
|
Итоговый код изменения состояния меню оказался следующим:
CODE | void __fastcall TForm1::SetState(int state)
{
switch (state){
case 0:
Button1->Enabled = false;
Button2->Caption = "Добавить";
Button3->Enabled = true;
Button4->Enabled = true;
Button5->Enabled = true;
break;
case 1:
Button1->Enabled = false;
Button2->Caption = "Отмена";
Button3->Enabled = false;
Button4->Enabled = false;
Button5->Enabled = false;
break;
case 2:
Button1->Enabled = true;
Button2->Caption = "Отмена";
Button3->Enabled = false;
Button4->Enabled = false;
Button5->Enabled = false;
break;
}
StatePrev = StateCurr;
StateCurr = state;
} |
в переменной StateCurr хранится текущее состояние меню, в StatePrev предыдущее состояние меню. Значения StatePrev и StateCurr при запуске приложения равны 0.
CODE | void __fastcall TForm1::Button1Click(TObject *Sender)
{
AnsiString str[] = {"изменить", "добавить"};
AnsiString Warning = "Вы действительно хотите " + str[StatePrev] + " информацию об этом договоре?";
if (MessageBox(0, Warning.c_str() , "Подтверждение", MB_YESNO) == IDYES) DBGrid1->DataSource->DataSet->Post();
else DBGrid1->DataSource->DataSet->Cancel();
SetState(0);
} |
При обработке нажатия на кнопку Button1 значения массива str не всегда подставляются в строку Warning. В чем может быть причина и как ее можно устранить? |
|
Grigoriy |
Отправлено: 02.02.2007, 16:49 |
|
Мастер участка
Группа: Участник
Сообщений: 381
|
Я тут может чего-то не могу учесть, хотя значения переменной StatePrev может быть 2, а индексы массива строк могут быть только 0 или 1.
|
|
nawok78 |
Отправлено: 02.02.2007, 17:06 |
|
Станционный диспетчер
Группа: Участник
Сообщений: 115
|
так у тебя ск-ко должно быть состояний — 2 или 3 ?
тут тебе правильно заметили
QUOTE |
Я тут может чего-то не могу учесть, хотя значения переменной StatePrev может быть 2, а индексы массива строк могут быть только 0 или 1. |
Button1->Caption — какое — может понятней станет нах тебе 3 состояния.
еще — нужные значения переменных и состояние кнопок можно проинициировать в событии OnCreate или в конструкторе.
дальше — если твоя форма создается автоматически — то эти события вызовутся один раз при запуске программы. тогда инициализацию лучше повесить на OnShow — событие когда ты делаешь форме Show() или ShowModal() |
|