Автор: Пользователь скрыл имя, 11 Октября 2011 в 14:17, лабораторная работа
Цель:
Изучение способа расширения существующего компонента.
Задания:
Расширить модуль, созданный ранее (лаб. работа 1, зад. 1), добавив две кнопки “ОК” и “Cancel”. Примечание: Конструктор для свойства “ОК” устанавливает его в значение Default – не путайте с одноименной директивой – в True и ModalResult в MrOk. Конструктор для свойства “Cancel” устанавливает его в значение True и ModalResult в MrCancel.
Расширить модуль, созданный ранее (лаб. работа 1, зад. 2), добавив маску для ввода значений только определенного формата.
Расширить модуль, созданный ранее (лаб. работа 1, зад. 3), добавив свойство, позволяющее отражать цифрой положение указателя (включать и отключать цифру).
Министерство образования и науки РФ
ГОУ ВПО Череповецкий государственный университет
Институт
информационных технологий
Кафедра: ПО ВТ и ИС
Дисциплина: Компонентное программирование
Лабораторная работа №2
Выполнил: студент
группы 1ПО-51
Фарутин Е.В.
Проверил: преподаватель
Сивков Н.Е.
Череповец, 2011 год.
Цель:
Изучение
способа расширения существующего компонента.
Задания:
Код:
unit All_2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;
type
TKind=(Ok, Cancel);
TButton2 = class(TButton)
private
protected
KindV: TKind;
function GetKindV: TKind;
procedure SetKindV(Value: TKind);
public
Constructor Create(AOwner:TComponent );override;
published
property Kind: TKind read GetKindV write SetKindV default Ok;
end;
type
TEdit2 = class(TEdit)
private
protected
public
Constructor Create(AOwner:TComponent );override;
procedure KeyPress(var Key:char); override;
published
end;
type
TScrollBar2 = class(TScrollBar)
private
protected
public
label_n: tlabel;
procedure Change; override;
Constructor Create(AOwner:TComponent );override;
published
end;
type
TCustomPanel2 = class(TCustomPanel)
private
protected
public
label_n: tlabel;
scroll_n: tscrollbar;
edit_n: tedit;
Constructor Create(AOwner:TComponent );override;
procedure WMSize(var Message:Tmessage); message WM_SIZE;
procedure Change(Sender:TObject);
published
end;
procedure Register;
implementation
function TButton2.GetKindV: TKind;
begin
result := KindV;
end;
procedure TButton2.SetKindV(Value: TKind);
begin
KindV:=Value;
if KindV=Ok then
begin
Default:=True;
ModalResult:=mrOk;
Cancel:=False;
Caption:='Ok';
end
else
begin
Cancel:=True;
ModalResult:=mrCancel;
Default:=false;
Caption:='Cancel';
end;
end;
Constructor TButton2.Create(AOwner:
Begin
inherited Create(AOwner);
Height:=40;
Width:=100;
SetKindV(Ok);
end;
Constructor TEdit2.Create(AOwner:
Begin
inherited Create(AOwner);
Font.Style:=[fsStrikeOut];
Font.Color:=clRed;
Font.Name:='Times New Roman';
Height:=20;
Width:=100;
Font.Size:=20;
end;
Constructor TScrollBar2.Create(AOwner:
Begin
inherited Create(AOwner);
Width:=100;
Height:=40;
Position:=trunc((Max-Min)/2);
label_n:=tlabel.Create(AOwner)
label_n.Parent:=parent;
label_n.name:='label_n';
label_n.Left:=Left;
label_n.Top:=Top-trunc(Height/
label_n.Visible:=true;
label_n.caption:=inttostr(
end;
procedure TScrollBar2.Change;
begin
inherited Change;
label_n.caption:=inttostr(
end;
procedure Register;
begin
RegisterComponents('Samples', [TButton2]);
RegisterComponents('Samples', [TEdit2]);
RegisterComponents('Samples', [TScrollBar2]);
RegisterComponents('Samples', [TCustomPanel2]);
end;
Constructor TCustomPanel2.Create(AOwner:
Begin
inherited Create(AOwner);
scroll_n:=TScrollBar.Create(
scroll_n.Parent:=Self;
scroll_n.Width:=100;
scroll_n.Height:=50;
scroll_n.Left:=0;
scroll_n.Top:=20;
scroll_n.Position:=trunc((
Height:=70;
label_n:=TLabel.Create(Self);
label_n.Parent:=Self;
label_n.Left:=scroll_n.Left;
label_n.Top:=Height-scroll_n.
label_n.Visible:=true;
label_n.caption:=inttostr(
scroll_n.OnChange:=Change;
caption:='';
end;
procedure TCustomPanel2.Change(Sender:
begin
label_n.caption:=inttostr(
end;
procedure TCustomPanel2.WMSize(var Message:TMessage);
begin
inherited;
scroll_n.Width:=Width;
if Height<70 then
begin
scroll_n.Height:=(Height-20);
scroll_n.Top:=20;
label_n.Top:=Height-scroll_n.
end
else
begin
scroll_n.Height:=Height-20;
scroll_n.Top:=20;
label_n.Top:=Height-scroll_n.
end;
end;
procedure TEdit2.KeyPress(var Key: Char);
begin
inherited;
if Key in ['0'..'9'] then Key:=Key
else Key:=#0;
end;
end.
Пример:
Контрольные вопросы:
Создание файла модуля осуществляется выбором элемента меню File/New Unit. Работа по созданию компонента разбивается на четыре основные задачи:
1. Определение раздела модуля компонента – Uses.
2. Объявление класса компонента.
3. Реализация методов компонента.
4. Написание процедуры Register.
Добавляемые к компоненту классы переопределяют свои конструкторы и соответствующие значения свойств.
В раздел реализации помещается процедура Register, которая используется во время установки созданного программистом компонента на указанную вкладку палитры компонентов Delphi для регистрации нового класса. Например, так:
procedure Register;
begin
RegisterComponents('Samples', [TButton2]);
RegisterComponents('Samples', [TEdit2]);
RegisterComponents('Samples', [TScrollBar2]);
RegisterComponents('Samples', [TCustomPanel2]);
end;
Указывается вкладка, на которую будет помещен компонент и имя класса этого компонента.
Раздел uses должен, по меньшей мере, содержать модуль Classes и обычно включают модули Controls и Forms. Если компонент происходит от существующего визуального компонента, то модуль, где этот компонент объявлен, также включается. Другие часто используемые модули – это Messages, WinTypes, WinProcs, Graphics и SysUtils. Для задания 1 добавляется модуль StdCtrls, который содержит объявление класса TButton, поскольку новый компонент будет прямым потомком данного класса. Раздел модуля компонента Uses можно заполнять большим количеством модулей, чем требуется для компиляции, так как добавление лишних модулей не приводит к перерасходу ресурсов.