- •Windows -приложение
- •Среда программирования
- •Встроенный отладчик
- •Использование графики
- •Графические данные и палитра
- •Сохранение проекта
- •Структура приложения
- •Структура модуля
- •Простые типы
- •Символьные типы
- •Логические типы
- •Тип перечень
- •Составной оператор
- •Оператор if
- •Оператор цикла for
- •Оператор цикла while
- •Оператор цикла repeat
- •Пример приложения 6
- •Пример приложения 7
- •Статические массивы
- •Динамические массивы
- •Оператор with
- •Идентичность типов
- •Совместимость типов
- •Преобразование типов
- •Операторы обработки исключительных ситуаций
- •Рекурсия
- •Процедура exit
- •Директивы подпрограммы
- •Класс как объектный тип
- •Наследование
- •Операции is и as
- •Типы ссылки на класс
- •Типизированные файлы
- •Файлы без типа
- •Пример приложения 17
- •Компонент tmainmenii
- •Двунаправленные списки
- •Потоки данных
- •Пример приложения 22
- •Интерфейс drag and drop
- •Пример приложения 24
- •С файлами
- •Пример приложения 26
- •Программные потоки
- •Приоритеты потоков
- •Класс tthread
- •Проблемы синхронизации потоков
Пример приложения 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). В примере показана работа потока при чтении и записи, а также его взаимодействие с файлами.