Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Interface. usesWindows, Messages, SysUtils, Classes,Graphics, Controls,




uses Windows, Messages, SysUtils, Classes,Graphics, Controls,

Forms, Dialogs, StdCtrls, ExtCtrls, Menus, Buttons; type

TMainForm = class(TForm) MainMenu1: TMainMenu; MainFile: TMenuItem; CodeFile: TMenuItem; InfoCompare: TMenuItem; ExitPoint: TMenuItem; NewFile: TMenuItem; AddFile: TMenuItem; ReadFile: TMenuItem; CodeTabl: TMenuItem; InfoCode: TMenuItem; Panel1: TPanel; Memo1: TMemo; BitBtn1: TBitBtn; BitBtn2: TBitBtn;

procedure NewFileClick (Sender: TObject); procedure ExitPointClick(Sender:. TObject); procedure AddFileClick (Sender: TObject); procedure ReadFileClick (Sender: TObject); procedure CodeTablClick (Sender: TObject); procedure InfoCodeClick(Sender: TObject); procedure BitBtn1Click(Sender: TObject); procedure BitBtn2Click (Sender: TObject); procedure InfoCompareClick (Sender: TObject); end; Const n=25;

stext='Ошибка открытия файла1; Type TTableCode=array [l..n] of char; var MainForm: TMainForm; TableCode:TTableCode; T: TaxtFile; F: File of TTableCode; FNoType: File; implementation {$R *.DFM}

procedure TMainForm.NewFileClick (Sender: TObject); begin

Panel1.Visible:=true; BitBtn2.Visible:=true;


Memo1.SetFocus;

end;

procedure TMainForm.ExitPointClick(Sender: TObject);

begin close;

end;

procedure TMainForm. AddFileClick. (Sender: TObject);

begin

Panel1.Visible:=true;

BitBtn2.Visible:=true;

Memo1.Lines.LoadFromFile('Inpfil.txt');

Memo1.SetFocus;

end;

procedure TMainForm.ReadFileClick(Sender: TObject);

var str:string; begin {$I-}

AssignFile(T,'lnpfil.txt');

reset (T);

{$1+}

if lOResult<>O then begin

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

Panel1.Visible:=true; BitBtn2.Visible:=true;

while not eof (T) do begin

readln(T,str);

Memo1.Lines.Add(str);

end;

CloseFile(T); Memo1.SetFocus;

end;

procedure TMainForm.CodeTablClick(Sender: TObject);

var i: byte;

str:string; begin

Randomize;

for i:=l to n do

TableCode[i]:=char(Random(256));

Panel1.Visible:=true;

BitBtn2.Visible:=false; str:='';

for i:=l to n do str:=str+TableCode[i]+' '; Memo1.Lines.Add(str);

end;

procedure TMainForm.InfoCodeClick(Sender: TObject);

var i,res: integer;

 


 

 

 

 
 

 
 
 

Buffer,Buf:TTableCode; str: string; k: byte; begin

AssignFile(F,'Outfil.dat');

rewrite(F);

if lOResult<>O then begin

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

AssignFile(FNoType,'Inpfil.txt1); reset(FNoType,l); {$!+} if lOResult<>O then begin

MessageDlg(sText,mtError,[inbOk],0); CloseFile(F); exit; end;

Write(F,TableCode); Panel1.Visible:=true; BitBtn2.Visible:=false; while not eof(FNoType) do begin BlockRead(FNoType,Buffer,n, res); str:='';

for i:=l to n do begin if i<=res then begin

к:=ord(Buffer[i])+ord(TableCode[i]); Buf[i]:=chr(k);

end else Buf[i]:=TableCode[i]; str:=str+Buf[i]+' '; end;

Memo1.Lines.Add(str); Write(F,Buf);

end;

 

CloseFile(FNoType); CloseFile(F); end;

procedure TMainForm.BitBtn1Click(Sender: TObject); begin

Memo1.Lines.Clear; Panel1.Visible:=false; end;

procedure TMainForm.BitBtn2Click (Sender: TObject); begin

Memo1.Lines.SaveToFile{'Inpfil.txt'); BitBtn1Click(Sender);

end;


procedure TMainForm.infoCompareClick(Sender: TObject); var

i: integer;

Buf:TTableCode; str:string; к: byte; begin {$I-}

AssignFile(F,'Outfil.dat’);

reset(F);

if lOResult<>O then begin

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

Panel1.Visible:=true;

BitBtn2.Visible:=false; str:=’ ’;

seek(F,l);

while not eof(F) do begin read (F,Buf); for i:-l to n do begin

k:=ord(Buf[i])-ord(TableCode[i]); if k=10 then begin Memo1.Lines.Add(str)t str:='';

end else str:=str+chr(k); end; end;

CloseFile(F); end; end.

Следует отметить, что в данной программе происходит управление дос­тупом к Panel1 и кнопке BitBtn2 (отдельно) с помощью свойств visible.

В примере 17 используются два файла: текстовый - inpFil. txt и типи­зированный - outFil. dat. Для работы с этими файлами введены три фай­ловые переменные. Текстовый файл открывается как стандартный текстовый для корректировки и просмотра и как файл без типа, чтобы посимвольно прочитать информацию и закодировать ее. Для кодирования введена пере­менная к типа Byte. Обратить внимание, что при сложении, возможно, мо­жет получиться значение, выходящее за пределы диапазона этого типа, т.е. более 255. Однако перекодирование происходит корректно, так как при вы­читании также происходит выход за пределы диапазона и прежнее число восстанавливается (полезно поэксперементировать с подобными способами сложения и вычитания, используя отдельную программу). При добавлении


 




или занесении новой информации через компонент Memo необходимо в конце текста обязательно набирать Enter.

УКАЗАТЕЛИ

Как было отмечено выше, переменные могут располагаться или в стати­ческой или в динамической памяти. В первом случае под них выделяется вполне определенный объем памяти и связи между программными элемен­тами устанавливаются на этапе компиляции и компоновки программы. Во втором случае память выделяется на этапе выполнения программы. Причем она может освобождаться и повторно выделяться. Это позволяет эффективно ее использовать. При этом используется динамическая память - специаль­но выделенная область оперативной памяти - Heap (куча).

К динамическим переменным относятся рассмотренные выше строки и динамические массивы, а также классы. Переменные данного типа называ­ются ссылками. Работа со ссылками, в общем случае, отличается от работы с обычными переменными тем, что необходимо выделять память на каком-то этапе выполнения программы, а затем освобождать ее. Для строк память выделяется автоматически, автоматически строки (почти все типы) и унич­тожаются. Это достигается довольно сложной структурой строки (кроме па­мяти под значение строки выделяется несколько байт для служебных целей). При работе с динамическими массивами приходится иногда (например, при присваивании) учитывать, что это ссылки. Для создания в программе собст­венных динамических переменных введен в язык Object Pascal тип указа­тель. Указателем иногда называют любую динамическую переменную.

Существуют стандартные указатели Pointer и типизированные указатели. Переменная-указатель - это переменная, которая хранит не сами данные, а адрес размещения этих данных. Указатели Pointer - это просто адреса без указания, что по этим адресам записано. Типизированные указатели со­держат в себе еще информацию о типе хранимых данных.

При объявлении типизированного указателя задается базовый тип дан­ных. В этом случае компилятор легко определяет необходимый объем дина­мической памяти, который требуется выделить данному указателю. Объяв­ление типизированного указателя записывается, например, следующим об­разом:

Type Mas=array [1..10] of real;

PtrMas=^Mas; Var P:PtrMas;.


Это же МОЖНО записать ПО-Другому: Var P:^array [1..10] of real;. Здесь объявлен указатель Р, который является физическим носителем адреса расположения одномерного массива из 10 вещественных чисел.

В соответствии с объявлением указателя выделяется всего 4 байта стати­ческой памяти для записи адреса. Для записи данных вначале необходимо выделить динамическую память, ее адрес записать в переменную-указатель и после этого размещать данные. Рассмотрим, как синтаксически это может быть записано. Объявим две переменные: Var Pl:^Integer; D:Integer;. Теперь запишем: New{Pl); Р1^:=5; D:=2+P1^; Dispoae(P1);. Здесь первый оператор выделяет память, второй записывает число 5. Третий вы­полняет сложение с содержимым выделенной динамической памяти. Чет­вертый освобождает занятую память.

Указателю можно присваивать значение nil - пустой адрес, например P1:=nil;.

Для задания значения указателю можно воспользоваться операцией взя­тия адреса, например P1:=@D;. В данном случае показано, что указателю можно присваивать адрес в статической памяти.

Стандартный указатель объявляется, например, так: var pp: Pointer;. Память под этот указатель выделяется с помощью следующей процедуры: GetMem (РР, 20);. Здесь выделено 20 байт динамической памяти. Эту про­цедуру можно использовать и для выделения памяти под типизированные указатели, например, для объявленного выше указателя Р: GetMem (P, SizeOf (Mas));. Функция sizeOf (T) используется для указания размера базового типа для переменной-указателя, здесь т - базовый тип данных. Ес­ли память выделена процедурой GetMem(<указатель>, Size), то для ос­вобождения памяти используется процедура FreeMem (<указатель>, Size). Например, FreeMem(p, SizeOf (Mas));.

К указателям применимы две операции сравнения: "равно" и "не равно". Возможно присваивание их друг другу, например, если объявлено: Var Pl, Р2: ^double; РЗ: Pointer;, то возможны присваивания: Р2:=Р1; или РЗ:=Р2;. Нельзя присваивать Р2:=РЗ, так как переменная Р2 требует зада­ния базового типа, а РЗ его не имеет. Присваивание РЗ: =Р2 происходит с потерей информации о базовом типе.

Для проверки значения указателя на неравенство nil можно использо­вать функцию Assigned (<указатель>). Эта функция возвращает true, если значение указателя не равно nil. В модулях System и SysUtils размещены различные стандартные подпрограммы работы с указателями и динамиче­ской памятью.

Рассмотрим, каков синтаксис присваивания значений элементам массива Р, объявленного выше: New (р),- ра[1]:=6.7; ра[2]:=-3.5; ит.д.

По окончании работы с массивом занятую память нужно освободить: Dispose (P);.


 


ПРИМЕР ПРИЛОЖЕНИЯ 18

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

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

Рис. 39

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

unit priml8; interface


uses Windows, Messages, SysUtils, Classes,Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons, ComCtrls, ExtCtrls;




Поделиться с друзьями:


Дата добавления: 2014-12-29; Просмотров: 446; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.021 сек.