unit Unit2;
interface
type
  TLoop = class
  private
    GetValue : Integer;
    procedure SetValue(const Value: Integer);
  public
    property OnValue : Integer read GetValue write SetValue;
  end;implementation
{ TLoop }
procedure TLoop.SetValue(const Value: Integer);
var
  i, j : Integer;
begin
  i := 1;
  while i <= 2 do
  begin
    j := 5;
    while j >= 1 do
    begin
      GetValue := j;
    Dec(j);
    end;  Inc(i);
  end;
end;end.
Unit2 上面
链接
Unit1 下面

unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Unit2;type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    Edit1: TEdit;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;var
  Form1: TForm1;
implementation
{$R *.dfm}
var
  MyResult : TLoop;
procedure TForm1.Button1Click(Sender: TObject);
begin
  Memo1.Lines.Text := IntToStr(MyResult.OnValue) + ' ' + Edit1.Text;
end;procedure TForm1.FormCreate(Sender: TObject);
begin
  MyResult := TLoop.Create;
end;procedure TForm1.FormDestroy(Sender: TObject);
begin
  MyResult.Free;
end;
end.
5 4 3 2 1 (想要2次重复,用属性。)
请大家高抬贵手,谢谢。。

解决方案 »

  1.   

    SetValue中加个for循环2次不就行了
      

  2.   

    你的思路有点问题unit Unit1;
    interface
    uses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, Unit2;type
      TForm1 = class(TForm)
        Button1: TButton;
        Memo1: TMemo;
        Edit1: TEdit;
        Button2: TButton;
        procedure Button1Click(Sender: TObject);
        procedure FormCreate(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;
    implementation
    {$R *.dfm}
    var
      MyResult : TLoop;
    procedure TForm1.Button1Click(Sender: TObject);
    begin  Memo1.Lines.add(IntToStr(MyResult.OnValue));
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
      MyResult := TLoop.Create;
    end;procedure TForm1.FormDestroy(Sender: TObject);
    begin
      MyResult.Free;
    end;
    end.
    unit Unit2;
    interfaceuses Dialogs,Sysutils;type
      TLoop = class
      private
        myValue : Integer;
      protected
        function GetValue:integer;
        procedure SetValue(const Value: Integer);  public
        property OnValue : Integer read GetValue write SetValue;
      end;implementation
    uses unit1;
    { TLoop }
    function TLoop.GetValue: integer;
    var
      i, j : Integer;
      x:string;
    begin
      form1.Memo1.Clear;
      i := 1;
      while i <= 2 do
      begin
        j := 5;
        while j >= 1 do
        begin
          result := j;
          x:=x+' '+ inttostr(result);
        Dec(j);
        end;
        form1.Memo1.Lines.add(x);
        x:='';
        Inc(i);
      end;
    end;procedure TLoop.SetValue(const Value: Integer);
    begin
      {}
    end;end.
      

  3.   

    GetValue的名字容易混淆另外,不明白,a:='5 4 3 2 1'了,想2次重复
    b:=a+' '+a;
    不就行了?
      

  4.   

    没搞明白你要干什么。任何一门语言都有一些默认的约定,这些约定是为了使代码更容易阅读
    如果不遵守这些约定,虽然在语法上没有问题,单总是让人感觉怪怪的。
    下面这个类,定义成这样会好些
    type
      TLoop = class
      private
        FValue: Integer;    function GetValue: Integer;
        procedure SetValue(const Value: Integer);
      public
        //下面4个定义都可以
        //property MyValue : Integer read FValue write SetValue;//当直接返回FValue的值时
        //property MyValue : Integer read GetValue write FValue;//当直接设置FValue的值时
        //property MyValue : Integer read FValue write FValue;  //仅仅把FValue定义成一个属性时
        property MyValue : Integer read GetValue write SetValue;//读取和设置FValue时都需要额外操作时
      end;
    function TLoop.GetValue: Integer;
    begin
      Result := FValue;
      //在这里,可以对FValue进行一些必要的处理
    end;procedure TLoop.SetValue(const Value: Integer);
    begin
      FValue := Value;
    end;一般情况下,事件被定义成以 On****** 形式,
    属性的 read 对应的方法才用Get****** ,而变量不用Get开头,一般情况下,类中的私有变量定义成F******至于你说的 想两此重复,这个真没看明白,你的那个函数定义的很让人费解,最终导致你的那个GetValue变量是1,这里需要注意,在你的定义中GetValue是一个变量而不是一个属性或者方法
      

  5.   


    这点我终是忘记 >.<
    谢谢解释和指点。。感恩中~~
      

  6.   


    为什么过程悬空?
    让它悬空可以不放过程吗
    或这样property OnValue : Integer read GetValue;??
      

  7.   

    悬空只是因为我不想写啊。可以不写的。
    我贴的代码是OK的,试过了,运行出来了才贴的。
    wxieyang说得很对,你怎么会想在属性里面做一些这样的处理呢。所以我一开始就说你思路有问题。
    但是如果你要看这样的效果,依然是可以做到,代码已经给你了。
    属性的read和write的用法其实很简单的。
    property OnValue : Integer read GetValue write SetValue;
    当你在进行OnValue的读操作时(即x:=OnValue,像这样把这个属性值赋给x,那么你就要获取OnValue),
    这个时候程序将进入到你的读函数(read GetValue)中的GetValue,
    当你在进行OnValue的写操作时(即OnValue:=x,像这样把这个x的值赋给OnValue,那么你就要写入OnValue),这个时候程序将进入到你的写函数(write SetValue)中的SetValue。
    可以不写write SetValue,这样的话,我们只能读取属性的值了,也就相当于我们所说的属性只读。
    当然你可以叫它readonly.
    就是这样了。