2013-07-31 1 views
2

J'ai utilisé VBto comme point de départ et j'ai beaucoup étudié le Guide de l'utilisateur de Delphi 6. Je peux compiler mon nouveau composant, mais je n'arrive pas à trouver un moyen de l'afficher pour que je puisse finir de le déboguer. Et 50 ans d'expérience en programmation n'aident pas. Voici le courage de mon composant:Création de composants Delphi .. Dépasser la première base

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; 

et voici le pilote d'essai:

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; 

Mais il ne compile pas et dit, dans le constructeur, « Un objet ne peut pas être son propre parent". Enlevez les paramètres Parent, il compile mais n'affiche pas les composants. Qu'est-ce que je rate?

+0

Une raison particulière pour laquelle vous utilisez 'TWinControl' et non le' TCustomControl', comme vous l'utilisez normalement? En outre, j'espère que Scrll ne doit pas être utilisé comme barre de défilement verticale ou horizontale du contrôle. –

+1

C'est une des raisons pour éviter d'utiliser "avec". Avec dans votre code pour l'étiquette se réfère à elle-même, et non votre composant comme vous l'avez prévu. – MikeD

Répondre

4

D'abord,

Scrll := TScrollBar(Self); 

devrait bien sûr lire

Scrll := TScrollBar.Create(Self); 

En second lieu,

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

devrait être

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

Vous avez oublié de définir le parent.

En outre, la variable globale

var 
    TxtSpnr: TTxtSpnr; 

semble dangereux. Si vous ne savez pas exactement pourquoi vous avez ajouté ces deux lignes, vous devriez probablement les supprimer.

Questions connexes