为什么没有显示输出?

时间:2016-05-01 12:15:14

标签: delphi

我今天开始学习课程和对象编程。手册中有代码我必须复制才能运行和保存。我需要创建一个类(TLine)并使用该类来实例化一个对象。

问题:我的RichEdit组件中没有显示输出。我将代码完全从书中复制到delphi,但没有显示输出。

输出应如何显示:" **********"

我的课程:

<script>
    function checkImageLoad() {
        if (document.getElementById("1st_image").complete == true) {
            console.log("1st_image Loaded!");
        }
        document.getElementById("2nd_image").src = "http://example.org/2nd_image.png";
    }
</script>
<body onload="checkImageLoad();">
<img id="1st_image" src="http://example.org/1st_image.png">
<img id="2nd_image" src="http://example.org/loading_please_wait.gif">

实例化TLine类的Object的代码:

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.

1 个答案:

答案 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. 

我可以想到其他事情,但我不想让你超负荷。