2013-07-31 3 views
2

Я использовал VBto в качестве отправной точки и много изучил руководство пользователя Delphi 6. Я могу сделать свой новый компонент компиляцией, но я не могу понять, как его отобразить, поэтому я могу закончить его отладку. И 50-летний опыт программирования не помогает. Вот внутренности моего компонента:Создание компонентов Delphi .. Начало за пределами базы

type 

TChangeEvent = procedure(Sender: TObject; v: String) of object; 
TTxtSpnr = class(TWinControl) 
    Lbl: TLabel; 
    Txt: TEdit; 
    Scrll: TScrollBar; 
private 
    FonChange: TChangeEvent; 
    busy, tweaked: Boolean; 
    NewValue: String; 
protected 
    procedure Changed(v: String); dynamic; 
    property onChange: TChangeEvent read FonChange write FOnChange; 
    procedure ScrllChange(Sender: TObject); 
    procedure ScrllScroll(Sender: TObject; ScrollCode: TScrollCode; var ScrollPos: Integer); 
    procedure TxtEnter(Sender: TObject); 
    procedure TxtKeyUp(Sender: TObject; var Key: WORD; Shift: TShiftState); 
    procedure TxtExit(Sender: TObject); 
    procedure Txt_Validate(var Cancel: Boolean); 
public 
    function GetCaption(): String; 
    procedure SetCaption(New_Caption: String); 
    function GetMax(): Smallint; 
    procedure SetMax(New_Max: Smallint); 
    function MaxOf(a: Double; B: Longint): OleVariant; 
    function MinOf(a: OleVariant; B: Longint): OleVariant; 
    function GetMin(): Smallint; 
    procedure SetMin(New_Min: Smallint); 
    function GetText(): String; 
    procedure SetText(New_Text: String); 
    constructor Create(AOwner: TComponent); override; 
    destructor Destroy; override; 
published 
    property Caption: String read GetCaption write SetCaption; 
    property Enabled: Boolean read GetEnabled write SetEnabled; 
    property Max: Smallint read GetMax write SetMax; 
    property Min: Smallint read GetMin write SetMin; 
    property Text: String read GetText write SetText; 
end; 
var 
TxtSpnr: TTxtSpnr; 
implementation 

uses Math; 
{$R *.dfm} 

procedure TTxtSpnr.Changed(V: String); begin 

if assigned(FonChange) then FonChange(self,V); 
end; 

constructor TTxtSpnr.Create(AOwner: TComponent); begin 

inherited Create(AOwner); 
Lbl := TLabel.Create(Self); 
with Lbl do begin 
    Parent := Self; 
end; 
Txt := TEdit.Create(Self); 
with Txt do begin 
    Parent := Self; 
end; 
Scrll := TScrollBar(Self); 
with Scrll do begin 
    Parent := Self; 
end; 
end; 

и вот тест-пилот:

type 

TForm1 = class(TForm) 
    FTxtSpnr: TTxtSpnr; 
    procedure FormCreate(Sender: TObject); 
private 
    { Private declarations } 
public 
    { Public declarations } 
end; 
var 

Form1: TForm1; 
implementation 

{$R *.dfm} 

procedure TForm1.FormCreate(Sender: TObject); begin 

FTxtSpnr := TTxtSpnr.create(Self); 
with FTxtSpnr do begin 
    Left:=10; 
    Top:=10; 
    Visible:=true; 
    Show; 
end; 
end; 

Но он не компилируется и говорит, в конструкторе, «Объект не может быть своим собственным родитель». Выньте настройки родителя, он компилирует, но не отображает компоненты. Что мне не хватает?

+0

Любая конкретная причина, по которой вы используете 'TWinControl', а не' TCustomControl', как обычно используете? Кроме того, я надеюсь, что 'Scrll' не будет использоваться в качестве вертикальной или горизонтальной полосы прокрутки. –

+1

Это одна из причин, почему нельзя использовать «с». В вашем коде для ярлыка ссылается на себя, а не на ваш компонент, как вы планировали. – MikeD

ответ

4

Во-первых,

Scrll := TScrollBar(Self); 

, конечно, должен прочитать

Scrll := TScrollBar.Create(Self); 

Во-вторых,

FTxtSpnr := TTxtSpnr.create(Self); 
with FTxtSpnr do begin 
    Left:=10; 
    Top:=10; 
    Visible:=true; 
    Show; 
end; 

должен быть

FTxtSpnr := TTxtSpnr.create(Self); 
with FTxtSpnr do 
begin 
    Parent := Self; 
    Left := 10; 
    Top := 10; 
end; 

Вы забыли установить родителя.

Кроме того, глобальная переменная

var 
    TxtSpnr: TTxtSpnr; 

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

Смежные вопросы