Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка DELPHI.DOC
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
2.73 Mб
Скачать

Пример 22

В данном примере рассмотрим работу с потоками в памяти (TmemoryStream).

Пусть вводится информация о некоторых спортивных соревнованиях. Примем для упрощения, что необходимо ввести порядковый номер участника и время, которое он показал. Эту информацию далее необходимо отсортировать в порядке возрастания по времени и записать в файл. Пусть показанное участниками соревнования время колеблется от 20 до 35 минут и пусть оно генерируется в программе с помощью генератора случайных чисел. Ниже приводится программа решения данного примера.

unit prim22;

interface

uses Windows, Messages, SysUtils, Variants, Classes,

Graphics, Controls, Forms,

Dialogs, ExtCtrls, StdCtrls, StrUtils, Buttons;

type

TForm1 = class(TForm)

Panel1: TPanel;

OpenDialog1: TOpenDialog;

SaveDialog1: TSaveDialog;

Memo1: TMemo;

Memo2: TMemo;

Memo3: TMemo;

Label1: TLabel;

Label2: TLabel;

Label3: TLabel;

BitBtn1: TBitBtn;

Button1: TButton;

GroupBox1: TGroupBox;

CheckBox1: TCheckBox;

CheckBox2: TCheckBox;

procedure Button1Click(Sender: TObject);

end;

Res=record

n:word;

t:TDateTime;

end;

const k=50;

var Form1: TForm1;

implementation

{$R *.dfm}

function ResToStr(r:Res):string;

var s:string;

begin

s:=IntToStr(r.n);

Result:=StringOfChar(' ',4-length(s))+

s+' '+FormatDateTime('nn.ss',r.t);

end;

procedure TForm1.Button1Click(Sender: TObject);

var i,m:Integer;

TRes,VRes:Res;

CurrentFile,s:string;

MyMemoryStream:TMemoryStream;

begin

Randomize;

memo1.Lines.Clear;

memo2.Lines.Clear;

MyMemoryStream:=nil;

try

MyMemoryStream:=TMemoryStream.Create;

MyMemoryStream.SetSize(k*SizeOf(Res));

for i := 1 to k do begin

Tres.n:=i;

TRes.t:=0.014+0.01*Random;

MyMemoryStream.Write(TRes,SizeOf(Res));

s:=ResToStr(TRes);

memo1.Lines.Add(s);

end;

for m:=k-1 downto 1 do begin

MyMemoryStream.Seek(m*SizeOf(Res),0);

MyMemoryStream.Read(VRes,SizeOf(Res));

for i:=1 to m do begin

MyMemoryStream.Seek((i-1)*SizeOf(Res),0);

MyMemoryStream.Read(TRes,SizeOf(Res));

if Tres.t > Vres.t then begin

MyMemoryStream.Seek((i-1)*SizeOf(Res),0);

MyMemoryStream.Write(VRes,SizeOf(Res));

VRes:=TRes;

end;

end;

MyMemoryStream.Seek(m*SizeOf(Res),0);

MyMemoryStream.Write(VRes,SizeOf(Res));

end;

MyMemoryStream.Seek(0,0);

for i := 1 to k do begin

MyMemoryStream.Read(TRes,SizeOf(Res));

s:=ResToStr(TRes);

memo2.Lines.Add(s);

end;

if CheckBox1.Checked then

if SaveDialog1.Execute then begin

CurrentFile := SaveDialog1.Filename;

MyMemoryStream.SaveToFile(CurrentFile);

end;

if CheckBox2.Checked then

if OpenDialog1.Execute then begin

CurrentFile := OpenDialog1.Filename;

MyMemoryStream.Clear;

MyMemoryStream.LoadFromFile(CurrentFile);

memo3.Clear;

MyMemoryStream.Seek(0,0);

for i := 1 to k do begin

MyMemoryStream.Read(TRes,SizeOf(Res));

s:=ResToStr(TRes);

memo3.Lines.Add(s);

end;

end;

finally

MyMemoryStream.Free;

end;

end;

end.

Вариант решения примера показан на рис. 50.

Рис. 50 Вариант решения примера 22.

На рис. 50 показано, что, отсортированные данные (второй столбец на рис. 50) из потока в памяти корректно записываются в файл (третий столбец на рис. 50).

Для настройки диалоговых компонентов можно воспользоваться расположенной выше табл. 15, задав какое-либо расширение файлов, например, *.dat. Это расширение необходимо также записать в свойство DefaultExt (задать dat). В примере показана работа потока при чтении и записи, а так же его взаимодействие с файлами.