Часть полного текста документа:Созание компоненты Вы часто используете в своих программах одни и те же куски кода для обработки стандартных компонент? Если да, то вам стоит прочитать эту статью. Здесь мы рассмотрим основы создания компоненты, и в качестве примера создадим одну простую компоненту. Для начала нужно определиться, какую компоненту будем создавть. Для примера сделаем компоненту на базе стандартной компоненты дельфи TEdit. Эта компонента будет представлять собой поле ввода, в которое можно будет ввести только число с возможностью ввода одного знака "минус" в начале числа. Пусть компонента будет называться TNEdit. Создайте отдельную папку для компоненты. Для начала создания новой компоненты запустите дельфи и выбирите из меню Component команду New Component. В появившемся окне в поле Ancestor Type впишите TEdit [StdCtrls] (или можно выбрать из ниспадающего списка). В поле Class Name нужно вписать имя класса компоненты - TNEdit. Из списка Palette Page выберите существущюю вкладку палитры компонент, либо введите свое название вкладки (она будет создана), где будет размещаться наша компонента. В поле Unit file name введите путь до папки, где будут размещаться модуль компоненты. Все. Жмите Ok (не Install!!!) и к текущему проекту добавится сгенерированная дельфи заготовка модуля компоненты. Редактируем шаблон Тут я просто приведу текст шаблона, к какому виду его нужно привести. А в конце кода опишу все изменения. unit NEdit1; interface uses Windows, Messages, SysUtils, Classes, Controls, StdCtrls; type TNEdit1 = class(TEdit) private EditNumber : single; function getNum : single; procedure setNum(val : single); protected procedure KeyPress(var Key : Char); override; public { Public declarations } published Constructor Create(AOwner : TComponent); override; property Num : single read getNum write setNum; end; procedure Register; implementation procedure Register; begin RegisterComponents('Samples', [TNEdit1]); end; constructor TNEdit1.Create(AOwner : TComponent); begin inherited Create(AOwner); end; function TNEdit1.getNum : Single; begin try Result := StrToFloat(text); except begin Result := 0; text := ''; end; end; end; procedure TNEdit1.setNum(val: Single); begin EditNumber:=val; text:=FloatToStr(val); end; procedure TNEdit1.KeyPress(var key:char); begin case key of '0'..'9', #13, #8: ; '-' : if Length(text)0 then key := #0; else if not ((key=DecimalSeparator)and(pos(DecimalSeparator,text)=0)) then Key:=#0; end; inherited KeyPress(key); end; end. Компонента реагирует на нажатие пользователем клавиши в поле ввода процедурой TNEdit.KeyPress. Eю мы заменили соответствующюю процедуру базового класса. В качестве параметра процедуре передается нажатая клавиша (вернее её код). Перед выводом в рабочую область числа мы проверяем это число. Если оно не содержит цифру, код клавиш Enter и Backspace, или вводится минус в середине числа, либо вводится второй разделитель(.), то соответствующему коду клавиши присваевается #0 и символ не выводится в рабочюю область. ............ |