Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
3 / 2 / 1
Регистрация: 15.04.2019
Сообщений: 33

Сохранение состояния элементов управления на форме

21.01.2020, 21:27. Показов 1784. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый вечер!

В программе, форма является владельцем визуальных компонентов. Используя этот факт, пишу код для сохранения состояния визуальных компонентов:

C++
1
2
3
4
   TFileStream* FS = new TFileStream(File, fmCreate);
   for(int i=0;i<CompositeBeamMainForm->ComponentCount;++i)
        FS->WriteComponent(CompositeBeamMainForm->Components[i]);
   delete(FS);
и загрузки:

C++
1
2
3
4
     TFileStream* FS = new TFileStream(FileDir_Name, fmOpenRead);
     for(int i=0;i<CompositeBeamMainForm->ComponentCount;++i)
      FS->ReadComponent(CompositeBeamMainForm->Components[i]);
    delete(FS);
При сохранении, бинарный файл успешно создаётся. А при попытки его открыть, получаю предупреждения: "Class TToolButton not found" и "Class TTabSheet not found".

На одном из англоязычных форумах, говорят, что эти предупреждения являются следствием отсутствия регистрации классов TToolButton и TTabSheet в поточной системе VCL.

После регистрации этих классов.

C++
1
2
     TComponentClass classes[2] = {__classid(TToolButton),__classid(TTabSheet)};
     RegisterClasses(classes, 1);
Предупреждения выше пропали.

Но появилось новое при повторном открытии файла "A component named ToolButton1 already exists".

Что может являться причиной этого предупреждения? Как от него избавиться?

Какие есть идиомы сохранения состояния элементов формы VCL в С++ Builder?
Миниатюры
Сохранение состояния элементов управления на форме  
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
21.01.2020, 21:27
Ответы с готовыми решениями:

Сохранение состояния элементов...
Приветствую, друзья! Есть одна функция, каторую я незнаю как осуществить так как это принято в мире Qt, суть функции состоит в...

Сохранение и загрузка элементов управления
Всем привет. Народ, посоветуйте, пожалуйста, лучший(на ваш взгляд) вариант сохранения и загрузки контролов на странице. Добавлено...

Как лучше реализовать сохранение с 10-20 элементов управления
У меня в программе производиться настройка а потом создаётся конфиг (теория) Но у меня 10-20 элементов управления Как мне лучше...

6
10 / 6 / 6
Регистрация: 26.06.2017
Сообщений: 206
26.01.2020, 12:06
Сохранение состояния компонентов я делал записью нужных свойств компонентов тупо в виде текста. Есть возможность проверить правильно ли сохранилось, и если неправильно загрузилось - выявить где ошибка.

сохранение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
TStringList *save=new TStringList;
for(int i=1; i<=100; i++)
    {
    TLabel *Label=static_cast<TLabel*>(Form1->FindComponent("Label"+IntToStr(i)));
    TComboBox *ComboBox=static_cast<TComboBox*>(Form1->FindComponent("ComboBox"+IntToStr(i)));
 
    if(Label->Visible)
        {
        save->Add(Label->Name);
        save->Add(ComboBox->Text);
        save->Add(ComboBox->Font->Color);
        save->Add(ComboBox->Color);
        }
    }
save->SaveToFile(SaveDialog1->FileName);
загрузка
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
TStringList *load=new TStringList;
load->LoadFromFile(BtnLoad->Hint);
 
for(int l=0; l<load->Count; l+=4)
    {
    for(int i=1; i<=100; i++)
        {
        TLabel *Label=static_cast<TLabel*>(Form1->FindComponent("Label"+IntToStr(i)));
        TComboBox *ComboBox=static_cast<TComboBox*>(Form1->FindComponent("ComboBox"+IntToStr(i)));
        String s=load->Strings[l];
        if(Label->Name==load->Strings[l])
            {
            ComboBox->Text=load->Strings[l+1];
            ComboBox->Font->Color=StrToInt(load->Strings[l+2]);
            ComboBox->Color=StrToInt(load->Strings[l+3]);
            ComboBox->SelStart=0;
            ComboBox->SelLength=0;
            }
        }
    }
1
3 / 2 / 1
Регистрация: 15.04.2019
Сообщений: 33
26.01.2020, 12:11  [ТС]
Да, это возможный вариант. В этом случае надо писать достаточно много кода и, при добавлении/удалении элементов управления, его изменять. Хотелось бы задействовать поточную систему VCL, который применяется при сохранении формы в файл *.dfm.
0
10 / 6 / 6
Регистрация: 26.06.2017
Сообщений: 206
26.01.2020, 12:21
изменять код придется если добавить компонент типа, который не был предусмотрен, или если надо сохранить свойство, которое раньше не сохранялось, а если добавился тот, который уже есть, то можно сделать без изменения

это у меня от ComboBox1 до ComboBox100, а можно делать перебор всех компонентов и в зависимости от типа сохранять тип, имя и нужные свойства, потом читать, искать компонент, в зависимости от типа выставлять нужные свойства...

Но правильней конечно так, как вы хотите, а у меня велосипед) напишите пожалуйста в посте решение если найдете
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33405 / 21515 / 8236
Регистрация: 22.10.2011
Сообщений: 36,916
Записей в блоге: 12
26.01.2020, 12:42
Цитата Сообщение от maksim_volodin Посмотреть сообщение
Что может являться причиной этого предупреждения?
То, что дизайнер формы создает компонент под этим именем, а потом Билдер пытается прочесть из файла сохраненный вручную компонент и опять создать его на форме (ибо именно так и работает стандартный механизм), а это имя уже используется, конфликт имен и ошибка.

Кроме этого, если нужно именно состояние компонент в текущий момент - этот метод вообще не подходит: скажем, для StringGrid-а не будет сохранено содержимое ячеек. Ну, и на кой такое сохранение нужно? Я делал сохранение в TIniFile вручную. Больше писанины, но надежнее, будет сохраняться именно то, что нужно, а не то, что заложено разработчиками, и потом сиди и думай, "а сохранится ли вот это свойство, а вот это не забудут ли?"...
0
3 / 2 / 1
Регистрация: 15.04.2019
Сообщений: 33
26.01.2020, 13:04  [ТС]
volvo Remy Lebeau, MVP C++Builder, посоветовал очистить, от элементов управления форму, а также убрать регистрацию TToolButton и TTabSheet http://bcbj.org/forums/viewtop... e727b9bb89. После этого, ошибки типа "A component named ToolButton1 already exists" исчезли. Но, возникли другие ошибки, видимо, восстановление компонентов идёт не в правильном порядке (пока разбираюсь с эти). В общем, я прихожу к Вашему и roma2415 заключению, что процессом я не управляю и, нет уверенности, что после добавления какого-нибудь элемента, "лаконичный" код, использующий поточную систему VCL, продолжит работать правильно.
0
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
26.01.2020, 23:24
maksim_volodin, , я аналогичное проделывал с формой Form1, используя блок dfm из ресурсов: RCData-TForm1__
C++
1
2
3
4
5
6
void __fastcall TForm1::FormDblClick(TObject *Sender)
{
   while(ComponentCount) delete Components[0];
   TResourceStream *Rs = new TResourceStream(0,"TFORM1",RT_RCDATA);
   Rs->ReadComponent(Form1);  delete Rs;
}
- т.е. по двойному щелчку на форме на ней устанавливаются все компоненты (после предварительного удаления) из блока TForm1 в ресурсах программы.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
26.01.2020, 23:24
Помогаю со студенческими работами здесь

Перебор элементов управления на форме
Нужно подобрать элементы (button, label), чтото вроде этого: foreach (int i in Label) { MessageBox.Show(label.Text); }

Перемещение элементов управления по форме
Подскажите пожалуйста как правильно изменить координаты какого-либо элемента управления на форме, причем реализовать приращение, т.е. к...

Нет элементов управления на форме
Здравствуйте, уважаемые! Выдали мне на руки чужой код из инета, нужно его подогнать под наши нужды. Но тут я столкнулась с очень...

Мерцание элементов управления на форме
Создавая приложение Windows Forms, столкнулся с проблемой мерцания. По информации в интернете не совсем понятно что и где надо указывать. ...

Анимация элементов управления на форме
Необходимо создать форму с некоторыми элементами (buttons, textboxes, checkboxes...). При нажатии на одну из кнопок элементы должны...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru