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), как лучше всего сохранять их в файле?


Джо   (2006-02-22 00:29:00) [21]

> , как мне узнать длинну массива

High


Дмитрий_177   (2006-02-22 00:22:00) [22]

да, но там же вроде как фиксированный размер типа Integer, а тут массив из TPointer, как мне узнать длинну массива или как-то там еще, чтобы прочитать его


Джо   (2006-02-22 00:19:00) [23]

Смотри класс TIniFileи его методы WriteIntegerи ReadInteger.


Дмитрий_177   (2006-02-22 00:12:00) [24]

но повторюсь... функцией хотел бы сохранять несколько точек в одном параметре секции...


Дмитрий_177   (2006-02-22 00:11:00) [25]

как в ini-файлах.. и строки и числа и др. т.е. не только точки...


Джо   (2006-02-22 00:01:00) [26]

> [12] Дмитрий_177   (21.02.06 23:55)
> в этих примерах при чтении из файла мы знаем что ф этом
> файле только точки... а вдруг там еще чтонибудь будет записано?

Что значит "вдруг"?


Дмитрий_177   (2006-02-21 23:55:00) [27]

в этих примерах при чтении из файла мы знаем что ф этом файле только точки... а вдруг там еще чтонибудь будет записано?


Дмитрий_177   (2006-02-21 23:54:00) [28]

Я вот разбираюсь... хочу написать еще две функции в DataFile, какраз для считывания точек... но что-то никак... если кто не знает могу скинуть модуль, мне он нравится )))


Zeqfreed   (2006-02-21 23:37:00) [29]


> Такое вроде по-проще будет ;)

Сложно сказать наверняка :)
Было бы больше пользы, конечно, если бы автор ещё свой вариант составил.


Джо   (2006-02-21 23:13:00) [30]

Такое вроде по-проще будет ;)


unit PointsUtils;

interface
uses Windows, SysUtils, Classes;

type

 TPoints = class
 private
   FList: TList;
   procedure SetItems(Index: Integer; const Value: TPoint);
   function GetItems(Index: Integer): TPoint;
   function GetCount: Integer;
 public
   constructor Create();
   destructor Destroy; override;
   function Add (X,Y: Integer): Integer; overload;
   function Add (APoint: TPoint): Integer; overload;
   property Count: Integer read GetCount;
   property Items[Index: Integer]: TPoint read GetItems write SetItems; default;
   procedure Clear;
   procedure SaveToStream (AStream: TStream);
   procedure SaveToFile (AFileName: string);
   procedure LoadFromStream (AStream: TStream);
   procedure LoadFromFile (AFileName: string);
 end;

implementation

type
 PPoint = ^TPoint;

{ TPoints }

function TPoints.Add(X, Y: Integer): Integer;
var
 Pt: TPoint;
begin
 Pt.X := X;
 Pt.Y := Y;
 Result := Add (Pt)
end;

function TPoints.Add(APoint: TPoint): Integer;
var
 NewPt: PPoint;
begin
 GetMem (NewPt,SizeOf(TPoint));
 NewPt^ := APoint;
 Result := FList.Add(NewPt)
end;

procedure TPoints.Clear;
var
 I: Integer;
begin
 for I := Count - 1 downto 0 do
   FreeMem (FList[I]);
 FList.Clear;
end;

constructor TPoints.Create;
begin
 inherited;
 FList := TList.Create;
end;

destructor TPoints.Destroy;
begin
 Clear;
 FList.Free;
 inherited;
end;

function TPoints.GetCount: Integer;
begin
 Result := FList.Count
end;

function TPoints.GetItems(Index: Integer): TPoint;
begin
 Result := PPoint(FList[Index])^
end;

procedure TPoints.LoadFromFile(AFileName: string);
var
 Fs: TFileStream;
begin
 Fs := TFileStream.Create(AFileName,fmOpenRead);
 try
   LoadFromStream(Fs);
 finally
   Fs.Free;
 end;
end;

procedure TPoints.LoadFromStream(AStream: TStream);
var
 I,
 Cnt: Integer;
 Pt: TPoint;
begin
 Clear;
 AStream.Read(Cnt,SizeOf(Cnt));
 for I := 0 to Cnt-1 do
 begin
   AStream.Read(Pt,SizeOf(Pt));
   Add (Pt)
 end;
end;

procedure TPoints.SaveToFile(AFileName: string);
var
 Fs: TFileStream;
begin
 Fs := TFileStream.Create(AFileName,fmCreate);
 try
   SaveToStream(Fs);
 finally
   Fs.Free;
 end;
end;

procedure TPoints.SaveToStream(AStream: TStream);
var
 I: Integer;
 Pt: TPoint;
 Cnt: Integer;
