Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
0 / 0 / 0
Регистрация: 07.01.2011
Сообщений: 11

Сохранение и восстановление данных типа CObject

17.09.2011, 21:22. Показов 2358. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Уважаемые специалисты.

Не могу разобраться с записью и восстановлением данных типа CObject в MFC, Ведь это простая задача, а у меня, дилетанта, ничего не получается. Допустим, основное окно у меня будет владеть какими то элементами типа CEdit и/или CButton. Нужно эти элементы сохранить в файл, а потом данный файл открыть.

Вышлите, пожалуйста, какой либо исходник.

Спасибо большое.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
17.09.2011, 21:22
Ответы с готовыми решениями:

Сохранение данных пользовательского типа в list из stl
Здравствуйте. Пишу программу реализации списка. #include <iostream> #include <iterator> #include <string> #include...

Сохранение и последующее восстановление процесса
Требуется написать программу, которая бдет по расписанию сохранять некоторый процесс, полный дамп. и уметь его восстанавливать из...

Восстановление системы. Сохранение данных
Всем доброго времени суток! Прошу помощи у знающих! После обновления драйверов на моём ноуте HP dv6-2110-er он перезапускается. И при...

9
5 / 5 / 0
Регистрация: 08.12.2009
Сообщений: 213
18.09.2011, 16:30
Что имеется ввиду под созранением элементов ?
Их содержимое ? Местоположение ? Что другое ?
В зависимости от этого и сохранять надо нечто определенное.
0
0 / 0 / 0
Регистрация: 07.01.2011
Сообщений: 11
18.09.2011, 18:34  [ТС]
Я, наверное, неправильно поставил вопрос.

Задача такая...

Документ владеет визуальными элементами
(в основном окне приложения отображены текстовые поля (CEdit) или еще чего нибудь. Эти элементы имеют определенный размер и местоположение (CRect), содержание (какой то текст) и т.д.).
Нужно сохранить этот документ так, что бы при его отрытии можно было восстановить все сохраненные элементы с их свойствами.

Спасибо.
0
5 / 5 / 0
Регистрация: 08.12.2009
Сообщений: 213
18.09.2011, 18:57
Дело обстоит так, нет никакой возможности сохранения автоматически, т.е. если тебе надо сохранять весь документ, например, при выгрузке, а потом при загрузке восстанавливать, то тебе надо написать 'автоматизацию'.

Что я имею ввиду ?
Во-первых, тебе надо определиться в каком формате ты сохраняешь информацию в файл: в текстовом виде или бинарном.
Во-вторых, тебе надо поключить сереализацию объектов (почитай в MSDN o serialization).
Пример сохранения? Скажем у тебя есть CView на котором размещены контроли. Этот CView прикреплен к документу CDocument (поддерживающий сериализацию). На СView есть объект CEdit (скажем с именем ID_EDIT_ONE). Если файл текстовой, то контроль можно сохранить так:
сначала объявить что есть контроль
[control]
потом сохранить его тип и имя
type=edit
name=ID_EDIT_ONE
потом размеры и позицию
left=100
top=50
width=30
heigth=10
затем сохранить его текст
value='Text from Edit box'

Таким образом можно сохранить все контроли.

Загрузка будет в том же порядке, читаешь построково информацию, определяшь на кого она распространяется, если контроль, то дальше должен быть его тип, если текст бокс, то за ним должно следовать его имя, и т.д.
Это только пример, вариантов тут множество. Например с бинарным файлом будет легче работать (хотя кому как).
0
0 / 0 / 0
Регистрация: 07.01.2011
Сообщений: 11
19.09.2011, 14:06  [ТС]
В текстовом формате я понял как сохранять.

Только, вот лично тебе, не кажется ли, что такой подход несколько громоздкий. Если иметь дело с элементом, у которого необходимо сохранять кучу свойств, эти все свойства нужно держать в голове, и вообще можно запутаться.

А как же в двоичном формате?

Спасибо тебе большое за помощь.
0
5 / 5 / 0
Регистрация: 08.12.2009
Сообщений: 213
19.09.2011, 14:41
Громоздкий, да. Но чем больше информации ты хочешь восстановить тем больше её надо сохранить, а затем прочитать, такова селяви.

Что касается бинарных файлов, ты вообще с ними работал? Знаешь в чем оличие бинарного от текстового?

скажем по первому примеру:

char ctrlType=1; // скажем 1=EditBox
char objType=1; // скажем 1=контроль, 2=окно 3=что-нибудь еще
long ID = ID_EDIT_ONE ;
unsigned cLeft=100;
unsigned cTop =50;
unsigned cWidth =30;
unsigned cHeight =10;
char buffer[256] ;

write(file, &objType, sizeof(objType));
write(file, &ctrlType,sizeof(ctrlType));
wirte(file, &ID, sizeof(ID));
write(file, &cLeft, sizeof(cLeft));
write(file, &cTop, sizeof(cTop));
write(file, &cWidth, sizeof(cWidth));
write(file, &cHeight, sizeof(cHeight));

int len =GetWindowText(GetDlgItem(hWnd, ID_EDIT_ONE), buffer, 256);
write(file, &len, sizeof(len));
write(fiel, buffer, len));

и т.д. и т.п.

Понятно, что при загрузке надо будет читать именно в таком порядке и с соответствующими типами.
0
50 / 49 / 10
Регистрация: 24.01.2010
Сообщений: 225
19.09.2011, 19:03
В принцепе основные моменты прозвучали уже...
В MFC сериализация реализована на уровне декларирования некоего обработчика, который гарантированно вызываеться при записи (шутдаун) и чтении (старт ап) приложения.

Далее находясь в обработчике Вы можете передать управление любому обьекту (например чайлдам).
При написании кода сериализации воспринимайте хранилище на входе (либо выходе - в зависимости от направления) как поток байт. Куда он потом перемещаеться (сохраняеться) - не важно.
Надо отметить следующий нюанс. При изменении структуры программы либо версии программы (добавили в цепочку сохранения новый обьект) - данные будут потеряны.
Как читать или писать в поток - да как Вам захочеться (хоть делайте 'виртуальные' конструкторы для классов). Единственное условие - единообразность и зеркальность операций.

удачи Вам
(круглый)
ЗЫ
Про данный механизм и его место в реализации MFC удачно написано у Круглинского.
0
0 / 0 / 0
Регистрация: 07.01.2011
Сообщений: 11
19.09.2011, 19:40  [ТС]
Спасибо Вам большое за стратегическую подсказку.

Еще один вопрос!
Круглинский, я так понял - автор книги по MFC.

Если так, то возможно ли каким то образом приобрести электронный вариант данного пособия.
0
0 / 0 / 0
Регистрация: 07.01.2011
Сообщений: 11
29.09.2011, 21:38  [ТС]
Не знаю прав я или нет, но я слегка отклонился от твоего совета.

Оцени пожалуйста такой вариант (быть может ты будешь смеяться но мне кажется, что такой способ легче)

/ *
Есть класс, порожденный от обычной кнопки. Объекты данного класса подвержены сохранению, так как в данном классе метод Serialize() перегружен.
*/

class CMyButton : public CButton
{
public:
DECLARE_SERIAL(CMyButton)
CMyButton();
~CMyButton();
protected:
virtual void Serialize(CArchive& ar);
};

/*
Есть класс основного окна приложения в котором инкапсулирован объект класса CMyButton (этот объект мы и будем сохранять и восстанавливать).
*/

class CMainWnd : public CFrameWnd
{
// … Тут всякие конструктор и деструктор

public:
CMyButton* button1; // ВОТ ЭТОТ ОБЪЕКТ

void InsertMyButton(); // Это метод вставки кнопки button1 в окно
// … Тут еще чего то

protected:

// Это метод по которому все обновится
void OnNew();
// Это метод по которому вызовется стандартное окно сохранения файла
void OnStore();
// Это метод по которому вызовется стандартное окно загрузки файла
void OnLoad();

DECLARE_MESSAGE_MAP()
};

// ………..Тут остальные классы, в том числе и класс приложения






// РЕАЛИЗАЦИЯ методов класса CMainWnd

// Конструктор основного окна приложения

//…………………………………………………………………………….

