C++Builder
  Начало   Форум   Помощь Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: Как сделать форму с опциями  (Прочитано 4535 раз)
Fry__
Участник


Сказали спасибо: +0/-0
Offline

Сообщений: 20


Как сделать форму с опциями
« : 10 Май 2010, 13:33:28 »

Всем здравствуйте.
Мне надо создать форму с настройками программы. Опций много получилось. Вот как я хочу: слева - TreeView, а справа - всякие компоненты. Если выбирать в TreeView запись - меняются компоненты справа. Как по клику на TreeView определить запись я примерно знаю. Подскажите как быть с компонентами? Как это делается? У меня мало опыта.
Спасибо... 
Записан
Zor
Глобальный модератор


Сказали спасибо: +158/-30
Offline

Сообщений: 2946


Re: Как сделать форму с опциями
« Ответ #1 : 10 Май 2010, 14:40:11 »

положи несколько панелек, и делай видимой одну нужную.
а вообще пора этот пример в фак положить
Записан
Fry__
Участник


Сказали спасибо: +0/-0
Offline

Сообщений: 20


Re: Как сделать форму с опциями
« Ответ #2 : 10 Май 2010, 14:58:37 »

О, точно... панели. Большое спасибо.
Записан
Eagle
Я бы улучшил этот мир... Но Бог не дал исходников
Участник


Сказали спасибо: +0/-2
Offline

Сообщений: 42


Re: Как сделать форму с опциями
« Ответ #3 : 10 Май 2010, 19:25:19 »

Цитата: Fry__ от 10 Май 2010, 13:33:28
Всем здравствуйте.
Мне надо создать форму с настройками программы. Опций много получилось. Вот как я хочу: слева - TreeView, а справа - всякие компоненты. Если выбирать в TreeView запись - меняются компоненты справа. Как по клику на TreeView определить запись я примерно знаю. Подскажите как быть с компонентами? Как это делается? У меня мало опыта.
Спасибо... 

Я делаю тоже самое!!!
TreeView поставил слева. Справа GroupBox

У меня вопрос как принудительно выделить ветку дерева TreeView
Тоеть прописать в OnShow что бы фокус был у определённой ветви
Записан
Eagle
Я бы улучшил этот мир... Но Бог не дал исходников
Участник


Сказали спасибо: +0/-2
Offline

Сообщений: 42


Re: Как сделать форму с опциями
« Ответ #4 : 10 Май 2010, 19:27:04 »

Цитата: Zor от 10 Май 2010, 14:40:11
положи несколько панелек, и делай видимой одну нужную.
а вообще пора этот пример в фак положить

Я готов Сделать рабочий пример для FAQ.

только помогите с нюансами типа того что выше.
Записан
Eagle
Я бы улучшил этот мир... Но Бог не дал исходников
Участник


Сказали спасибо: +0/-2
Offline

Сообщений: 42


Re: Как сделать форму с опциями
« Ответ #5 : 10 Май 2010, 19:48:38 »

Ещё вопрос.
Есть Главная Форма и Форма Настроек

Нужно
1) Вызвать форму настроек
2) Показать Именно то что потребовал пользователь.

Код:
void __fastcall TForm1::mm_PenaltyClick(TObject *Sender)
{
FSetting->Show();  // вот вызов формы настроек.
FSetting->SettingPenaltyShow(); 
}
FSetting->SettingPenaltyShow(); // а здесь ошибка
 Как Правильно вызвать функцию которая описана в settingU.cpp формы FSetting

Код *.cpp формы настроек
Код:
//---------------------------------------------------------------------------

#include
#pragma hdrstop

#include "settingU.h"
#include "dataU.h"