begin
 // количество точек
 Cnt := Count;
 AStream.Write(Cnt,SizeOf(Cnt));

 // сами точки
 for I := 0 to Count - 1 do
 begin
   Pt := Self[I];
   AStream.Write(Pt,SizeOf(TPoint));
 end;
end;

procedure TPoints.SetItems(Index: Integer; const Value: TPoint);
begin
 PPoint(FList[Index])^ := Value
end;

end.


Пример использования:
---------------------

procedure TForm18.Button1Click(Sender: TObject);
var
 APoints: TPoints;
 I: Integer;
begin
 APoints := TPoints.Create;
 try

   APoints.Add(10,20);
   APoints.Add(30,40);
   APoints.Add(50,60);

   APoints.SaveToFile('d:\points.dat');
   
   APoints.Clear;

   APoints.LoadFromFile ('d:\points.dat');
   for I := 0 to APoints.Count - 1 do
     ShowMessageFmt('%d,%d',[APoints[I].X,APoints[I].Y]);
     
 finally
   APoints.Free;
 end;
end;


Zeqfreed   (2006-02-21 22:35:00) [31]


type
 TDynPointsArray = array of TPoint;

. . .

function SavePoints(const Filename : String; const Points : array of TPoint) : Boolean;
type
 TPointsArray = array[0..0] of TPoint;
var
 f, i : Integer;
 buf : Pointer;
begin
 Result := false;

 f := FileCreate(Filename, fmCreate);
 if (f = -1) then Exit;
  GetMem(buf, SizeOf(TPoint) * Length(Points));
  try
   for i := Low(Points) to High(Points) do
    TPointsArray(buf^)[i] := Points[i];

   FileWrite(f, buf^, SizeOf(TPoint) * Length(Points));
   Result := true;
  finally
   FreeMem(buf);
  end;
 try

 finally
  FileClose(f);
 end;
end;

function ReadPoints(const Filename : String; var Points : TDynPointsArray) : Boolean;
type
 TPointsArray = array[0..0] of TPoint;
var
 f, i, size : Integer;
 buf : Pointer;
begin
 Result := false;

 f := FileOpen(Filename, fmOpenRead or fmShareDenyWrite);
 if (f = -1) then Exit;

 try
  size := GetFileSize(f, nil);

  GetMem(buf, size);
  try
   if FileRead(f, buf^, size) = size then begin
    SetLength(Points, size div SizeOf(TPoint) + 1);

    for i := 0 to (size div SizeOf(TPoint)) do
     Points[i] := TPointsArray(buf^)[i];

    Result := true;
   end;
  finally
   FreeMem(buf);
  end;
 finally
  FileClose(f);
 end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
 a, b : TDynPointsArray;
 i : Integer;
 s : String;
begin
 Randomize();

 SetLength(a, 2);
 for i := Low(a) to High(a) do begin
  a[i].X := Random(High(Integer));
  a[i].Y := Random(High(Integer));
 end;

 if SavePoints('C:\1.points', a) then
  if ReadPoints('C:\1.points', b) then begin
   for i := Low(a) to High(a) do begin
    s := s + Format('%d, %d'#13#10, [b[i].X, b[i].Y]);
   end;

   ShowMessage(s);
  end;
end;


Джо   (2006-02-21 22:29:00) [32]

> [5] Дмитрий_177   (21.02.06 21:49)
> еще пока никак.... я их из bmp файла считываю

Куда?


Дмитрий_177   (2006-02-21 22:08:00) [33]

А ктонибудь знает модуль DataFile? я им пользуюсь и сохраняю все... это как ini-файлы только лучше


Дмитрий_177   (2006-02-21 21:49:00) [34]

еще пока никак.... я их из bmp файла считываю... т.е. определенным цветом точки... чтобы каждый раз не тратить время напоиск этих точек определенным каким-то цветом, я хочу их как-то сохранить...


Джо   (2006-02-21 21:46:00) [35]

У тебя точки в какой структуре данных хранятся?


Джо   (2006-02-21 21:45:00) [36]

Можно в типизированных файлах (file of TPoint), можно не типизированных (file). Да как угодно можно.


Дмитрий_177   (2006-02-21 21:39:00) [37]

а как это? я сначала думал так: два текстовых вайла... в одном x-ы, в другом y-ки.. и первая строка одного и второго файла и будут координаты... но тут 2-а файла и строку переводить из string в integer... это на скорости мне кажется скажется...


Zeqfreed   (2006-02-21 21:31:00) [38]

Полагаю, двойками целочисленных значений фиксированного размера.


Страницы:   1 2

Наверх

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