Свойство 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);
}
}
//---------------------------------------------------------------------------