Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебник Емельянов.doc
Скачиваний:
12
Добавлен:
03.11.2018
Размер:
3.25 Mб
Скачать

Пример приложения 22

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

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

176

пусть оно генерируется в программе с помощью генератора случайных чи­сел. Ниже приводится программа решения данного примера.

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;

МеmоЗ: TMemo;

Label1: TLabel;

Label2: TLabel;

Label3: TLabel;

BitBtnl: 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.ss1,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 к 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-l downto 1 do begin

MyMemoryStream.Seek(m*SizeOf(Res),0); MyMemoryStream.Read(VRes,SizeOf(Res)); for i:=l 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 к 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 к do begin

MyMemoryStream.Read(TRes,SizeOf(Res)); s:=ResToStr(TRes);

memo3.Lines.Add(s); end; end; finally

MyMemoryStream.Free; end; end; end.

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

Рис. 50

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