//--------------------------------прототипы----------------------------------
void SettingGeneralShow();
void SettingPenaltyShow();
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TFSetting *FSetting;
//---------------------------------------------------------------------------
__fastcall TFSetting::TFSetting(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
//-----------------------Функции интерфейса--------------------------------

//---------------------------------------------------------------------------
void SettingGeneralShow()
{
   FSetting->PanelPenalty->Visible=false;
   FSetting->PanelPenalty->Enabled=false;
   FSetting->PanelGeneral->Align=alClient;
   FSetting->PanelGeneral->Enabled=true;
   FSetting->PanelGeneral->Visible=true;
}
//---------------------------------------------------------------------------
void SettingPenaltyShow()
{
   FSetting->PanelGeneral->Enabled=false;
   FSetting->PanelGeneral->Visible=false;
   FSetting->PanelPenalty->Align=alClient;
   FSetting->PanelPenalty->Visible=true;
   FSetting->PanelPenalty->Enabled=true;
}
//---------------------------------------------------------------------------

а это код главное формы
Код:
//---------------------------------------------------------------------------

#include
#pragma hdrstop

#include "rUnit.h"
#include "ABOUT.h"
#include "dataU.h"
#include "settingU.h"

//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------


void __fastcall TForm1::rmh_helpClick(TObject *Sender)
{
fr_help->Execute();
}
//---------------------------------------------------------------------------

void __fastcall TForm1::rmh_aboutClick(TObject *Sender)
{
AboutBox->ShowModal();
}
//---------------------------------------------------------------------------


void __fastcall TForm1::FormShow(TObject *Sender)
{
Form1->Left=(Screen->Width/2)-(Form1->Width/2);
Form1->Top=(Screen->Height/2)-(Form1->Height/2);
}
//---------------------------------------------------------------------------

void __fastcall TForm1::mm_PenaltyClick(TObject *Sender)
{
FSetting->Show();
FSetting->SettingPenaltyShow();
}
//---------------------------------------------------------------------------

void __fastcall TForm1::mm_GeneralClick(TObject *Sender)
{
FSetting->Show();
FSetting->SettingGeneralShow();
}
//---------------------------------------------------------------------------
Записан
Eagle
Я бы улучшил этот мир... Но Бог не дал исходников
Участник


Сказали спасибо: +0/-2
Offline

Сообщений: 42


Re: Как сделать форму с опциями
« Ответ #6 : 10 Май 2010, 20:02:08 »

Во вложении скриншот моего проекта хотелось что бы по клину на меню "ШТРАФЫ" открывалось окно настроек с панелью настройки штрафов. Основные соответственно.
Код этих окон приведён выше.
Записан
Eagle
Я бы улучшил этот мир... Но Бог не дал исходников
Участник


Сказали спасибо: +0/-2
Offline

Сообщений: 42


Re: Как сделать форму с опциями
« Ответ #7 : 10 Май 2010, 21:00:28 »

Цитата: Zor от 10 Май 2010, 14:40:11
положи несколько панелек, и делай видимой одну нужную.
а вообще пора этот пример в фак положить

Я например кинул GroupBox

Свойство Aling ставлю в alClient
Вот функция смены панельки настроек
Код:
void SettingGeneralShow()
{
   FSetting->PanelPenalty->Visible=false;
   FSetting->PanelPenalty->Enabled=false;
   FSetting->PanelGeneral->Align=alClient;
   FSetting->PanelGeneral->Enabled=true;
   FSetting->PanelGeneral->Visible=true;
}
Записан
Fry__
Участник


Сказали спасибо: +0/-0
Offline

Сообщений: 20


Re: Как сделать форму с опциями
« Ответ #8 : 10 Май 2010, 21:31:58 »

Я с этим тоже ковыряюсь, но не так успешно - постоянно отвлекают. Единственно могу сказать, что прототипы функций кажется надо в хедере описывать (*.h). Это по поводу вызова FSetting->SettingPenaltyShow(); И с таким вызовом ее надо описывать в теле класса FSetting. Но может я и не прав.
В остальном пока у меня глухо, вопросы примерно те же...
Записан
Eagle
Я бы улучшил этот мир... Но Бог не дал исходников
Участник


Сказали спасибо: +0/-2
Offline

Сообщений: 42


Re: Как сделать форму с опциями
« Ответ #9 : 10 Май 2010, 21:57:08 »

Цитата: Fry__ от 10 Май 2010, 21:31:58
Я с этим тоже ковыряюсь, но не так успешно - постоянно отвлекают. Единственно могу сказать, что прототипы функций кажется надо в хедере описывать (*.h). Это по поводу вызова FSetting->SettingPenaltyShow(); И с таким вызовом ее надо описывать в теле класса FSetting. Но может я и не прав.
В остальном пока у меня глухо, вопросы примерно те же...

СПАСИБИЩЕ!!!

Я разобрался как вызвать функцию с другой формы.
Значит так...
Есть 2 формы.
1 Главная
2 Настройки

На главной МаинМеню в котором прописан Show для формы настроек.

Мой вопрос был в том как открыть нужный мне блок настроек
Содержание меню..
Настройки >
  • Общие
открываем вкладку общие в окне настроек
  • Штрафы
открываем вкладку штрыфы в окне настроек
[/list]


Fry__ меня толкнул на следующую мысль

Я прописал нужные мне функции, как функции класса моей формы (чесно методом ВЕЛИКОГО НАУЧНОГО ТЫКА) 

Unit главной формы
Код:
//---------------------------------------------------------------------------

#include
#pragma hdrstop

#include "rUnit.h"
#include "ABOUT.h"
#include "dataU.h"
#include "settingU.h"

//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------


void __fastcall TForm1::rmh_helpClick(TObject *Sender)
{
fr_help->Execute();
}
//---------------------------------------------------------------------------

void __fastcall TForm1::rmh_aboutClick(TObject *Sender)
{
AboutBox->ShowModal();
}
//---------------------------------------------------------------------------


void __fastcall TForm1::FormShow(TObject *Sender)
{
Form1->Left=(Screen->Width/2)-(Form1->Width/2);
Form1->Top=(Screen->Height/2)-(Form1->Height/2);
}
//---------------------------------------------------------------------------

void __fastcall TForm1::mm_PenaltyClick(TObject *Sender)
{
FSetting->Show();
FSetting->SettingPenaltyShow();
}
//---------------------------------------------------------------------------

void __fastcall TForm1::mm_GeneralClick(TObject *Sender)
{
FSetting->Show();
FSetting->SettingGeneralShow();
}
//---------------------------------------------------------------------------


Header формы настроек
Код:
//---------------------------------------------------------------------------

#ifndef settingUH
#define settingUH
//---------------------------------------------------------------------------
#include
#include
#include
#include
#include
#include
#include
#include
//---------------------------------------------------------------------------
class TFSetting : public TForm
{
__published: // IDE-managed Components
TTreeView *SettingTree;
TGroupBox *PanelPenalty;
TGroupBox *GroupBox1;
TGroupBox *Penalty_List;
TDBGrid *DBGrid1;
TButton *But_pen_add;
TButton *But_pen_edit;
TButton *But_pen_del;
TLabel *Label1;
TGroupBox *PanelGeneral;
void __fastcall SettingTreeClick(TObject *Sender);
void __fastcall FormShow(TObject *Sender);
void __fastcall SettingGeneralShow();
void __fastcall SettingPenaltyShow();


private: // User declarations

public: // User declarations
   // void __fastcall SettingGeneralShow();
  // void __fastcall SettingPenaltyShow();

__fastcall TFSetting(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TFSetting *FSetting;
//---------------------------------------------------------------------------
#endif

И наконец cpp формы настроек
Код:
//---------------------------------------------------------------------------

#include
#pragma hdrstop

#include "settingU.h"
#include "dataU.h"

//---------------------------------------------------------------------------
//void SettingGeneralShow();
//void SettingPenaltyShow();
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TFSetting *FSetting;
//---------------------------------------------------------------------------
__fastcall TFSetting::TFSetting(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
//-----------------------Функции интерфейса--------------------------------

//---------------------------------------------------------------------------
void __fastcall TFSetting::SettingGeneralShow()
{
   FSetting->PanelPenalty->Visible=false;
   FSetting->PanelPenalty->Enabled=false;
   FSetting->PanelGeneral->Align=alClient;
   FSetting->PanelGeneral->Enabled=true;
   FSetting->PanelGeneral->Visible=true;
}
//---------------------------------------------------------------------------
void __fastcall TFSetting::SettingPenaltyShow()
{
   FSetting->PanelGeneral->Enabled=false;
   FSetting->PanelGeneral->Visible=false;
   FSetting->PanelPenalty->Align=alClient;
   FSetting->PanelPenalty->Visible=true;
   FSetting->PanelPenalty->Enabled=true;
}
//---------------------------------------------------------------------------

void __fastcall TFSetting::SettingTreeClick(TObject *Sender)
{
switch (SettingTree->Selected->Index)
{
case 0:SettingGeneralShow(); break;
case 1:SettingPenaltyShow(); break;
default: ShowMessage("ошибочка");
}
}

//---------------------------------------------------------------------------

//---------------------------------------------------------------------------

//---------------------------------------------------------------------------

//---------------------------------------------------------------------------



void __fastcall TFSetting::FormShow(TObject *Sender)
{
Left=(Screen->Width/2)-(Width/2);
Top=(Screen->Height/2)-(Height/2);
// SettingGeneralShow();
  // SettingTree->Selected->

}
//---------------------------------------------------------------------------

Обратите внимание на
  • Вызов из меню на главной будет выглядеть так:
void __fastcall TForm1::mm_PenaltyClick(TObject *Sender)
{
FSetting->Show();
FSetting->SettingPenaltyShow();
}
//---------------------------------------------------------------------------

void __fastcall TForm1::mm_GeneralClick(TObject *Sender)
{
FSetting->Show();
FSetting->SettingGeneralShow();
}
//---------------------------------------------------------------------------

  • В хедаре настрое добавлены следующие протатипы
   void __fastcall SettingGeneralShow();
   void __fastcall SettingPenaltyShow();

  • И описание Функций теперь будет выглядеть так
void __fastcall TFSetting::SettingGeneralShow()
{
   FSetting->PanelPenalty->Visible=false;
   FSetting->PanelPenalty->Enabled=false;
   FSetting->PanelGeneral->Align=alClient;
   FSetting->PanelGeneral->Enabled=true;
   FSetting->PanelGeneral->Visible=true;
}
//---------------------------------------------------------------------------
void __fastcall TFSetting::SettingPenaltyShow()
{
   FSetting->PanelGeneral->Enabled=false;
   FSetting->PanelGeneral->Visible=false;
   FSetting->PanelPenalty->Align=alClient;
   FSetting->PanelPenalty->Visible=true;
   FSetting->PanelPenalty->Enabled=true;
}
//---------------------------------------------------------------------------

[/list]

Вот что я добавил __fastcall TFSetting::
Записан
Eagle
Я бы улучшил этот мир... Но Бог не дал исходников
Участник


Сказали спасибо: +0/-2
Offline

Сообщений: 42


Re: Как сделать форму с опциями
« Ответ #10 : 10 Май 2010, 22:02:40 »

Остался один вопрос.
Как теперь принудительно передать фокус нужной ветви дерева.

Смотрите скриншот выше.
Интересует Fsetting (там стрелочка нарисована) 

Записан
Fry__
Участник


Сказали спасибо: +0/-0
Offline

Сообщений: 20


Re: Как сделать форму с опциями
« Ответ #11 : 10 Май 2010, 23:10:13 »

  TreeView_Options->Selected = TreeView_Options->Items->Item[NODE]; // NODE - узел
Записан
Eagle
Я бы улучшил этот мир... Но Бог не дал исходников
Участник


Сказали спасибо: +0/-2
Offline

Сообщений: 42


Re: Как сделать форму с опциями
« Ответ #12 : 10 Май 2010, 23:11:27 »

Цитата: Fry__ от 10 Май 2010, 23:10:13
  TreeView_Options->Selected = TreeView_Options->Items->Item[NODE]; // NODE - узел


А можно прокомментировать!!!
Ладно я и сам методом тем что и раньше.
NODE ставим цифру-номер нода
вот так:
Код:
void __fastcall TForm1::mm_GeneralClick(TObject *Sender)
{
FSetting->Show();
FSetting->SettingGeneralShow();
FSetting->SettingTree->Selected=FSetting->SettingTree->Items->Item[0];
}
//---------------------------------------------------------------------------
Записан
Lexa F.
Участник


Сказали спасибо: +23/-3
Offline

Сообщений: 455


Re: Как сделать форму с опциями
« Ответ #13 : 11 Май 2010, 00:27:46 »

Цитата: Eagle от 10 Май 2010, 19:48:38
Нужно
1) Вызвать форму настроек
2) Показать Именно то что потребовал пользователь.
лично я делаю так:

ToptionForm.h
Код
...
public:
       ...
       void __fastcall ShowOptionForm(const AnsiString capt,const int NP);
 

ToptionForm.cpp
Код
...
void __fastcall ToptionForm::ShowOptionForm(const AnsiString capt,const int NP)
{
  optionForm->Caption = capt; //меняем заголовок на нужный
  PageControl1->ActivePageIndex = NP;  //активируем нужную вкладку, на которой расположены настройки
  optionForm->ShowModal(); // отображаем форму
}
 

вызываю из главной формы так:
Код
optionForm->ShowOptionForm("Настройка графиков", 1);
Записан
Eagle
Я бы улучшил этот мир... Но Бог не дал исходников
Участник


Сказали спасибо: +0/-2
Offline

Сообщений: 42


Re: Как сделать форму с опциями
« Ответ #14 : 11 Май 2010, 00:44:47 »

Цитата: Lexa F. от 11 Май 2010, 00:27:46
Цитата: Eagle от 10 Май 2010, 19:48:38
Нужно
1) Вызвать форму настроек
2) Показать Именно то что потребовал пользователь.
лично я делаю так:

