Сохранение/чтение глобальных переменных в файл.

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Сохранение/чтение глобальных переменных в файл.

Сообщение Сквозняк » 23.07.2011 02:40:44

Имеется множество глобальных переменных и массивов разных типов - целый зоопарк. Возникла необходимость большую их часть сохранять в файл чтобы в нужный момент можно было восстановить состояние программы. Локальные мне сохранять не надо. Есть ли что-то готовое для упрощения этого процесса?
Сквозняк
энтузиаст
 
Сообщения: 1129
Зарегистрирован: 29.06.2006 22:08:32

Re: Сохранение/чтение глобальных переменных в файл.

Сообщение sign » 23.07.2011 05:35:58

Есть TIniFile.
В FormCreate читаете сохраненные значение, в FormDestroy - сохраняете.
sign
энтузиаст
 
Сообщения: 1131
Зарегистрирован: 30.08.2009 09:20:53

Re: Сохранение/чтение глобальных переменных в файл.

Сообщение hinst » 23.07.2011 14:00:15

конечно, есть. Вот, например, в модуле SysUtils есть процедура
Код: Выделить всё
procedure SaveAllMyGlobalVariablesToFile(const aFilename: string): boolean;

Изображение
Аватара пользователя
hinst
энтузиаст
 
Сообщения: 781
Зарегистрирован: 12.04.2008 18:32:38

Re: Сохранение/чтение глобальных переменных в файл.

Сообщение Сквозняк » 23.07.2011 19:18:05

hinst, а по делу сказать есть что?
Сквозняк
энтузиаст
 
Сообщения: 1129
Зарегистрирован: 29.06.2006 22:08:32

Re: Сохранение/чтение глобальных переменных в файл.

Сообщение Maxizar » 23.07.2011 19:33:01

Сквозняк ну мне кажется если задача стоит именно так, то sign прав на все 100. Если есть DRKB3, то про ини файлы можно прочитать в разделе: Системные функции и WinAPI->Windows->Реестр и ини файлы->Ini Файлы.
Так же в любой книге по делфи...
Если нужно будет написать пару примеров на фрипаскаль свистите, набрасаем.
Maxizar
постоялец
 
Сообщения: 385
Зарегистрирован: 20.03.2010 19:48:14

Re: Сохранение/чтение глобальных переменных в файл.

Сообщение Сквозняк » 23.07.2011 20:06:00

Maxizar, пара рабочих самописных примеров собственного формата у меня уже есть и давно ими пользуюсь, только кода в них многовато. Не сделаешь цикл потому что на каждую переменную нужно добавлять новые строки в процедурах записи и чтения - всегда приходится писать что-то
Код: Выделить всё
Var_A:=......
С короткими массивами ещё веселее, если бы имена переменных заменить их названиями в формате строк, было бы полегче. Но это намного эффективнее чем читать книги по некроссплатформенной среде разработки, которая у меня не установлена.
TIniFile, конечно интересная штука, рою исходники FPC на предмет процедур, которые её используют чтобы узнать, с чем же её едят и есть ли смысл её использовать.
Сквозняк
энтузиаст
 
Сообщения: 1129
Зарегистрирован: 29.06.2006 22:08:32

Re: Сохранение/чтение глобальных переменных в файл.

Сообщение Maxizar » 23.07.2011 20:49:01

Ну по поводу того, что долго тут уж зависит от модульности... Просто я всегда юзаю именно Ини файлы для таких целей, вот скажем когда речь идет о переносимости данных то XML. Рыть исходники я думаю не имеет смысла, нароете только что-нибудь TIniPropStorage подобное, оно вам надо?, я думаю нет.
Еще раз про то, что долго, ну тут нужно было подумать чень на счет классовости, я вот в таких случаях (много переменных) создаю классы или даже набор классов с наследованием, и использую два метода для сохранения и чтения данных из\в файл..., если данные нужны только в рамках одной формы, то пишу код прям в модуле формы, при показывании формы я файл читаю, при закрывании записываю, че там юзер накликал.
Можно конечно аналогично сделать на xml, но я думаю это того не стоит(просто XML слишком громоздкий для такой задачи). Вот если нужно эти данные переносить или использовать в другой программе или чень в этом роде, то да XML идеальное решение.

