![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
|
|
#1
|
|||
|
|||
|
Здравствуйте, уважаемые!
Нужна ваша помощь в таком деле: есть два компонента на основе 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
|
|||
|
|||
|
Объединил. Но в одной процедуре (выделена красным) возникает ошибка "незадекларированный идентификатор" вот код:
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, спасибо!
![]() |