ToptionForm.h
Код
...
public:
       ...
       void __fastcall ShowOptionForm(const AnsiString capt,const int NP);
 

ToptionForm.cpp
Код
...
void __fastcall ToptionForm::ShowOptionForm(const AnsiString capt,const int NP)
{
  optionForm->Caption = capt; //меняем заголовок на нужный
  PageControl1->ActivePageIndex = NP;  //активируем нужную вкладку, на которой расположены настройки
  optionForm->ShowModal(); // отображаем форму
}
 

вызываю из главной формы так:
Код
optionForm->ShowOptionForm("Настройка графиков", 1);

Спасибо!
Здесь мы используем TreeView и панели справа как на скрине выше.
Это практично при большом количестве настроек,  и групп настроек(как например в программе TheBat)
Записан
Fry__
Участник


Сказали спасибо: +0/-0
Offline

Сообщений: 20


Re: Как сделать форму с опциями
« Ответ #15 : 11 Май 2010, 16:38:13 »

Спасибо всем. Я сделал что хотел.
В TreeView я обрабатывал сообщение OnChange.
У меня много панелек получилось, поэтому что бы не делать громоздкой конструкцию их переключения пришлось сделать массив указателей на класс TPanel.
Код:
TPanel **pPanel=new TPanel*[12];
При создании формы опций инициализировать его.
Код:
  pPanel[0]=Panel_General;  // в правой части собственно мои панельки
  pPanel[1]=Panel_Chanel; 
  pPanel[2]=Panel_Chanel_X;
  ...
  pPanel[5]=Panel_Skins;
  pPanel[11]=Panel_Driver;
