![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как лучше хранить координаты точек в файле? [D7, WinXP]
Дмитрий_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]Полагаю, двойками целочисленных значений фиксированного размера.