to hfghfghfg:
其实我问这个问题是出于这样的原因:我看到一些背单词软件能够按随机顺序将一
定的单词(如30或50个单词等)逐个不重复(前面这五个字很重要!)地调到屏幕上,
所以我也想实现这种功能,可是自己搞了好久也没有搞成功,今天在你的帮助下终于
解决了这个我认为是难题的问题!非常高兴!
我将您的代码中的memo元件改为用TStringList来代替,这一下子就弄完了,我又
增加了一些功能,调试程序花了我整整一个小时!
在此将我的代码贴出来,与大家共享,希望朋友们看过后能够解决相似问题:
(首先要在form上增加Button1和Button2两个按钮),再增加一个label1即可:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
Button2: TButton;
Label1: TLabel;
Button1: TButton;
procedure Button2Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
j : integer
//循环控制变量
sl1,sl2 : TStringList;
implementation
{$R *.DFM}
procedure TForm1.Button2Click(Sender: TObject);
const
Range=5
//这个值表示要生成随机数的最大值不超过5
var
i : integer;
jg : integer
//最终结果
begin
if j=Range then
begin
// j :=0
//将此句移入了Button1里面了!
showMessage(intToStr(Range)+'以内所有不重复的随机数都已经显示完毕!'+#13+'如要再来请按Button1钮后再执行我。');
exit;
end;
if sl2.Count=0 then
begin
for i :=1 to Range do
sl1.Add(intToStr(i));
Randomize;
while sl1.Count >0 do
begin
i :=Random(Range);
if (i>=0) and (i<sl1.Count) then
begin
sl2.Add(sl1.strings);
sl1.Delete(i);
end;
end;
//这一句很重要的
Button2.click;
end
else
begin
jg :=StrToInt(sl2.strings[j]);
label1.Caption :=label1.Caption +intToStr(jg)+' ';
showMessage('第'+intToStr(j+1)+'次显示'+intToStr(Range)+'以内的随机数!'+#13#13+'随机数的值是:'+intToStr(jg)+#13#13+'请检查这个值是否会和下次看到的重复!');
j :=j+1;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
sl1 :=TStringlist.Create
sl2 :=TStringlist.Create
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
//使得在运行完一遍(即点击Button2钮Range次后
//再点击Button2钮,能得到新的随机结果!
sl1.Free;
sl2.Free;
sl1 :=TStringList.Create
sl2 :=TStringList.Create
j :=0;
end;
end.