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

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

Как лучше хранить координаты точек в файле? [D7, WinXP]


Страницы:   1 2

Дмитрий_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;


Страницы:   1 2

Наверх

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