C++Builder
  Начало   Форум   Помощь Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: Динамическая расстановка ToolBar'ов на CoolBar'е  (Прочитано 2476 раз)
accumulator
Участник


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

Сообщений: 11


Динамическая расстановка ToolBar'ов на CoolBar'е
« : 24 Октябрь 2013, 18:16:31 »

Добрый день!

Условие.
Имеем форму, на ней есть CoolBar. CoolBar содержит несколько ToolBar'ов. Пользователь может менять положение ToolBar'ов.

Задача.
Перед закрытием формы сохранять положение ToolBar'ов. А при открытии формы восстанавливать положение ToolBar'ов, сохраненное при закрытии формы.

Сделано.
В реестр (при закрытии) сохраняются свойства Left и Top каждого ToolBar'а. При открытии формы сохраненные значения Left и Top берутся из реестра и устанавливаются каждого ToolBar'а. Ниже функция взятия настроек из реестра.
Код
void PersCoolBarRest(TCoolBar* CoolBar, AnsiString RegKey)
{
RegKey=RootRegKey+RegKey;
 
for (int i=0; i CoolBar->Bands->Count; i++)
{
TRegistry *MyReg = OpenKey4Read (RegKey+"\\"+CoolBar->Bands->Items[i]->Control->Name);
if(!MyReg)
continue;
 
try {
CoolBar->Bands->Items[i]->Control->Left = MyReg->ReadInteger("Left");
CoolBar->Bands->Items[i]->Control->Top = MyReg->ReadInteger("Top");
}
catch(Exception &e) {
 
}
 
CloseRegKey (MyReg);
}
 
 
}

Результат.
В результате после открытия формы ToolBar'ы находятся на тех же местах, которые были определены им в Design-режиме.

Вопросы.
Возможно, свойств Left и Top не достаточно?
Или необходимы еще какие-то действия с CoolBar'ом или ToolBar'ами при восстановлении настроек?
Или необходимо определить какое-то свойство/свойства CoolBar'а или ToolBar'а чтобы установка свойств Left и Top влияла на положение ToolBar'а?



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


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

Сообщений: 11


Re: Динамическая расстановка ToolBar'ов на CoolBar'е
« Ответ #1 : 28 Октябрь 2013, 14:07:06 »

После консультаций с коллегой и экспериментов выяснил следующее.
1. Следует сохранять такие параметры для последующего восстановления:
- Left Control'а, привязанного к Band'у;
- Width Control'а, привязанного к Band'у;
- Width самого Band'а;
- Break самого Band'а.

2. При сохранении Band'ы следует перебирать в нормальном порядке, а при восстановлении - в обратном.

3. Для корректного восстановления свойство FixedOrder CoolBar'а должно иметь значение true.

Ниже функции сохранения и восстановления CoolBar'а.
Код
//---------------------------------------------------------------------------
void PersCoolBarSave(TCoolBar* CoolBar, AnsiString RegKey)
{
RegKey=RootRegKey+RegKey;
 
for (int i=0; i CoolBar->Bands->Count-1; i++)
{
TRegistry *MyReg = OpenKey4Write (RegKey+"\\"+CoolBar->Bands->Items[i]->Control->Name);
if(!MyReg)
continue;
 
MyReg->WriteInteger("Left",       CoolBar->Bands->Items[i]->Control->Left);
MyReg->WriteInteger("Width",      CoolBar->Bands->Items[i]->Control->Width);
MyReg->WriteInteger("WidthBand",  CoolBar->Bands->Items[i]->Width);
MyReg->WriteBool   ("BreakBand",  CoolBar->Bands->Items[i]->Break);
 
CloseRegKey (MyReg);
}
}
//---------------------------------------------------------------------------
void PersCoolBarRest(TCoolBar* CoolBar, AnsiString RegKey)
{
RegKey=RootRegKey+RegKey;
 
for (int i=CoolBar->Bands->Count-1; i >= 0; i--)
{
TRegistry *MyReg = OpenKey4Read (RegKey+"\\"+CoolBar->Bands->Items[i]->Control->Name);
if(!MyReg)
continue;
 
try {
 
CoolBar->Bands->Items[i]->Control->Left  = MyReg->ReadInteger("Left");
CoolBar->Bands->Items[i]->Control->Width = MyReg->ReadInteger("Width");
CoolBar->Bands->Items[i]->Width          = MyReg->ReadInteger("WidthBand");
CoolBar->Bands->Items[i]->Break          = MyReg->ReadBool("BreakBand");
}
catch(Exception &e) {
 
}
 
CloseRegKey (MyReg);
}
}
Записан
accumulator
Участник


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

Сообщений: 11


Re: Динамическая расстановка ToolBar'ов на CoolBar'е
« Ответ #2 : 29 Октябрь 2013, 12:30:39 »

Свойство CoolBar'а FixedOrder, установленное в true, не дает пользователю менять порядок расстановки ToolBar'ов. Что не совсем вписывается в постановку задачи.
И после еще одного дня экпериментов пришел к следующему (работу теперь строим, отталкиваясь от Band'ов CoolBar'а).

1. Ветка реестра для настроек каждого окна в том числе имеет раздел "CoolBar", а тот, в свою очередь, имеет столько подуровней, сколько Band'ов имеется в CoolBar'е. Имя для этих подуровней выберем "Band_"+. Скриншот реестра во вложении.

2. Каждый подуровень Band_i должен содержать такие настройки:
- NameControl - свойство Name прикрепленного к Band'у Control'а;
- VisibleBand - свойство Visible самого Band'а;
- BreakBand - свойство Break самого Band'а;
- Left - свойство Left прикрепленного к Band'у Control'а;
- Width - свойство Width прикрепленного к Band'у Control'а;
- WidthBand - свойство Width самого Band'а.

3. При сохранении и при восстановлении настроек CoolBar'а перебираем Band'ы в нормальном порядке (от 0 до Count-1).

4. При восстановлении настроек следует перепривязывать ToolBar'ы к Band'ам. Для этого необходимо искать в CoolBar'е Control с именем, сохраненным в настройке реестра NameControl.

5. При восстановлении настроек свойства Band'а и ToolBar'а следует задавать в таком порядке:
Band.Control, Band.Visible, Band.Break, Band.Control.Left, Band.Control.Width, Band.Width.

Ниже примеры функций сохранения и восстановления.

Код
//---------------------------------------------------------------------------
void PersCoolBarSave(TCoolBar* CoolBar, AnsiString RegKey)
{
 
RegKey=RootRegKey+RegKey;
 
for (int i=0; i CoolBar->Bands->Count; i++)
{
TRegistry *MyReg = OpenKey4Write (RegKey+"\\Band_"+i);
if(!MyReg)
continue;
 
MyReg->WriteString ("NameControl",CoolBar->Bands->Items[i]->Control->Name);
MyReg->WriteBool   ("VisibleBand",CoolBar->Bands->Items[i]->Visible);
MyReg->WriteBool   ("BreakBand",  CoolBar->Bands->Items[i]->Break);
MyReg->WriteInteger("Left",       CoolBar->Bands->Items[i]->Control->Left);
MyReg->WriteInteger("Width",      CoolBar->Bands->Items[i]->Control->Width);
MyReg->WriteInteger("WidthBand",  CoolBar->Bands->Items[i]->Width);
 
CloseRegKey (MyReg);
}
}
//---------------------------------------------------------------------------
void PersCoolBarRest(TCoolBar* CoolBar, AnsiString RegKey)
{
RegKey=RootRegKey+RegKey;
 
for (int i=0; i CoolBar->Bands->Count; i++)
{
TRegistry *MyReg = OpenKey4Read (RegKey+"\\Band_"+i);
 
if(!MyReg)
continue;
 
try {
TWinControl* pWinControl = (TWinControl*)(CoolBar->FindChildControl(MyReg->ReadString("NameControl")));
if(pWinControl)
{
CoolBar->Bands->Items[i]->Control        = pWinControl;
CoolBar->Bands->Items[i]->Visible        = MyReg->ReadBool("VisibleBand");
CoolBar->Bands->Items[i]->Break          = MyReg->ReadBool("BreakBand");
CoolBar->Bands->Items[i]->Control->Left  = MyReg->ReadInteger("Left");
CoolBar->Bands->Items[i]->Control->Width = MyReg->ReadInteger("Width");
CoolBar->Bands->Items[i]->Width          = MyReg->ReadInteger("WidthBand");
}
 
}
catch(Exception &e) {
}
CloseRegKey (MyReg);
}
}
//---------------------------------------------------------------------------



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


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

Сообщений: 11


« Ответ #3 : 29 Октябрь 2013, 13:32:46 »

Что скажете, господа и дамы? Есть ли замечания?
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  




....

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