Имена (Name) пунктов меню в программе. — КиберПедия 

Поперечные профили набережных и береговой полосы: На городских территориях берегоукрепление проектируют с учетом технических и экономических требований, но особое значение придают эстетическим...

Папиллярные узоры пальцев рук - маркер спортивных способностей: дерматоглифические признаки формируются на 3-5 месяце беременности, не изменяются в течение жизни...

Имена (Name) пунктов меню в программе.

2017-06-02 246
Имена (Name) пунктов меню в программе. 0.00 из 5.00 0 оценок
Заказать работу

MainFile CodeFile InfoCompare ExitPoint
       
NewFile CodeTabl    
AddFile InfoCode    
ReadFile      

 

С активизацией меню связано событие OnClick. Данное событие выполняется, когда пользователь, выбирает какой либо пункт меню. К каждому пункту меню необходимо привязать свой обработчик. Для придания меню более привлекательного вида можно добавлять разделительные полосы (достаточно задать одним символом минус “-“). При проектировании меню с помощью редактора меню (рис. 37) необходимо выбрать имена (свойство Name) пунктам меню (табл. 14).

 

Рис. 37 Редактор меню.

В пункте меню можно назначить быструю клавишу, для этого перед каким-либо символом нужно поставить символ &, например &Close, и можно вызывать пункт меню в данном случае с помощью Alt + C (первая буква слова Close). Пункту меню можно назначить горячую клавишу, тогда в любое время можно выполнить данный пункт меню. Для этого нужно воспользоваться свойством ShortCut. Пункт меню можно сделать недоступным, если в процессе выполнения свойству Enabled задать false. С помощью Visible можно скрыть любой пункт меню или подменю. Свойство Checked, позволяет отмечать флажком последний выбранный пункт меню.

Форма примера 17 приводится на рис. 38.

 

Рис. 38 Форма к примеру 17.

Справа на компоненте Memo1 формы примера 17 находится изображение компонента MainMenu1, которое будет невидимым при выполнении программы. Ниже приводится программный код примера.

unit Prim17;

Interface

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='Ошибка открытия файла';

Type TTableCode=array [1..n] of char;

var MainForm: TMainForm;

TableCode:TTableCode;

T: TextFile;

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,'Inpfil.txt');

reset(T);

{$I+}

if IOResult<>0 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:=1 to n do

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

Panel1.Visible:=true;

BitBtn2.Visible:=false;

str:='';

for i:=1 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

{$I-}

AssignFile(F,'Outfil.dat');

rewrite(F);

if IOResult<>0 then begin

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

exit;

end;

AssignFile(FNoType,'Inpfil.txt');

reset(FNoType,1);

{$I+}

if IOResult<>0 then begin

MessageDlg(sText,mtError,[mbOk],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:=1 to n do begin

if i<=res then begin

k:=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;

k: byte;

begin

{$I-}

AssignFile(F,'Outfil.dat');

reset(F);

{$I+}

if IOResult<>0 then begin

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

exit;

end;

Panel1.Visible:=true;

BitBtn2.Visible:=false;

str:='';

seek(F,1);

while not eof(F) do begin

read(F,Buf);

for i:=1 to n do begin

k:=ord(Buf[i])-ord(TableCode[i]);

if k=10 then begin

Memo1.Lines.Add(str);

str:='';

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

end;

end;

CloseFile(F);

end;

End.

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

В примере 17 используются два файла: текстовый - InpFil.txt и типизированный - OutFil.dat. Для работы с этими файлами введены три файловые переменные. Текстовый файл открывается как стандартный текстовый для корректировки и просмотра и как файл без типа, чтобы посимвольно прочитать информацию и закодировать её. Для кодирования введена переменная k типа 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;

Здесь объявлен указатель P, который является физическим носителем адреса расположения одномерного массива из 10 вещественных чисел.

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

Var P1: ^Integer; D: Integer;

Теперь запишем:

New(P1); P1^:=5; D:=2+P1^; Dispose(P1);

Здесь первый оператор выделяет память, второй записывает число 5. Третий выполняет сложение с содержимым выделенной динамической памяти. Четвёртый освобождает занятую память.

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

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

В данном случае показано, что указателю можно присваивать адрес в статической памяти.

Стандартный указатель объявляется, например, так:

Var PP:Pointer;

Память под этот указатель выделяется с помощью следующей процедуры: GetMem(PP, 20);

Здесь выделено 20 байт динамической памяти. Эту процедуру можно использовать и для выделения памяти под типизированные указатели, например, для объявленного выше указателя P:

GetMem(P, SizeOf(Mas));

Функция SizeOf(T) используется для указания размера базового типа для переменной-указателя, здесь T – базовый тип данных. Если память выделена процедурой GetMem(<указатель>, Size), то для освобождения памяти используется процедура FreeMem(<указатель>, Size). Например, FreeMem(P, SizeOf(Mas));

К указателям применимы две операции сравнения равно и не равно. Возможно присваивание их друг другу, например, если объявлено:

Var P1, P2: ^double; P3: Pointer;

то возможны присваивания: P2:=P1; или P3:=P2;

Нельзя присваивать P2:=P3, так как переменная P2 требует задания базового типа, а P3 его не имеет. Присваивание P3:=P2 происходит с потерей информации о базовом типе.

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

Рассмотрим, каков синтаксис присваивания значений элементам массива P, объявленного выше.

New(P); P^[1]:=6.7; P^[2]:=-3.5; и т.д.

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

 

ПРИМЕР 18

 

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

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

 

Рис. 39 Форма свариантом расчета примера 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.

 


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

Папиллярные узоры пальцев рук - маркер спортивных способностей: дерматоглифические признаки формируются на 3-5 месяце беременности, не изменяются в течение жизни...

Механическое удерживание земляных масс: Механическое удерживание земляных масс на склоне обеспечивают контрфорсными сооружениями различных конструкций...

Историки об Елизавете Петровне: Елизавета попала между двумя встречными культурными течениями, воспитывалась среди новых европейских веяний и преданий...

Состав сооружений: решетки и песколовки: Решетки – это первое устройство в схеме очистных сооружений. Они представляют...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.007 с.