Что касается вообще Ini так там работа прям в лоб (записал-прочитал), и тут уж все зависит от вас любите вы классы или нет (если данных туча, то классы с методами записи\чтения самое то) в ини файлах, а если быть точным в модуле для работы с ини файлами, самое крутое это поиск и загрузка ини файла, но она нужна когда вы производите разбор чужого (не вашего) ини файла.

Если писать тоже самое но для XML файла, кода будет чуть больше, но смысла от этого не прибавится, да и файлы XML будут за счет тегов чуть жирнее... Так что выбирайте что больше подходит.
Maxizar
постоялец
 
Сообщения: 385
Зарегистрирован: 20.03.2010 19:48:14

Re: Сохранение/чтение глобальных переменных в файл.

Сообщение Сквозняк » 23.07.2011 21:18:02

Посмотрел и решил пока от добра добра не искать. Например, для чения второго конфига используется
Код: Выделить всё
PROCEDURE IZ_CONF0_V_NASTROIKI;//ПРОЦЕДУРА ИНИЦИАЛИЗАЦИИ АЛЬТЕРНАТИВНЫХ ПАРАМЕТРОВ
CONST
LIMIT=70000;
KOLP=3;
VAR
Q3: BYTE;
Q2,W2,E2,R2,T2,Y2: LONGINT;
QQ3: ARRAY [1..LIMIT+200] OF BYTE;
S5: ARRAY [1..KOLP] OF STRING;
Z5: ARRAY [1..KOLP] OF ANSISTRING;
Q5: STRING;
LABEL
1,2, 100;
BEGIN
S5[1]:='katalog_homjaka='+#39;
S5[2]:='katalog_zzzz='+#39;
S5[3]:='repack='+#39;

Q2:=FPOPEN(PUTJ_k_kornju5+'conf0.conf',Open_RDONLY);
IF Q2<0 THEN GOTO 100;
W2:=FPLSEEK(Q2,0,SEEK_END);
FPLSEEK(Q2,0,SEEK_SET);
IF W2>LIMIT THEN W2:=LIMIT;
IF W2<1 THEN GOTO 100;
FPREAD(Q2,QQ3,W2);

FOR Q3:=1 TO KOLP DO BEGIN
                     FOR E2:=1 TO W2 DO BEGIN
                                        IF QQ3[E2]<>10 THEN GOTO 2;
                                        IF QQ3[E2+1]<>36 THEN GOTO 2;
                                        FOR R2:=1 TO LENGTH(S5[Q3]) DO BEGIN
                                            IF QQ3[E2+R2+1]<>ORD(S5[Q3,R2]) THEN GOTO 2;
                                            IF QQ3[E2+R2+1]=39 THEN BEGIN
                                                                    Y2:=1;
                                                                    FOR T2:=R2+1 TO W2 DO BEGIN
                                                                                          IF QQ3[E2+T2+1]=10 THEN GOTO 1;
                                                                                          Z5[Q3]:=Z5[Q3]+CHR(QQ3[E2+T2+1]);
                                                                                          IF QQ3[E2+T2+1]=39 THEN GOTO 1;
                                                                                          INC(Y2);
                                                                                          END;
                                                                    GOTO 1;
                                                                    END;
                                                                       END;
2:
                                        END;
1:
                     END;
W2:=LENGTH(Z5[1]);
IF W2>1 THEN BEGIN SETLENGTH(Z5[1],W2-1); katalog_homjaka:=Z5[1]; END;
W2:=LENGTH(Z5[2]);
IF W2>1 THEN BEGIN SETLENGTH(Z5[2],W2-1); katalog_zzzz:=Z5[2]; END;
W2:=LENGTH(Z5[3]);
IF W2>1 THEN BEGIN SETLENGTH(Z5[3],W2-1); repack:=F_VAL(Z5[3]); END;

