![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как лучше хранить координаты точек в файле? [D7, WinXP]
Дмитрий_177 © (2006-02-21 21:19:00)Как лучше хранить координаты точек в файле? У меня есть много точек с координатами (x, y), как лучше всего сохранять их в файле?
Дмитрий_177 (2006-02-27 16:30:00) [1]спасибо ))) еще один технический вопросик... при использовании раньше подобных ini-оберткок, как сказал Zeqfreed, можно было например сразу считать изображение в какойнибудь компонент, например в кнопку, а тут считывается сразу все, и будет храниться в памяти... ведь так? и потом оттуда уже записываем в кнопку или еще там куда... я так это понимаю?
Джо (2006-02-27 16:01:00) [2]> а если я функцию не "Add" а "AddPoint" назову? всеравно
> "overload;" писать?
Нет, конечно. Overload нужен для объявления методов с одинаковымиименами, имеющими разныепараметры.
Дмитрий_177 (2006-02-27 15:51:00) [3]Джо, я сейчас расширяю ваш класс для хранения в нем изображений еще... У меня вопрос в том, что функциям "Add" надо всегда "overload;" приписывать? это же вроде как для того чтобы переписать функцию... а если я функцию не "Add" а "AddPoint" назову? всеравно "overload;" писать?
Дмитрий_177 (2006-02-25 01:33:00) [4]так... завтра начинаю все сначала читать про потоки и про файлы... спасибо, Джо, а то я не понимал сначала... и писал ерунду...)))
Джо (2006-02-25 01:05:00) [5]В поток что угодно записать можно. И прочитать.
Джо (2006-02-25 01:02:00) [6]> [32] Дмитрий_177 (25.02.06 00:52)
> но там же подразумевается
> что во всем файле будут храниться только точки и ничего
> больше...
Ничего такого там не подразумевается. Напротив, в моем примере сделано все, чтобы можно было легко расширить класс для хранения записи/чтения чего-угодно.
Дмитрий_177 (2006-02-25 00:52:00) [7]блин... опять снова здорова.....((((((( но там же подразумевается что во всем файле будут храниться только точки и ничего больше... поетому мы можем написать эти строки при чтении из [8]:
size := GetFileSize(f, nil);
...
if FileRead(f, buf^, size) = size then begin
SetLength(Points, size div SizeOf(TPoint) + 1);
т.е. работать с размером файла, неволнуясь ч в том что там еще что-то может храниться...
или я не правильно понимаю эти примеры?
Джо (2006-02-25 00:44:00) [8]>
>
> [29] Дмитрий_177 (25.02.06 00:42)
> а как мне перевести массив в поток? какой функцией? подскажите
> пожалуйста
Ты читал посты: [8] и [9]? Разбирался с ними? Какие вопросы возникли в процессе разбора?
Там, между прочим, готовые рабочие примеры были...
Дмитрий_177 (2006-02-25 00:43:00) [9]ну или не только массив... вообще любую переменную или класс... TStas © как вы перевели таблицу в поток?
Дмитрий_177 (2006-02-25 00:42:00) [10]а как мне перевести массив в поток? какой функцией? подскажите пожалуйста
Джо (2006-02-25 00:38:00) [11]> [27] TStas © (25.02.06 00:35)
> А как раз понял, почему TFileStream и посоветовал
И правильно, кстати, посоветовал. :)
TStas (2006-02-25 00:35:00) [12]А как раз понял, почему TFileStream и посоветовал У меня в нем хранилась элекктронная таблица, наподобие экселевской, с форматированием, текстом и формулой произвольной длинны, нй и координатами, конечно.
Джо (2006-02-25 00:17:00) [13]> [24] Дмитрий_177 (24.02.06 23:53)
> у меня в одном файле не только точки
> хранятся... но и числа там разные, и всякая другая информация...
Тут уже советов надавали — море. На все случаи жизни. А ты все повторяешь одно и тоже, вероятно, не дав себе труда хотя бы понять то, что тебе писали.
Zeqfreed (2006-02-24 23:58:00) [14]23] TStas © (24.02.06 23:50)
> Sz:=fs.Seek(0, soFromEnd) даст вам размер вашего файла в
> байтах
Согласно справке, Seek изменит текущую позицию в потоковом ресурсе. А вот TFileStream.Size как раз вернет размер файла.
[24] Дмитрий_177 (24.02.06 23:53)
> у меня в одном файле не только точки хранятся... но и числа
> там разные, и всякая другая информация...
Нужно использовать нетипизированные файлы. А для хранения числовых данных использование текстовых файлов, а тем более каких-то ini-подобных оберток, как мне кажется, жутко неудобно.
Дмитрий_177 (2006-02-24 23:53:00) [15]TStas © вы не поняли... у меня в одном файле не только точки хранятся... но и числа там разные, и всякая другая информация...
TStas (2006-02-24 23:50:00) [16]Если координаты - TPoint, то FIle of TPOint Я, например, только TFIleStream'Ом и пользуюсь В нем замечательно храняться ЛЮБЫЕ структуры. Sz:=fs.Seek(0, soFromEnd) даст вам размер вашего файла в байтах, дальше, думаю, понятно
Дмитрий_177 (2006-02-24 23:43:00) [17]но потом обратно конечно... из потока в массив для чтения )))
Дмитрий_177 (2006-02-24 23:42:00) [18]А можно ли такой массив перевести в поток? там есть функция WriteStream, сохраняющая поток...
Дмитрий_177 (2006-02-22 15:37:00) [19]я наверно поздно вопрос задал и с появлением новых он затерялся...
Дмитрий_177 (2006-02-22 00:36:00) [20]у меня что-то не получается (((
функции из DataFile для чтения и записи данных
function TDataFile.WriteData(Section, Ident: string; pBuf: Pointer; Count: Integer): Integer;
var
Hdr : IDataHeader;
P : Pointer;
begin
Delete(Section, Ident);
FFile.Seek(0, soFromEnd);
{ feel header }
Hdr.Id := DF_HEADER_IDENT;
StrPCopy(Hdr.Section, Section);
StrPCopy(Hdr.Ident, Ident);
Hdr.Size := Count;
{ xor }
EncryptBuf(@Hdr, SizeOf(IDataHeader));
{ write header }
Result := FFile.Write(Hdr, SizeOf(IDataHeader));
if( Result > -1 )then
begin
GetMem(P, Count);
try
Move(pBuf^, P^, Count);
{ xor data }
EncryptBuf(P, Count);
{ write data }
Result := FFile.Write(P^, Count);
finally
FreeMem(P, Count);
end;
end;
end;
function TDataFile.ReadData(Section, Ident: string; pBuf: Pointer): Integer;
var
Found : boolean;
Hdr : IDataHeader;
begin
Found := FindIdent(Section, Ident, @Hdr);
if( Found )then
begin
Result := FFile.Read(pBuf^, Hdr.Size);
DecryptBuf(pBuf, Hdr.Size);
end else
Result := -1;
end;
программа:
type
TDynPointsArray = array of TPoint;
procedure TForm1.Button1Click(Sender: TObject); // запись
var
a: TDynPointsArray;
i: integer;
begin
SetLength(a, 2);
for i := Low(a) to High(a) do
begin
a[i].X := Random(500);
a[i].Y := Random(500);
end;
with TDataFile.Create('C:\1.points') do
try
WriteData('1', '1', @a, SizeOf(TPoint) * Length(a));
finally
Free;
end;
end;
procedure TForm1.Button2Click(Sender: TObject); // чтение
var
Buf: array[0..1023]of Char;
a: TDynPointsArray;
i, Count: integer;
s: string;
begin
with TDataFile.Create('C:\1.points') do
try
Count := ReadData('1', '1', @Buf);
if (Count >= SizeOf(TPoint)) then
Move(Buf, a, SizeOf(TPoint));
finally
Free;
end;
for i := Low(a) to High(a) do
begin
s := s + IntToStr(a[i].X) + ' ' + IntToStr(a[i].Y) + ' ';
end;
ShowMessage(s);
end;