/* вставка кнопки в окно/
void CMainWnd::InsertMyButton()
{
if(!button1)
{
button1 = new CMyButton();
button1->Create(...);
}
}

// Реализация метода OnNew()

void CMainWnd::OnNew()
{
if(button1)
{
button1->~CMyButton();
button1 = NULL;
}
this->SetWindowText('untitled');
}

// Реализация метода записи данных на диск
void CMainWnd::OnStore()
{
CFileDialog DlgSaveAs(...);

if(DlgSaveAs.DoModal()==IDOK)
{
CFile File(DlgSaveAs.GetPathName(), CFile::modeCreate|CFile::modeWrite);
CArchive ar(&File,CArchive::store);
ar.WriteObject(button1);
ar.Close();
File.Close();
this->SetWindowText(DlgSaveAs.GetPathName() );
}
}

// Реализация метода чтения данных с диска
void CMainWnd::OnLoad()
{
CFileDialog DlgOpen(...);
if(DlgOpen.DoModal()==IDOK)
{
OnNew();
CStdioFile File(DlgOpen.GetPathName(),CFile::modeRe ad);
CArchive ar(&File,CArchive::load);
button1=(CMyButton*)ar.ReadObject(RUNTIM E_CLASS(CMyButton));
ar.Close();
File.Close();
this->SetWindowText(DlgOpen.GetPathName());
}

// РЕАЛИЗАЦИЯ методов класса CMyButton

IMPLEMENT_SERIAL(CMyButton, CButton,1)

// ………Конструктор и деструктор………………………………………
// ……………………………………………………………………………

// Метод записи и восстановления объекта класса CMyButton
// В данном методе я сохраняю тип объекта данного класса, его расположение(размеры) и надпись (кнопка // // “OK” например)

void CMyButton::Serialize(CArchive& ar)
{
WINDOWPLACEMENT place;
char type = '1' // Это тип
CString caption; // Это надпись

CString X1Pos; // Далее координаты расположения
CString X2Pos;
CString Y1Pos;
CString Y2Pos;
if(ar.IsStoring())
{
this->GetWindowText(caption);
this->GetWindowPlacement(&place);
X1Pos.Format('%d',place.rcNormalPosition .left); X2Pos.Format('%d',place.rcNormalPosition .right);
Y1Pos.Format('%d',place.rcNormalPosition .top);
Y2Pos.Format('%d',place.rcNormalPosition .bottom);
// Вот я записал информацию про объект
ar<<type<<caption<<X1Pos<<X2Pos<<Y1Pos<< Y2Pos<<'
'

}
else
{
CString result;
ar.ReadString(result); // Вот я прочитал информацию про объект и получил строку
// Тут со строкой этой надо что то делать (в ней действительно есть то что мне нужно)
}
}
}


Вопрос ???
0
50 / 49 / 10
Регистрация: 24.01.2010
Сообщений: 225
02.10.2011, 12:22
Не понял кому адрессовался вопрос...
Но отвечу вопросом на вопрос...
НАФИГА Вам MFC ?
Прелесть сей библиотеки вовсе не в том, что она содержит куча классов (порою апсолютно не нужных). Если Вам нужны такие классы как CString (для удобства) - тогда Вам нужна книжечка Страуступа и пристальней взглянуть на STL.

А то Вы как то... MFC потащили а плюсы то и выкинули... кхм..странно всё это (опять же рекомендую Круглинского. В тупую проделать все примеры - как мартышка. К концу книги начнёте 'чуствовать' нафига она нужна ента MFC)

с уважением
(круглый)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
02.10.2011, 12:22
Помогаю со студенческими работами здесь

Code First сохранение и восстановление данных
Совсем недавно начал изучать создание сайтов с использованием MVC, Entity Framework Code First и столкнулся с распространённой проблемой:...

Считывание введенных данных, определение их типа и сохранение в виде массива данных
Написать программу, которая осуществляет считывание в веденных данных, определяет их тип и сохраняет в виде массива данных. Результатом...

Сохранение данных из DataGridView с колонками типа DataGridViewComboBoxColumn
проблема заключается в следующем: есть компонент DataGridView, привязанная к первой таблице, одна из колонок типа...

Сохранение данных разного типа в один файл
Добрый день. Прошу помощи с сохранением данных программы. У меня есть один image и 3 таблицы StringGrid. В общем,нужно,чтобы программа...

Восстановление данных/восстановление массива RAID 1
Приветствую всех! У меня трагедия, заглючил мой iStor 608 с программным RAID 1. Надо как то восстановить RAID. Оба HDD имеют...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru