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次重复,用属性。)
请大家高抬贵手,谢谢。。
解决方案 »
- 如何利用fastreport打印大幅面的报表
- 如何将FastBMP组件里的位图写入到TPicture里
- 调用一个过程为变理赋值的问题!
- 如何判断所输入的字符是本机的IP或计算机名?
- 还是processbar的问题?
- 高手呢,谁是高手,带星星的帮帮忙,不带星星的出出力!!谢了!急!!在线等待!!!
- 熟悉java和delphi的高手请进
- 我用FetchOnDemand和PacketRecords属性建立数据分段,每次下载2条记录,用怎样的代码能让客户端知道已经下载完所有的记录了呢?
- 谁有PlatinumControls的控件和源码呢?
- 编写了ListView的拖动事件后,在双击后会自动进入拖动状态,是否为Bug?
- 如何Hook程序中代码的某段,并跳转取值后再跳回去
- F1Book导入Excel
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.
b:=a+' '+a;
不就行了?
如果不遵守这些约定,虽然在语法上没有问题,单总是让人感觉怪怪的。
下面这个类,定义成这样会好些
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是一个变量而不是一个属性或者方法
这点我终是忘记 >.<
谢谢解释和指点。。感恩中~~
为什么过程悬空?
让它悬空可以不放过程吗
或这样property OnValue : Integer read GetValue;??
我贴的代码是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.
就是这样了。