2016-05-01 2 views
1

Я начал изучать программирование классов и объектов сегодня. В справочнике есть код, который я должен скопировать для запуска и сохранения. Мне нужно создать класс (TLine) и использовать этот класс для создания экземпляра объекта.Почему вывод не отображается?

Проблема: в моем компоненте RichEdit не отображается вывод. Я скопировал код точно из книги в delphi, но вывод не выводится.

Как результат должен выглядеть: "**********"

Мой класс:

unit Lines_U; 

interface 

uses 
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
Dialogs; 

Type 
    TLine = Class 
Public 
    fSize : integer; 
    fPattern : char; 

public 
    Constructor Create; 
    Procedure Draw(Var line: string); 
end; 

implementation 

{ TLine } 

Constructor TLine.Create; 
begin 
    fSize := 10; 
    fPattern := '*'; 
end; 

Procedure TLine.Draw(Var line: string); 
Var 
loop : integer; 
begin 
    for loop := 1 to fSize do 
    begin 
    line := line + fPattern; 
    end; 
end; 
end. 

Код для создания объекта из класса TLine:

unit UseLine_U; 

interface 

uses 
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
    Dialogs, Lines_U, StdCtrls, ComCtrls; 

type 
    TForm1 = class(TForm) 
    redOut: TRichEdit; 
    Procedure FormCreate(Sender: TObject); 
    private 
    { Private declarations } 
    public 
    { Public declarations } 
    end; 

var 
    Form1: TForm1; 
    line : TLine; 

implementation 

{$R *.dfm} 

Procedure TForm1.FormCreate(Sender: TObject); 
Var tempLine : string; 
begin 
    line := TLine.Create; 
    line.Draw(tempLine); 
    redOut.Lines.Add(tempLine); 
end; 
end. 
+0

Этот вопрос не соответствует теме на этом сайте, потому что код в вопросе не ведет себя так, как вы описываете. –

+0

Я не даю никаких результатов, любая идея, почему это может быть? – Amber

+0

Это не так. Этот код не ведет себя так, как вы описываете. Ваш код отличается. –

ответ

4

Причина, по которой ваш код не работает, заключается в том, что обработчик события Form1.FormCreate не связан с событием OnCreate. Восстановите ссылку в инспекторе объектов.

О обработчиков событий
Никогда не писать обработчики событий (все эти процедуры, начиная с On...) вручную. Для их создания всегда используйте Object inspector.

enter image description here

Если вы дважды щелкните на событии, Delphi создаст шаблон кода для вас, что вы можете заполнить данными.
Убедитесь, что обработчики событий заполнены инспектором объектов. Если нет, они не будут работать (как вы видели).
Если вы хотите удалить обработчик события не удалите его в инспекторе объектов, но уменьшите код внутри процедуры обработки событий до пустого шаблона.
Delphi увидит, что он пуст и удалит его на следующем компиляторе.

О коде
Кроме недостающее звено нет ничего плохого в вашем коде. Он работает отлично.
Есть несколько проблем с стилем, хотя они не имеют никакого отношения к операции, но тем не менее важны.

Вот как я переписал бы ваш код.

unit Lines_U; 

interface 

//only import units that you actually use.  

type //please type reserved words in all lowercase, this is Pascal not VB. 
    TLine = class 
    private //make data members private. 
    fSize : integer; 
    fPattern : char; 
    public 
    constructor Create; 
    procedure Draw(var line: string); 
    property Size: integer read fSize write fSize; //Use properties to expose data members. 
    property Pattern: char read fPattern write fPattern; 
    end; 

implementation 

{ TLine } 

constructor TLine.Create; 
begin 
    inherited; //make the inherited call in your constructor explicit. 
    fSize := 10; 
    fPattern := '*'; 
end; 

procedure TLine.Draw(var line: string); 
//var 
    //loop : integer; //use consistent indentation 
begin 
    //Changing a string ten times in a row is inefficient. 
    //try to do your changes all at once. 
    //for loop := 1 to fSize do begin 
    // line := line + fPattern; 
    //end; 
    Line:= Line + StringOfChar(fPattern, fSize); 
end; 

end. 

Ваша форма:

unit UseLine_U; 

interface 

uses 
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
    Dialogs, StdCtrls, ComCtrls, Lines_U; 
    //put your own unit last, to prevent name clashes with built in classes and functions. 


type 
    TForm1 = class(TForm) 
    //note that the {nothing} line is really **published**. 
    //And data members should be private 
    //Line : TLine; //Line should be private. 
    RedOut: TRichEdit; 
    procedure FormCreate(Sender: TObject); 
    private 
    //Prefix all private data with `F` for Field. 
    FLine: TLine; //Line should be a item in the form, not a global var. 
    public 
    property Line: TLine read FLine; //read only access to line. 
    end; 

var 
    Form1: TForm1; 

implementation 

{$R *.dfm} 

procedure TForm1.FormCreate(Sender: TObject); 
var 
    tempLine : string; 
    i: integer; 
begin 
    //tempLine:= ''; //local variables should be initialized. 
    //However strings are always initialized to '', because they are managed types. 
    //everything else will contain random data unless you fill it! 
    FLine := TLine.Create; 
    Line.Draw(tempLine); 
    i:= 0; //init i, otherwise it will be random! 
    while i < 5 do begin //always use `begin-end` in loops, never a naked `do` 
    RedOut.Lines.Add(tempLine); 
    i:= i + 1; 
    end; {while} //I like to annotate my loop `end`s, but that's just me. 
    FreeAndNil(FLine); //Dispose of TLine when you're done with it. 
end; 

end. 

я могу думать о других вещах, но я не хочу перегружать вас.

+0

Большое спасибо. – Amber

+0

«Никогда не записывайте обработчики событий (все эти процедуры, начиная с On ...) вручную. Всегда используйте инспектор объектов для их создания». Я пишу их вручную все время ... Ну, опять же, я знаю лучше, чем оставить его несвязанным. –

+0

FWIW, как вы можете видеть в своем примере, 'TForm1.FormCreate' и все другие обработчики событий *, то есть методы (процедуры, функции), не начинаются с« Вкл. ». Однако события * имеют имена, начинающиеся с «Вкл.». IIRC, в .NET, это совсем наоборот. –

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