Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
методическое пособие для самостоятельных работ.doc
Скачиваний:
37
Добавлен:
16.11.2019
Размер:
2.89 Mб
Скачать

3.2.20. TActionMainMenuBar - полоса меню для действий

Компонент служит настраиваемым контейнером для размещения связанных с действиями опций меню. Опции-заголовки размещаются “перетаскиванием” из окна менеджера действий категорий.

Большое количество свойств компонента связаны с динамически создаваемыми внутренними объектами, имеющими, в свою очередь, множество свойств (методов и событий). За подробной информацией о свойствах компонента и связанных с ними классами обратитесь к справочной службе. Компонент имеет свойство

property ActionClient: TActionClient;

Свойство Visible класса TActionClient управляет видимостью полосы. Для компонента TActionMainMenuBar (в отличае от TActionToolBar) это свойство не может иметь значение False (независимо от количества компонентов на форме). Иными словами, программа не может “спрятать” полосы главного меню.

3.2.21. TActionTollBar - полоса кнопок для действий

Компонент служит настраиваемым контейнером для связанных с действиями инструментальных кнопок. Кнопки реализуются техникой “перетаскивания” действий из окна менеджера действий.

Большое количество свойств компонента связано с динамически создаваемыми внутренними объектами, имеющими, в свою очередь, множество свойств (методов и событий).

3.2.22. TCustomizeDIg - диалог настройки интерфейса

Этот компонент служит для активизации окна менеджера действий. Для этого у него имеется единственный метод

procedure Show;

Свойство

property ActionManager: TCustomActionManager;

определяет экземпляр менеджера действий, окно которого нужно активизировать. Поскольку это окно не модальное, оно может перекрываться другими окнами. Если в свойство компонента

property StayOnTop: Boolean;

установить True, окно менеджера действий всегда будет располагаться поверх других окон.

Для вызова метода Show проще всего использовать дополнительное меню контейнера опций или кнопок. Например:

procedure TFormI.NIClick(Sender: TObject);

begin

CustomizeDlgl.Show

end;

Контрольные вопросы

  1. Какой компонент определяет раму - контейнер для размещения других компонентов?

  2. Какой класс устанавливает все необходимые свойства и методы для полос прокрутки?

  3. Какие действия следует произвести для создания разветвленных меню, т. е. таких, у которых подопции вызывают новые списки подопций?

  4. Как связываются с опциями меню небольшие изображения?

  5. Для чего предназначены компоненты класса TLabel (метка)?

  6. Какие действия можно производить с помощью компонента класса TEdit?

  7. Какой компонент предназначен для ввода, редактирования и/или отображения достаточно длинного текста?

  8. В каком обработчике события реализуется связанный с кнопкой TButton алгоритм управления программами?

  9. Для чего используется независимый переключатель TCheckBox?

  10. Какой компонент реализует выбор одного из нескольких взаимоисключающих решений?

  11. Комбинацию каких компонентов представляет собой комбинированный список TComboBox?

  12. Перечислите основные свойства компонента класса TRadioGroup.

  13. Для чего можно использовать свойство Caption компонента TPanel?

  14. Что определяется свойством Glyph TBitBtn?

  15. Чем отличаются кнопки TSpeedButton от TBitBtn?

  16. Каким свойством задается шаблон текста вводимого в специализированный редактор TMaskEdit?

  17. Какой компонент предназначен для создания таблиц, в ячейках которых располагаются произвольные текстовые строки?

  18. Какие возможности предоставляет программисту компонент TDrawGrid?

  19. Для чего используется компонент TImage?

  20. Перечислите множество простейших геометрических фигур, которые может рисовать компонент TShape.

  21. Для чего предназначен компонент класса TBevel?

  22. Какой компонент предназначен для ручного (с помощью мыши) управления размерами контейнеров TPanel1, TGroupBox или подобных им во время прогона программы?

  23. Какой компонент предназначен для графического представления числовых данных?

Примеры составления программ

  1. Иллюстрация работы со списком TList.

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls, Buttons, ExtCtrls;

type

TfmExample = class(TForm)

Panel1: TPanel;

bbRun: TBitBtn;

bbCancel: TBitBtn;

edInput: TEdit;

mmOutput: TMemo;

lbOutput: TLabel;

procedure bbRunClick(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

fmExample: TfmExample;

implementation

{$R *.dfm}

type

PDouble = ^Double;

Function Comp(Item1, Item2: Pointer): Integer;

// С помощью этой функции реализуется сортировка чисел

begin

if PDouble(Item1)^ < PDouble(Item2)^ then

Result := -1

else if PDouble(Item1)^ > PDouble(Item2)^ then

Result := 1

else

Result := 0

end;

procedure TfmExample.bbRunClick(Sender: TObject);

// Обработчик нажатий кнопки bbRun выполняет основную работу

var

k: Integer;

List: TList;

pD: PDouble;

begin

List := TList.Create; // Создаем список

for k := 1 to 20 do // Наполняем его

begin

New(pD); // Резервируем память

pD^ := Random; // Помещаем в нее случайное число

List.Add(pD); // Добавляем к списку

end;

List.Sort(Comp); // Сортируем список по возрастанию

mmOutput.Lines.Clear; { Очищаем редактор mmOutput. В следующем цикле наполняем mmOutput и уничтожаем элементы List }

for k := 0 to List.Count-1 do

begin

pD := List[k]; // Очередное число из списка

mmOutput.Lines.Add(FloatToStr(pD^)); // Помещаем в mmOutput

Dispose(pD) // Уничтожаем число

end;

List.Free; // Уничтожаем список

end;

end.

  1. Проверка емкости TEdit

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

StdCtrls, Buttons, ExtCtrls;

type

TfmExample = class(TForm)

Panel1: TPanel;

bbRun: TBitBtn;

bbClose: TBitBtn;

edInput: TEdit;

lbOutput: TLabel;

mmOutput: TMemo;

procedure FormActivate(Sender: TObject);

procedure bbRunClick(Sender: TObject);

procedure edInputEnter(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

fmExample: TfmExample;

implementation

{$R *.DFM}

procedure TfmExample.FormActivate(Sender: TObject);

begin

edInput.SetFocus

end;

procedure TfmExample.bbRunClick(Sender: TObject);

var

MaxLength, k: Integer;

S: String;

begin

if edInput.Text='' then

Exit;

try

MaxLength := StrToInt(edInput.Text)

except

Exit

end;

S := '';

for k := 1 to MaxLength do

S := S+'0';

edInput.Text := S;

lbOutput.Caption := 'Длина свойства Text = '+IntToStr(Length(edInput.Text));

mmOutput.SetFocus

end;

procedure TfmExample.edInputEnter(Sender: TObject);

begin

edInput.Text := ''

end;

end.

  1. Проверка емкости TMemo

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

StdCtrls, Buttons, ExtCtrls;

type

TfmExample = class(TForm)

Panel1: TPanel;

bbRun: TBitBtn;

bbClose: TBitBtn;

edInput: TEdit;

lbOutput: TLabel;

mmOutput: TMemo;

procedure bbRunClick(Sender: TObject);

procedure FormActivate(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

fmExample: TfmExample;

implementation

{$R *.DFM}

procedure TfmExample.bbRunClick(Sender: TObject);

var

k, MaxLines: Integer;

S: String;

begin

if edInput.Text='' then

Exit;

try

MaxLines := StrToInt(edInput.Text);

except

MaxLines := 3000;

edInput.Text := '3000'

end;

mmOutput.Lines.Clear;

mmOutput.Hide;

Screen.Cursor := crHourGlass;

for k := 1 to MaxLines do

begin

S := IntToStr(k);

while Length(S)<14 do

S := '0'+S;

mmOutput.Lines.Add(S)

end;

mmOutPut.Show;

Screen.Cursor := crDefault;

lbOutPut.Caption := 'Длина Text = '+IntToStr(Length(mmOutput.Text))

end;

procedure TfmExample.FormActivate(Sender: TObject);

begin

edInput.SetFocus

end;

end.

  1. Демонстрация компонента DrawGrid

unit DrawGridMain;

interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

Grids;

type

TfmDrawGrid = class(TForm)

dgDraw: TDrawGrid;

procedure FormCreate(Sender: TObject);

procedure dgDrawGetEditText(Sender: TObject; ACol, ARow: Integer;

var Value: String);

procedure dgDrawSetEditText(Sender: TObject; ACol, ARow: Integer;

const Value: String);

procedure dgDrawDrawCell(Sender: TObject; ACol, ARow: Integer;

Rect: TRect; State: TGridDrawState);

procedure FormResize(Sender: TObject);

procedure FormDeactivate(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

slBitMap: TStringList;

end;

var

fmDrawGrid: TfmDrawGrid;

implementation

{$R *.DFM}

procedure TfmDrawGrid.FormCreate(Sender: TObject);

// Создает и наполняет список slBitMap

const

Bmp_Path = 'C:\Program Files\Common Files\Borland Shared\'+

'Images\Splash\16Color\';

FNames: array [0..3] of String = {Имена файлов с картинками}

('athena.bmp', 'construc.bmp', 'earth.bmp', 'technlgy.bmp');

var

k: Integer;

begin

// Создаем список строк:

slBitMap := TStringList.Create;

// Вставляем в него названия файлов и картинки:

with slBitMap do for k := 0 to 3 do

begin

Add(FNames[k]);

Objects[k] := TBitMap.Create;

(Objects[k] as TBitMap).LoadFromFile(Bmp_Path+FNames[k])

end

end;

procedure TfmDrawGrid.dgDrawGetEditText(Sender: TObject; ACol,

ARow: Integer; var Value: String);

// Передает редактору текст из ячейки

begin

Value := slBitMap[2 * ACol + Arow]

end;

procedure TfmDrawGrid.dgDrawSetEditText(Sender: TObject; ACol,

ARow: Integer; const Value: String);

// Получает текст из редактора и сохраняет его в slBitMap

begin

slBitMap[2 * ACol + ARow] := Value

end;

procedure TfmDrawGrid.dgDrawDrawCell(Sender: TObject; ACol, ARow: Integer;

Rect: TRect; State: TGridDrawState);

// Рисует картинку из slBitMap.Objects и текст из slBitMap

var

k: Integer;

begin

// Пересчитываем координаты ячейки в индекс списка:

k := 2 * ACol + ARow;

with dgDraw.Canvas, Rect, slBitMap do

begin

// Уменьшаем высоту картинки для вывода под ней текста:

Bottom := Bottom - TextHeight('1') - 2;

// Рисуем картинку:

StretchDraw(Rect, (Objects[k] as TBitMap));

// Центрируем текст по горизонтали и выводим его:

TextOut(Left+(Right-Left-TextWidth(slBitMap[k])) div 2,

Bottom + 1, slBitMap[k])

end

end;

procedure TfmDrawGrid.FormResize(Sender: TObject);

// Изменяет размеры ячеек при изменении размеров окна.

// Запас в один пиксель необходим для предотвращения

// автопрокрутки

begin

with dgDraw do

begin

DefaultColWidth := ClientRect.Right div 2 - 1;

DefaultRowHeight := ClientRect.Bottom div 2 - 1

end;

end;

procedure TfmDrawGrid.FormDeactivate(Sender: TObject);

begin

slBitMap.Free

end;

end.

  1. Иллюстрация возиожностей StringGrid

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

Grids, StdCtrls, Buttons, ExtCtrls;

type

TfmStGrid = class(TForm)

Panel1: TPanel;

BitBtn1: TBitBtn;

BitBtn2: TBitBtn;

OpenDialog1: TOpenDialog;

StringGrid1: TStringGrid;

procedure BitBtn1Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

fmStGrid: TfmStGrid;

implementation

{$R *.DFM}

procedure TfmStGrid.BitBtn1Click(Sender: TObject);

Function GetWord(var S: String): String;

{ Вспомогательная функция для выделения очередного слова из строки }

const // Множество символов слова:

Letters: set of Char = ['a'..'z', 'A'..'Z', 'А'..'я'];

begin

Result := '';

{ Уничтожаем в начале строки все символы, не относящиеся к слову }

while (S <> '') and not (S[1] in Letters) do

Delete(S, 1, 1);

// Формируем очередное слово

while (S <> '') and (S[1] in Letters) do

begin

Result := Result + S[1];

Delete(S, 1, 1)

end;

end; //GetWord

var

F: TextFile; // Файл с текстом

S, Word: String; // Вспомогательные строки

NCol, NRow: Integer;// Номер текущей колонки и текущего ряда

Words: TStringList; // Список отсортированных слов из файла

begin

// С помощью стандартного диалога получаем имя файла

if not OpenDialog1.Execute then

Exit; // Пользователь отказался выбрать файл

// Пытаемся открыть файл

AssignFile(F, OpenDialog1.FileName);

try

Reset(F);

except

// Файл нельзя открыть:

ShowMessage('Невозможно открыть файл ' + OpenDialog1.FileName);

Exit;

end;

// Готовим список Words:

Words := TStringList.Create;

Words.Sorted := True; // Сортируем строки

Words.Duplicates := dupIgnore; // Отвергаем дубликаты

// Изменяем курсор перед длительной работой

Screen.Cursor := crHourGlass;

// Читаем файл по строкам

while not EOF(F) do

begin

ReadLn(F, S); // Читаем очередную строку

// Выделяем из строки слова и заносим их в список Words

while S <> '' do

begin

Word := GetWord(S);

if Word <> '' then

Words.Add(Word) // Не вставляем пустые строки

end

end;

Screen.Cursor := crDefault; // Восстанавливаем курсор

CloseFile(F); // Закрываем файл

if Words.Count=0 then

Exit; // Пустой файл – выходим

with StringGrid1 do

begin

NCol := 1; // Номер первого столбца слов

// Цикл формирования таблицы

while Words.Count > 0 do

begin

// Формируем заголовок столбца и начальное значение номера ряда

Cells[NCol, 0] := Words[0][1];

NRow := 0;

// Цикл заполнения очередного столбца

while (Words.Count > 0) and (Words[0][1] = Cells[NCol, 0]) do

begin

inc(NRow); // Номер текущего ряда

if NRow = RowCount then

begin // Расширяем длину таблицы

RowCount := RowCount + 1; {Для свойства RowCount нельзя

использовать функцию инкремента inc!}

Cells[0, NRow] := IntToStr(NRow);

end;

Cells[NCol, NRow] := Words[0];

Words.Delete(0);

end;

// Переходим к следующему столбцу

if Words.Count=0 then

Break; // Кончаем работу, если слов больше нет

inc(NCol); // Переходим к следующей колонке

ColCount := ColCount+1 // Расширяем таблицу справа

// на 1 колонку

end;

end;

end;

end.

  1. Демонстрация компонента TAnimate

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

ComCtrls, ExtCtrls, StdCtrls;

type

TForm1 = class(TForm)

Animate1: TAnimate;

Button1: TButton;

Timer1: TTimer;

ProgressBar1: TProgressBar;

procedure Button1Click(Sender: TObject);

procedure Timer1Timer(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);

begin

Animate1.FileName := 'cool.avi'; // Указываем файл с клипом

Animate1.Active := True; // Запускаем клип

ProgressBar1.Show; // Показываем ProgressBar

Timer1.Enabled := True; // Включаем таймер

end;

procedure TForm1.Timer1Timer(Sender: TObject);

begin

ProgressBar1.Position := ProgressBar1.Position + 1;

if ProgressBar1.Position >= ProgressBar1.Max then

begin

Timer1.Enabled := False; // Выключаем таймер

ProgressBar1.Position := 0; // Готовим новый запуск

ProgressBar1.Hide; // Прячем ProgressBar

Animate1.Stop // Останавливаем клип

end

end;

end.

  1. Демонстрация TComboBoxEx

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, ImgList, StdCtrls, ComCtrls;

type

TForm1 = class(TForm)

ComboBoxEx1: TComboBoxEx;

ImageList1: TImageList;

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

implementation

{$R *.dfm}

end.

Задания для самостоятельного выполнения

  1. Ввести одномерный массив, состоящий из 10 элементов. Значения массива задать функцией Random(R), где R= 10. Вывести сформированный массив на экран в компонент Label1. Найти минимальный элемент массива и его индекс. Результат вывести на экран в компонент Label2. Процедуру выполнения данного задания оформить в событии Button1Click компонента Button1.

  2. Ввести одномерный массив, состоящий из 10 элементов. Значения массива ввести в компонент StringGrid1. Вывести сформированный массив на экран в компонент Label1. Найти среднее арифметическое положительных элементов массива. Результат вывести на экран в компонент Label2. Процедуру выполнения данного задания оформить в событии Button1Click компонента Button1.

  3. Ввести одномерный массив, состоящий из 5 элементов. Значения массива ввести в компонент StringGrid1. Вывести сформированный массив на экран в компонент Label1. Найти сумму положительных элементов массива. Результат вывести на экран в компонент Label2. Процедуру выполнения данного задания оформить в событии Button1Click компонента Button1.

  4. Ввести одномерный массив, состоящий из 8 элементов. Значения массива задать функцией Random(R), где R= 9. Вывести сформированный массив на экран в компонент Label1. Найти максимальный элемент массива и его индекс. Результат вывести на экран в компонент Label2. Процедуру выполнения данного задания оформить в событии Button1Click компонента Button1.

  5. Ввести одномерный массив, состоящий из 6 элементов. Значения массива ввести в компонент StringGrid1. Вывести сформированный массив на экран в компонент Label1. Найти количество положительных элементов массива. Результат вывести на экран в компонент Label2. Процедуру выполнения данного задания оформить в событии Button1Click компонента Button1.

  6. Ввести одномерный массив, состоящий из 9 элементов. Значения массива задать функцией Random(R), где R= 10. Вывести сформированный массив на экран в компонент Label1. Найти минимальный и максимальный элементы массива и их индексы. Результат вывести на экран в компонент Label2. Процедуру выполнения данного задания оформить в событии Button1Click компонента Button1.

  7. Ввести одномерный массив, состоящий из 7 элементов. Значения массива задать функцией Random(R), где R= 8. Вывести сформированный массив на экран в компонент Label1. Найти количество четных элементов массива. Результат вывести на экран в компонент Label2. Процедуру выполнения данного задания оформить в событии Button1Click компонента Button1.

  8. Ввести одномерный массив, состоящий из 6 элементов. Значения массива ввести в компонент StringGrid1. Вывести сформированный массив на экран в компонент Label1. Найти произведение положительных элементов массива. Результат вывести на экран в компонент Label2. Процедуру выполнения данного задания оформить в событии Button1Click компонента Button1.

  9. Ввести одномерный массив, состоящий из 8 элементов. Значения массива задать функцией Random(R), где R= 9. Вывести сформированный массив на экран в компонент Label1. Найти минимальный среди нечетных по значению элементов массива и его индекс. Результат вывести на экран в компонент Label2. Процедуру выполнения данного задания оформить в событии Button1Click компонента Button1.

  10. Ввести одномерный массив, состоящий из 10 элементов. Значения массива задать функцией Random(R), где R= 10. Вывести сформированный массив на экран в компонент Label1. Найти максимальный среди четных по значению элементов массива и его индекс. Результат вывести на экран в компонент Label2. Процедуру выполнения данного задания оформить в событии Button1Click компонента Button1.

  11. Задать двумерный массив (матрицу) 5х6 целочисленных значений функцией RANDOM(10). Вывести сформированный массив в компонент STRINGGRID1. Найти минимальный элемент MIN и его индексы IMIN, JMIN. Вывести полученный результат в поле компонента LABEL1. Процедуру выполнения данного задания оформить в событии ONCLICK компонента BUTTON1

  12. Задать двумерный массив (матрицу) 4х4 целочисленных значений в компоненте STRINGGRID1.Найти среднее арифметическое каждой строки матрицы. Результат вывести в компонент LABEL1. Процедуру выполнения данного задания оформить в событии ONCLICK компонента BUTTON1.

  13. Задать двумерный массив (матрицу)4х5 целочисленных значений функцией RANDOM(9). Вывести сформированный массив в компонент STRINGGRID1. Найти количество четных по значению элементов массива. Вывести полученный результат в поле компонента LABEL1. Процедуру выполнения данного задания оформить в событии ONCLICK компонента BUTTON1.

  14. Задать двумерный массив (матрицу)5х5 целочисленных значений в компоненте STRINGGRID1. Найти среднее арифметическое положительных элементов каждой строки матрицы. Результат вывести в компонент LABEL1. Процедуру выполнения данного задания оформить в событии ONCLICK компонента BUTTON1.

  15. Задать двумерный массив (матрицу)5х6 целочисленных значений функцией RANDOM(7). Вывести сформированный массив в компонент STRINGGRID1. Найти количество нечетных по значению элементов матрицы. Вывести полученный результат в поле компонента LABEL1. Процедуру выполнения данного задания оформить в событии ONCLICK компонента BUTTON1.

  16. Задать двумерный массив (матрицу)6х6 целочисленных значений в компоненте STRINGGRID1. Найти среднее арифметическое положительных элементов каждого столбца матрицы. Результат вывести в компонент LABEL1. Процедуру выполнения данного задания оформить в событии ONCLICK компонента BUTTON1.