【问题标题】:Delphi Component Creation.. Getting Beyond First BaseDelphi 组件创建.. 超越 First Base
【发布时间】:2013-08-01 15:59:36
【问题描述】:

我以 VBto 为起点,并大量学习了 Delphi 6 User's Guide。我可以编译我的新组件,但我想不出办法让它显示,所以我可以完成调试它。 50 年的编程经验也无济于事。这是我的组件的核心:

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; 

但它没有编译并在构造函数中说,“一个对象不能是它自己的父对象”。取出父设置,它编译但不显示组件。我错过了什么?

【问题讨论】:

  • 您使用TWinControl 而不是通常使用的TCustomControl 有什么特别的原因吗?另外,希望Scrll不要用作控件的垂直或水平滚动条。
  • 这是避免使用“with”的原因之一。在您的代码中,标签指的是它自己,而不是您想要的组件。

标签: delphi components creation


【解决方案1】:

首先,

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;

看起来很危险。如果您不知道添加这两行的确切原因,您可能应该删除它们。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-27
    • 1970-01-01
    • 2013-02-21
    • 2021-09-20
    • 1970-01-01
    • 2018-01-24
    • 2011-07-10
    • 2010-11-03
    相关资源
    最近更新 更多