![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
"Сохранёнки" [Delphi, Windows]
MonoLife © (2005-10-31 05:14:00)Добрых суток. Сто лет не занимался играми, но появилось немного времени, нашел свою старую игруху 2003 г, захотелось поковыряться. Вопрос возник такого плана, как лучше создавать пользовательские сохраненки в файл? Содержание: юзер, здоровье, патроны и т.д. и т.п. Какой файл должен быть? Кроме ini тока. Поделитесь, кто что знает.
MonoLife (2005-11-05 11:24:00) [1]Вполне исчерпывающие ответы. Спасибо!
Fosgen (2005-11-04 11:08:00) [2]К пункту [17]:
String - уже готовый массив типа Char. И когда он пишется (даже в составе записи) в файл, первым байтом идет количество символов в string'е. Что отсюда следует? Что либо в типе string длина до 255 символов, либо - читайте Help Дельфи по стандартным типам - все узнаете.
Fosgen (2005-11-04 11:00:00) [3]Это к вопросу - "быстрее, универсальнее и т.д."....
ЗАчем Вам вообще БД, если достаточно типизированного файла? Ставие тип = типу вашей переменной (пусть она и запись), да и все дела. Если Вам нужен переменный размер записи - пользуйтесь нетипизированными файлами или TMemoryStream, но заранее придумывайте - как Вы будете "отделять" одну запись от другой...
Fosgen (2005-11-04 10:52:00) [4]Непосредственно по [16]
НЕсколько громоздко получается.
Хотя можно сделать проще:
Tplayer = record
helth: Longint;
Ammo: Longint;
NamePl: string[50];
end;
var Pz: array of TPlayer;
{Запись в файл}
...
var
i: integer;
F1: File Of TPlayer;
begin
setlength(pz,3); //хоть (pz,3000)
Assign(F1, 'mysave.txt');
Rewrite(F1);
for i:=0 to High(Pz) do
begin
Write(F1, Pz[i]);
end;
Close(F1);
end;
Вроде несколько проще? Создаем типизированный файл. Записи там однозначно будут фиксированной длины - размером в одну единицу массива Pz. После СТАНДАРТНЫМИ процедурами пишем в файл (или читаем из него - без разницы). Все. А использование потов тут необосновано - записи-то фиксированные. А массив - уже готовый буфер данных. Зачем его из одного блока памяти (array) в другой-то (TMemoryStream) закачивать? Базой данных он от этого не становится.
Если требуется файл, поддерживающий переменную длину записи - пользуйтесь либо TMemoryStream (хотя это как-то громоздко...), либо - нетипизированные файлы типа File; File Of Byte;(это если нечетное число байт возможно в записи) File Of Word;(это если число байт кратно длине слова), а после - указатель на начало массива данных, подготовленных к записи в файл и в цикле - двигаем указатель, читаем по байтно\пословно (али еще большими блоками), да пишем опять же стандартно в нетипизированный файл. Только возникнет вопрос - где хранить переменный размер читаемой записи, дабы было его откуда взять при чтении такого файла. А то разбирать - как-то напряжно, где одна запись закончилась, а другая - началась. Читаем - так же - устанавливаем указатель на начало буфера-приемника, двигаем указатель, читаем из нетипизированного файла.
Потом - разбираем что, где...
MonoLife (2005-11-04 09:00:00) [5]to Кефир87>> А ведь можно еще сделать быстрее, универсальнее и т.
обоснуй плз. А то про основоную тему ветки по моему забыли
Кефир87 (2005-11-03 19:32:00) [6]
> По моему, если всё работает правильно, значит сделал всё
> правильно, а каким способом - не важно!
Что значит правильно? А ведь можно еще сделать быстрее, универсальнее и т.д. Так что я не согласен 8)
JUS (2005-11-03 18:01:00) [7]По моему, если всё работает правильно, значит сделал всё правильно, а каким способом - не важно!
MonoLife (2005-11-03 16:59:00) [8]Ну, хорошо. Пусть мне только кто-нибудь объяснит и скажет, чтО у меня получилось в [16] и правильно ли так делать. И почему нельзя делать [17] (или можно? :))
Кефир87 (2005-11-03 16:49:00) [9]Да вы чо! База данных это когда есть субд, которая на низком уровне оперирует с данными 8) И что это вдруг теба про БД зашла? Не нужны они тут 8)
JUS (2005-11-03 16:46:00) [10]
> Домовенок © (03.11.05 14:33) [25]
Опять же запись базы все-таки фиксированной длины. 50
Домовенок (2005-11-03 14:33:00) [11]Вот: http://www.realcoding.net/article/view/866- "Моя собственная база данных".
Читаем и не паримся. Никаких BDE не нужно.
MonoLife (2005-11-03 05:40:00) [12]вы о чем? причем тут BDE? Просто, я создал типизированный файл с ограниченными записями, это по существу, уже база данных, так думаю... Вообще, комментарий по поводу [16],[17] хотел услышать
Кефир87 (2005-11-02 21:42:00) [13]Ага. BDE (Borland Database Engine). Нужно 8)))
JUS (2005-11-02 19:28:00) [14]
> Но ведь это же бред! А потом еще застовлять юзера установить
> на свой ПК делфи, потому что он лох и у него нет BDE 8)
Не надо юзеру ничего устанавливать, зачем!?... или всётаки надо?!8-\
Кефир87 (2005-11-02 18:22:00) [15]
> Я имел ввиду например Paradox, FoxPro, MSAccess и другие.
Но ведь это же бред! А потом еще застовлять юзера установить на свой ПК делфи, потому что он лох и у него нет BDE 8)
JUS (2005-11-02 17:26:00) [16]Я имел ввиду например Paradox, FoxPro, MSAccess и другие.
> MonoLife (02.11.05 17:02) [19]
> По существу, [16] и есть база данных?
Незнаю, наверное да!
MonoLife (2005-11-02 17:02:00) [17]По существу, [16] и есть база данных?
JUS (2005-11-02 15:16:00) [18]Вроде правильно 8-\
MonoLife (2005-11-02 08:09:00) [19]Что будет, если в Tplayer - NamePl ( zon, ошибочка выше, вместо "zon" читай "NamePl") поставить string, а не string[50], а k=12?
MonoLife (2005-11-02 07:46:00) [20]Вот, для пробы сделал так:
(Обратите внимание на k)
Tplayer = record
helth: Longint;
Ammo: Longint;
NamePl: string[50];
end;
varPz: array ofTPlayer;
constk: integer=60;
{Запись в файл}
...
varMyMem: TMemoryStream;
i,h,a: integer;
z: string[50];
begin
MyMem:=TMemoryStream.create;
setlength(pz,3);
h:=100;
a:=200;
z:='Abracadabra';
try
fori:=0 to2 do
begin
pz[i].helth:=h;
pz[i].Ammo:=a;
pz[i].zon:=z;
inc(h,10);
inc(a,10);
z:=z+'B';
MyMem.write(pz[i],k);
end;
MyMem.savetofile(ExtractFilePath(Application.ExeName)+ 'mysave.txt');
finally
MyMem.free;
end;
end;
{чтение из файла}
...
varMyMem: TMemoryStream;
i: integer;
begin
MyMem:=TMemoryStream.create;
try
setlength(pz,3);
MyMem.LoadFromFile(ExtractFilePath(Application.ExeName)+ 'mysave.txt');
fori:=0 to2 do
MyMem.Read(Pz[i],k);
finally
MyMem.free;
end;
end;
правильно ли все это?