Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сохранение в файл текущей задачи 
:(
    Опции темы
Нитонисе
Дата 16.11.2011, 09:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



Задача такая - нужно сохранить текущую работу в файл. Наподобие как в Word можно сохранить файл с набранным текстом. То есть на выходе должен получаться файл с зарезервированной иконкой и ассойиированный с моим приложениме. В последствии двойной клик в проводнике по этому файлу - и все его содержимое загружается в программу.

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

В программе имеется множество полей, переключателей, таблиц. Как сделать своеобразный "снимок" текущей работы и записать все это в файл с тем чтобы в последствии из этого файла восстановить состояние всех полей, переключателей и таблиц?

Для примера. Допустим есть такие управляющие элементы:

"Поле для ввода А".
"Поле для ввода Б".
"Поле для ввода В".
"Переключатель".
"Таблица" (в таблице 5 колонок).
Например в текущей работе такое состояние:
Текст в поле А - "текстА".
Текст в поле Б - "текстБ".
Текст в поле В - "текстВ".
Значение переключателя - true.
В таблице 3 записи:
первая запись - "1кол1,1кол2,1кол3,1кол4,1кол5"
вторая запись - "2кол1,2кол2,2кол3,2кол4,2кол5"
третья запись - "3кол1,3кол2,3кол3,3кол4,3кол5"

Вот нужно все это записать в файл и затем загрузить из него, записав все значения полей, таблиц и запомнив состояние переключателя. 

PM MAIL   Вверх
Данкинг
Дата 16.11.2011, 10:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 11
Всего: 130



Так выводи данные из контролов в в файл в определённом порядке. А затем - при обратной загрузке из файла - значение из соответствующей строчки подставляй соответствующему контролу.


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
Нитонисе
Дата 16.11.2011, 11:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



Цитата(Данкинг @  16.11.2011,  10:13 Найти цитируемый пост)
Так выводи данные из контролов в в файл в определённом порядке. А затем - при обратной загрузке из файла - значение из соответствующей строчки подставляй соответствующему контролу.

Это слишком прямолинейное и неудобное решение. Можно ли как-то организовать файл, чтобы обращаться к тому или иному значению можно было по переменной? То есть чтобы загрузить некое значение из файла в поле, скажем Edit1->Text, мне нужно было знать не порядковый номер этой строки в файле, а имя некоей переменной. Например Edit1->Text = File->MyEdit. Что-то тмпо того.
Хранение просто построчно всей информации неудобно, потому что если я сдвину строки в файле, то придется заново переписовать функции загрузки и сохранения. А если обращение идет по неким переменным, то ничего и переписывать не надо.
PM MAIL   Вверх
vol4ek
Дата 16.11.2011, 11:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


конь в пальто
**


Профиль
Группа: Участник
Сообщений: 304
Регистрация: 1.5.2011
Где: Минск

Репутация: нет
Всего: 0



используй INI файл. WritePrivateProfileString() и GetPrivateProfileString()

Добавлено через 25 секунд
очень удобно
PM MAIL ICQ   Вверх
Данкинг
Дата 16.11.2011, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 11
Всего: 130



Ну, тогда действительно INI-файл. Секция - переменная - значение.


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
kin
Дата 16.11.2011, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 204
Регистрация: 9.5.2008

Репутация: 1
Всего: 6



Привет! На мой взгляд, все до безобразия просто: посмотри как организован проект у того же Buildera или VS. Это XML-файл (или что-то подобное) где каждый узел - это отдельный элемент твоей работы, атрибуты этого узла (или его дочерние узлы) - свойства элемента. Ну а в чем плюсы(минусы) такой конструкции разберешься сам.
PM MAIL   Вверх
vol4ek
Дата 16.11.2011, 11:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


конь в пальто
**


Профиль
Группа: Участник
Сообщений: 304
Регистрация: 1.5.2011
Где: Минск

Репутация: нет
Всего: 0



слишком мудрено. В INI указал нужный ключ и получил данные. А так можно и в реестр настройки совать.
PM MAIL ICQ   Вверх
Нитонисе
Дата 16.11.2011, 12:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



ini вроде как выглядит неплохо, только я пока не разбирался в детальном принципе работы. Но тут есть вот еще какая заковыка. Файл должен быть с моим расширением. Например "файл.my". Как можно его обрабатывать как ini-файл?
PM MAIL   Вверх
vol4ek
Дата 16.11.2011, 12:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


конь в пальто
**


Профиль
Группа: Участник
Сообщений: 304
Регистрация: 1.5.2011
Где: Минск

Репутация: нет
Всего: 0



запросто. любое расширение.

Добавлено через 2 минуты и 24 секунды
Код

#include <windows.h>


//Функция GetPrivateProfileString, как не трудно догадаться по названию, служит для чтения данных из INI-файлов. Вот как выглядит ее вызов:


DWORD WINAPI GetPrivateProfileString(
LPCTSTR lpAppName,
LPCTSTR lpKeyName,
LPCTSTR lpDefault,
LPTSTR lpReturnedString,
DWORD nSize,
LPCTSTR lpFileName);

//lpAppName — имя секции, в которой находится считываемй ключ. Если в качестве этого параметра передать NULL, функция вернет список всех секций в указанном INI-файле
//lpKeyName — имя ключа, чье значение нужно считать. Если в качестве параметра передать NULL, то функция, по аналогии с секциями, вернет имена всех ключей в секции.
//lpDefault — строка по умолчанию. Если в указанном INI-файле ключ lpKeyName не найден, то функция вернет это значение.
//lpReturnedString — буфер, в который будут записаны возвращаемые функцией данные
//lpFileName — имя считываемого INI-файла.

//Функция WritePrivateProfileString служит для записи данных в INI-файлы 


BOOL WINAPI WritePrivateProfileString(
LPCTSTR lpAppName,
LPCTSTR lpKeyName,
LPCTSTR lpString,
LPCTSTR lpFileName);




//lpAppName — имя секции, в которую нужно записать значение. Если секции с таким именем не существует, она будет создана. Имя секции регистронезависимо.
//lpKeyName — имя ключа, ассоциируемого со значением. Если такого ключа нет, он будет создан автоматически. Внимание! Если в качестве имени ключа передать NULL, будет удалена вся секция lpAppName.
//lpString — строка, которую следует записать в INI-файл. Если в качестве этой строки передать NULL, то ключ lpKeyName будет удален.


Добавлено через 7 минут и 22 секунды
одно уточнение.
Код

WritePrivateProfileString("имя секции","ключ секции","данные","My.file");


если в последнем параметре указано имя файла без пути, по умолчанию файл создается в папке Windows.

PM MAIL ICQ   Вверх
kin
Дата 16.11.2011, 12:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 204
Регистрация: 9.5.2008

Репутация: 1
Всего: 6



Цитата(vol4ek @  16.11.2011,  11:48 Найти цитируемый пост)
слишком мудрено. В INI указал нужный ключ и получил данные. 
 Не спорю, все зависит от задачи. На мой взгляд, INI-файл  хорошо работает, когда система плоская, а если есть иерархия тут, все же, XML сподручнее будет.

PM MAIL   Вверх
Нитонисе
Дата 16.11.2011, 12:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



А как решить задачу хранения данных таблицы в ini? Когда есть набор статичных полей для записи или чекбоксы - то все понятно, каждому контролу - своя запись в ini. А в таблице может быть несколько строчек. Как организовать хранение табличных данных в ini?

И еще, я так понял расширение могу давать файлу любое, но работать с ним как с ini и все будет ОК?
PM MAIL   Вверх
vol4ek
Дата 16.11.2011, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


конь в пальто
**


Профиль
Группа: Участник
Сообщений: 304
Регистрация: 1.5.2011
Где: Минск

Репутация: нет
Всего: 0



будет ок. Какое расширение задано в функциях, с тем расширением и будет работать.
хранение таблицы. Ну например так:

Код

char * st = new char[1]; // здесь имя столбца
char * str = new char[1]; // здесь номер строки
char * buf = new char[1]; // здесь содержимое
WritePrivateProfileString(st,str,buf,"C:\\твой файл.расширение");


PM MAIL ICQ   Вверх
Нитонисе
Дата 16.11.2011, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



Еще вопрос. Можно ли как-то зашифровать этот файл при записи? Чтобы его нельзя было просматривать например в блокноте. Соответственно перед считыванием информации - расшифровать.
PM MAIL   Вверх
vol4ek
Дата 16.11.2011, 13:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


конь в пальто
**


Профиль
Группа: Участник
Сообщений: 304
Регистрация: 1.5.2011
Где: Минск

Репутация: нет
Всего: 0



не скажу не знаю. файл текстовый, блокнотом просматривается, выглядеть будет так:

[секция]
ключ1 = значение
ключ2 = значение
[секция2]
ключ1 = значение

и т.д.

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

Добавлено через 1 минуту и 1 секунду
хотя мудрено. а что там у тебя лежать-то будет?
PM MAIL ICQ   Вверх
Нитонисе
Дата 16.11.2011, 13:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



Обычный файл. В нем ничего секретного. Просто хочу лишить пользователя возможности править файл вручную, а то может что-то некорректно подправить. Например некое поле не может принимать значение больше 100. Пользователь в файле выставит 200 - вот и получится некорректный итог программы.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0521 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.