Обработчик OnChange:
Код:
void __fastcall TForm_options::TreeView_OptionsChange(TObject *Sender,
      TTreeNode *Node)  //после изменения
{
 // индексы записей TreeView должны соответствовать индексу массива конечно
  pPanel[PrevIndex]->Hide(); // гасим предыдущую панель
  PrevIndex=Node->SelectedIndex; // обновляем PrevIndex
  pPanel[PrevIndex]->Show();  // показываем выбранную панель
}
где PrevIndex - предыдущий узел TreeView, его лучше объявить в классе TForm_options как int.

PS: еще раз спасибо Zor за подсказку.


Записан
Eagle
Я бы улучшил этот мир... Но Бог не дал исходников
Участник


Сказали спасибо: +0/-2
Offline

Сообщений: 42


Re: Как сделать форму с опциями
« Ответ #16 : 11 Май 2010, 18:09:53 »

Fry__, А можно исходник положить в тему. Хотелось бы поковыряться с массивом который вы создали(понравилась идея)
Буду очень признателен 
Записан
Fry__
Участник


Сказали спасибо: +0/-0
Offline

Сообщений: 20


Re: Как сделать форму с опциями
« Ответ #17 : 11 Май 2010, 20:22:22 »

Можно конечно, только мой проект огромен. Вот тренировочный проект для BCB6. Но там собственно только то, что я написал выше. Причем меня интересовала только реализация, поэтому я динамически формы не создавал и после ничего не удалял...   
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  




....

Powered by SMF 1.1.21 | SMF © 2025, Simple Machines
Страница сгенерирована за 0.117 секунд. Запросов: 21.