100:
FPCLOSE(Q2);
END;
Есть такие же процедуры, которые работают с ~30 переменными. Ну будет ~300, невелика разница, компилятор справится, а если нужно перенести на виндовс и непонятно как, то всегда есть я :mrgreen:
Сквозняк
энтузиаст
 
Сообщения: 1129
Зарегистрирован: 29.06.2006 22:08:32

Re: Сохранение/чтение глобальных переменных в файл.

Сообщение Brainenjii » 23.07.2011 21:35:36

Святые угодники 0.о
Аватара пользователя
Brainenjii
энтузиаст
 
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Re: Сохранение/чтение глобальных переменных в файл.

Сообщение hinst » 23.07.2011 21:46:17

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

Только вот тут, чтобы воспользоваться описанным мною способом, должно выполниться ещё одно маленькое условие: среди твоих глобальных переменных не должно быть указателей. То есть, просто используй в своих глобальных переменных простые типы вместо указателей: ShortString вместо AnsiString, Object вместо Class, и так далее. Иначе, после загрузки, указатели, скорее всего, будут кривые. :roll:
Аватара пользователя
hinst
энтузиаст
 
Сообщения: 781
Зарегистрирован: 12.04.2008 18:32:38

Re: Сохранение/чтение глобальных переменных в файл.

Сообщение Сквозняк » 23.07.2011 22:26:08

hinst, указатели я использую только в исключительных случаях, а среди глобальных переменных есть и такие (их сохранять не надо и их типы придуманы они не мной), тип которых ни в сказке сказать, ни топором описать и с указателями внутри. В общем задача ясна, спасибо за идеи.
Сквозняк
энтузиаст
 
Сообщения: 1129
Зарегистрирован: 29.06.2006 22:08:32

Re: Сохранение/чтение глобальных переменных в файл.

Сообщение sign » 24.07.2011 06:26:37

Brainenjii писал(а):Святые угодники 0.о

Господи!
И это писано в нашем веке? :shock: :shock: :shock:
sign
энтузиаст
 
Сообщения: 1131
Зарегистрирован: 30.08.2009 09:20:53

Re: Сохранение/чтение глобальных переменных в файл.

Сообщение Сквозняк » 24.07.2011 14:37:38

sign писал(а):
Brainenjii писал(а):Святые угодники 0.о

Господи!
И это писано в нашем веке? :shock: :shock: :shock:

Ну да, в нашем веке принято писать так, чтобы при включении программы, компьютер превращался в мартеновскую печь и требовалась замена термопасты и радиатора на более эффективные :twisted: А если что-то заглючило то сразу лезть в отладчик. Приведённый выше код отладчика не требует, вообще. Сначала разрулите кривые места лазаруса а потом уже требуйте чтобы основной код писали в нём а не в этом:
Изображение
Сквозняк
энтузиаст
 
Сообщения: 1129
Зарегистрирован: 29.06.2006 22:08:32

Re: Сохранение/чтение глобальных переменных в файл.

Сообщение sign » 25.07.2011 05:47:12

Да какая разница, хоть в блокноте пишите.
Я вовсе не об этом, а о том, что даже не думал увидеть написанную в настоящее время программу на Паскале в стиле васика.
sign
энтузиаст
 
Сообщения: 1131
Зарегистрирован: 30.08.2009 09:20:53

Re: Сохранение/чтение глобальных переменных в файл.

Сообщение Сквозняк » 25.07.2011 13:37:18

Да, хороший был язык Спектрум бейсик 48, продуманный :)
Сквозняк
энтузиаст
 
Сообщения: 1129
Зарегистрирован: 29.06.2006 22:08:32


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5

Рейтинг@Mail.ru