Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

"Сохранёнки" [Delphi, Windows]


Страницы:   1 2

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;

правильно ли все это?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо