C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Программирование меню
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()

Вернуться в Вопросы программирования в C++Builder