2

私は VBto を出発点として使用し、Delphi 6 ユーザーズ ガイドをよく調べました。新しいコンポーネントをコンパイルすることはできますが、それを表示する方法がわからないので、デバッグを終了できます。そして、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; 

しかし、それはコンパイルされず、コンストラクターで「オブジェクトはそれ自体の親になることはできません」と言います。親設定を取り出すと、コンパイルされますが、コンポーネントが表示されません。私は何が欠けていますか?

4

1 に答える 1

4

初め、

Scrll := TScrollBar(Self);

もちろん読むべき

Scrll := TScrollBar.Create(Self);

2番、

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;

危険に見えます。これらの 2 行を追加した理由が正確にわからない場合は、おそらく削除する必要があります。

于 2013-07-31T22:28:40.707 に答える