|
0 / 0 / 0
Регистрация: 07.01.2011
Сообщений: 11
|
|
Сохранение и восстановление данных типа CObject17.09.2011, 21:22. Показов 2358. Ответов 9
Метки нет (Все метки)
Уважаемые специалисты.
Не могу разобраться с записью и восстановлением данных типа CObject в MFC, Ведь это простая задача, а у меня, дилетанта, ничего не получается. Допустим, основное окно у меня будет владеть какими то элементами типа CEdit и/или CButton. Нужно эти элементы сохранить в файл, а потом данный файл открыть. Вышлите, пожалуйста, какой либо исходник. Спасибо большое.
0
|
|
| 17.09.2011, 21:22 | |
|
Ответы с готовыми решениями:
9
Сохранение данных пользовательского типа в list из stl Сохранение и последующее восстановление процесса Восстановление системы. Сохранение данных |
|
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
|
|
| 02.10.2011, 12:22 | |
|
Помогаю со студенческими работами здесь
10
Считывание введенных данных, определение их типа и сохранение в виде массива данных Сохранение данных из DataGridView с колонками типа DataGridViewComboBoxColumn Сохранение данных разного типа в один файл Восстановление данных/восстановление массива RAID 1 Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
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
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
|