КАТЕГОРИИ: Архитектура-(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; Просмотров: 473; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |