|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Объединение EditLetNum и AlignEdit
Здравствуйте, уважаемые! Нужна ваша помощь в таком деле: есть два компонента на основе TEdit - первый EditLetNum дает возможность вводить в поле только цифры либо только буквы. Второй выравнивает текст по центру, либо по краям. Нужно объединить два этих компонента в один, который бы обладал всеми заданными свойствами.
EditLetNum: Код:
unit EditLetNum; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TEditLetNum = Class(TEdit) private {private declarations} FClear:TNotifyEvent;{Поля события OnClear} FEnableNum:boolean; FenableLet:boolean; FModified:boolean; protected {protected declarations} procedure SetEnableNum(Value:boolean);{Процедура записи} procedure SetEnableLet(Value:boolean);{Процедура записи} procedure KeyPress(var Key:Char);override; public {public declarations} property Modified:boolean read FModified default true; constructor create(AOwner:TComponent);override;{Конструктор} procedure Clear;override; published {published declarations} property OnClear:TNotifyEvent read FClear write FClear;{событие} property EnableNum:boolean read FEnableNum write SetEnableNum default true; property EnableLet:boolean read FEnableLet write SetEnableLet default true; end; procedure Register; implementation procedure TEditLetNum.SetEnableNum(Value:boolean); begin FEnableNum:=Value; {Присвоение значения полю FEnableNum} {Если значения FEnableNum и FEnableLet =false, то полю FenableLet присваевается true} if (not Value) then if (not FEnableLet) then FEnableLet:=true; end; procedure TEditLetNum.SetEnableLet(Value:boolean); begin FEnableLet :=Value;{присвоение значения полю FEnableLet} {Если значения FEnableNum и FEnableLet=false, то полю FEnableNum присваевается true} if (not Value) then if (not FEnableNum) then FEnableNum:=true; end; procedure Register; begin RegisterComponents('MyComponents',[TEditLetNum]); end; constructor TEditLetNum.create(AOwner:TComponent); begin inherited create(AOwner);{Вызов конструктора класса родителя} FEnableNum:=True; FenableLet:=True; FModified:=False; end; procedure TEditLetNum.KeyPress(var Key:Char); begin if (not FEnableNum) and (Key in ['0'..'9']) then Key:=#0; if (not FenableLet) and not (Key in ['0'..'9']) then Key:=#0; if (Key<>#0) then FModified:=true; inherited KeyPress(Key); end; procedure TEditLetNum.Clear; begin {Вызов обработчика пользователя} if assigned(FClear) then OnClear(Self); {Вызов родительского метода} inherited Clear; FModified:=false; end; end. AlignEdit Код:
unit AlignEdit; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TAlign = (eaLeft, eaCenter, eaRight); TAlignEdit = class(TEdit) private { Private-Deklarationen } FAlign: TAlign; procedure SetAlign(const Value: TAlign); protected { Protected-Deklarationen } procedure CreateParams(var Params: TCreateParams); override; public { Public-Deklarationen } constructor Create(AOwner: TComponent); override; published { Published-Deklarationen } property Alignment: TAlign read FAlign write SetAlign default eaLeft; end; procedure Register; implementation constructor TAlignEdit.Create(Aowner: TComponent); begin inherited Create(AOwner); FAlign := eaLeft; end; procedure TAlignEdit.SetAlign(const Value: TAlign); begin if FAlign <> Value then begin FAlign := Value; RecreateWnd; end; end; procedure TAlignEdit.CreateParams(var Params: TCreateParams); begin inherited; case FAlign of eaLeft: Params.Style := Params.Style or ES_LEFT; eaCenter: Params.Style := Params.Style or ES_CENTER; eaRight: Params.Style := Params.Style or ES_RIGHT; end; end; procedure Register; begin RegisterComponents('MyComponents', [TAlignEdit]); end; end. буду благодарен за любую помощь. Последний раз редактировалось lmikle, 24.11.2012 в 08:57. |
#2
|
|||
|
|||
Ну, не вижу каких-то особых проблем. Просто перенеси код из второго компонента, который с выравниванием, в первый. На первый взгляд код вполне совместим и не должен мешать друг другу.
|
#3
|
|||
|
|||
lmikle
Объединил. Но в одной процедуре (выделена красным) возникает ошибка "незадекларированный идентификатор" вот код:
unit EditLetNum; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TEditAlignment=(eaLeft, eaCenter, eaRight); TEditLetNum = Class(TEdit) private {private declarations} FClear:TNotifyEvent;{Поля события OnClear} FEnableNum:boolean; FenableLet:boolean; FModified:boolean; FAlignment: TEditAlignment; protected {protected declarations} procedure SetAlignment (value: TEditAlignment); procedure SetEnableNum(Value:boolean);{Процедура записи} procedure SetEnableLet(Value:boolean);{Процедура записи} procedure KeyPress(var Key:Char);override; public {public declarations} property Modified:boolean read FModified default true; constructor create(AOwner:TComponent);override;{Конструктор} procedure Clear;override; published {published declarations} property Alignment: TEditAlignment read FAlignment write SetAlignment; property OnClear:TNotifyEvent read FClear write FClear;{событие} property EnableNum:boolean read FEnableNum write SetEnableNum default true; property EnableLet:boolean read FEnableLet write SetEnableLet default true; end; procedure Register; implementation procedure TEditLetNum.SetEnableNum(Value:boolean); begin FEnableNum:=Value; {Присвоение значения полю FEnableNum} {Если значения FEnableNum и FEnableLet =false, то полю FenableLet присваевается true} if (not Value) then if (not FEnableLet) then FEnableLet:=true; end; procedure TEditLetNum.SetEnableLet(Value:boolean); begin FEnableLet :=Value;{присвоение значения полю FEnableLet} {Если значения FEnableNum и FEnableLet=false, то полю FEnableNum присваевается true} if (not Value) then if (not FEnableNum) then FEnableNum:=true; end; procedure Register; begin RegisterComponents('MyComponents',[TEditLetNum]); end; constructor TEditLetNum.create(AOwner:TComponent); begin inherited create(AOwner);{Вызов конструктора класса родителя} FEnableNum:=True; FenableLet:=True; FModified:=False; end; procedure TEditLetNum.CreateParams(var Params:TCreateParams); begin inherited; Case FAlignment of eaLeft:Params.Style:=Params.Style or ES_LEFT; eaCenter: Params.Style:=Params.Style or ES_CENTER; eaRight:Params.Style:=Params.Style or ES_RIGHT; end; procedure TEditLetNum.SetAlignment(value:TEditAlignment); begin if FAlignment<> Value then begin FAlignment:=Value; end;RecreateWnd; end; procedure TEditLetNum.KeyPress(var Key:Char); begin if (not FEnableNum) and (Key in ['0'..'9']) then Key:=#0; if (not FenableLet) and not (Key in ['0'..'9']) then Key:=#0; if (Key<>#0) then FModified:=true; inherited KeyPress(Key); end; procedure TEditLetNum.Clear; begin {Вызов обработчика пользователя} if assigned(FClear) then OnClear(Self); {Вызов родительского метода} inherited Clear; FModified:=false; end; end. Последний раз редактировалось Rabid Coyote, 24.11.2012 в 10:44. |
#4
|
||||
|
||||
Добавьте вот это:
Код:
protected { Protected-Deklarationen } procedure CreateParams(var Params: TCreateParams); override; |
Этот пользователь сказал Спасибо sariman за это полезное сообщение: | ||
Rabid Coyote (24.11.2012)
|
#5
|
|||
|
|||
Sariman, спасибо!
|