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

Пример 18

Прочитать целые числа из текстового файла в память и вывести их в обратной последовательности в три столбца: в первом столбце числа со значениями не больше 100, во втором – значения от 100 до 200 включительно, в третьем - значения больше 300. Файл можно подготовить с помощью примера 17. Пусть подготовлен файл InpFil.txt. Количество чисел в файле неизвестно. Пусть числа типа Byte.

При решении задачи вначале определим возможное количество чисел, чтобы задать размер выделяемой динамической памяти, а затем, предварительно разместив числа в памяти, выведем их на экран дисплея в обратной последовательности. Примем для простоты (и с запасом), что каждое число занимает два байта вместе с разделителем. Форма и вариант расчёта приводятся на рис. 39.

Рис. 38 Форма свариантом расчета примера 18.

В данном примере использовался компонент TListView (страница Win32). Этот элемент управления отображает список в удобном для пользователя виде. В этом списке, кроме текста, могут отображаться пиктограммы. Компоненты списка представляют собой коллекцию элементов типа TListItem. Для добавления их в список используется свойство Items и метод Add. В зависимости от значения свойства ViewStyle список может отображаться различными способами. В примере выбран стиль отображения vsReport. TListItem имеет свойство Caption, с помощью которого формируется текст самого левого столбца, и SubItems, с помощью которого формируется текст остальных столбцов. Но прежде чем создавать текст из нескольких столбцов, необходимо последние создать. Столбцы именуются обычно ListColumn, их тип - TListColumn. Столбцам можно задать заголовок посредством свойства Caption и ширину, используя свойство Width. Кроме того, свойству TListItem.Selected необходимо задать значение true. Как работать со всеми этими свойствами, приводится в программе.

unit prim18;

interface

uses Windows, Messages, SysUtils, Classes,

Graphics, Controls, Forms, Dialogs,

StdCtrls, Buttons, ComCtrls, ExtCtrls;

type

TForm1 = class(TForm)

ListView1: TListView;

Panel1: TPanel;

Button1: TButton;

BitBtn1: TBitBtn;

procedure Button1Click(Sender: TObject);

end;

var Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);

type IntArray = array [0..1000] of byte;

const stext='Ошибка открытия файла';

var n:integer;

p:pointer;

a,I,k:integer;

s:array [1..3] of string;

t:textfile;

f:file of char;

ListItem:TListItem;

ListColumn:TListColumn;

begin

{$I-}

AssignFile(f,'Inpfil.txt');

reset(f);

{$I+}

if IOResult<>0 then begin

MessageDlg(sText,mtError,[mbOk],0);

exit;

end;

n:=(FileSize(f)+1) div 2;

CloseFile(f);

p:=nil;

try

GetMem(p,n);

{$I-}

AssignFile(t,'Inpfil.txt');

reset(t);

{$I+}

if IOResult<>0 then begin

MessageDlg(sText,mtError,[mbOk],0);

exit;

end;

a:=-1;

while not eof(t) do begin

inc(a);

read(t,IntArray(p^)[a]);

end;

CloseFile(t);

for i:=1 to 3 do begin

ListColumn:=ListView1.Columns.Add;

case i of

1: ListColumn.Caption:=' Числа<=100';

2: ListColumn.Caption:='100<Числа<=200';

3: ListColumn.Caption:=' Числа>200';

end;

ListColumn.Width:=14*Font.Size;

s[i]:='';

end;

for i:=a-1 downto 0 do begin

k:= IntArray(p^)[i]

if k<=100 then s[1]:=s[1]+' '+IntToStr(k)

else if k<=200 then s[2]:=s[2]+' '+IntToStr(k)

else s[3]:=s[3]+' '+IntToStr(k);

if (length(s[1])>14) or (length(s[2])>14) or

(length(s[3])>14) or (i=0) then begin

ListItem:=ListView1.Items.Add;

ListItem.Caption:=s[1];

ListItem.Selected:=true;

ListView1.Selected.SubItems.Add(s[2]);

ListView1.Selected.SubItems.Add(s[3]);

s[1]:='';

s[2]:='';

s[3]:='';

end;

end;

finally

FreeMem(p,n);

end;

end;

end.

В элементе ListView1 ширина столбцов связана с размером используемого шрифта. Значение 14 для расчёта ширины столбца выбрано произвольно (с помощью оператора IF length(s[1])>14… выводится не более 14 символов в строке). Оператор Try контролирует выделение памяти для указателя P. Обратная последовательность вывода чисел обеспечивается оператором For с downto.