在播放表中的最后一条记录时发生了一个错误--在表的开头,如何修复它。
procedure TForm1.btnNextClick(Sender: TObject);
begin
self.ListBox1.ItemIndex := Random(ListBox1.Items.Count) - 0 ;
AddALL();
begin
ClientDataSet1.RecNo:=Random(ClientDataSet1.RecordCount) - 0;
PlayFile(self.exePath + '\' + self.ClientDataSet1.FieldByName('mp3').AsString, MediaPlayer1,Image2);
end
end;
发布于 2017-05-10 04:57:25
瓦尔·马里诺夫似乎对你的问题给出了很好的答案。
我只想补充一些不直接回答你的问题,但可能会帮助你避免犯一些错误。
你有一些代码
self.ListBox1.ItemIndex := Random(ListBox1.Items.Count)
将列表框的ItemIndex
设置为随机的有效值。有几件事在这方面引起了麻烦:
1.使用Random
的错误方式
在Delphi代码中,随机在0 <= X< Range范围内返回一个随机数。如果未指定范围,则结果是范围内的实型随机数。 0 <= X< 1。
对于ListBox,有效ItemIndex值的范围是0..Items.Count - 1
。但是Random
可以返回一个小数部分,因此编写所需内容的更好方法是:
ListBox1.ItemIndex := Trunc(Random(ListBox1.Items.Count));
这样调用,Random
将返回低于ListBox1.Items.Count
的值,而对Trunc
的调用将丢弃小数部分。
2.不必要地使用self
**.**
您的代码中有大量的self
限定符。必须这样使用self
通常是糟糕或草率编码的标志。
在TForm1.AddALL
中,第一行中的self
告诉编译器,您所引用的ListBox1
实例是TForm1
上的TListBox
组件,而不是编译该行时可能在范围内的其他ListBox1
变量(例如,名为ListBox1
的全局变量)。但是,避免这个问题的方法是首先避免在范围内使用其他ListBox1
。
我建议您只删除self.
的所有实例,因为您不应该需要它们。
3.避免设置数据集RecordNumber
最后,不要习惯于依赖于TClientDataSet
允许您为RecordNumber
指定值这一事实,这很少是一个好主意,而且很少有数据集类型支持它。
如果你想去一个随机记录,最好使用
Dataset.First;
DataSet.MoveBy(Random(X));
我让您根据在线帮助对Random
的看法,找出Random
的论点是什么,移动到有效的、随机的、记录中。
发布于 2017-05-10 03:09:50
记录号码 客户端数据集支持直接移动到dataset中给定记录的第二种方法:设置数据集的RecNo属性。RecNo是一个基于一个的数字,指示当前记录相对于数据集开头的顺序编号。 您可以读取RecNo属性以确定当前绝对记录号,还可以写入RecNo属性来设置当前记录。对于RecNo,有两件重要的事情要记住: 试图将RecNo设置为小于1的数字,或设置为大于数据集中记录数的数字,结果分别是在表的开头处或表的末尾出现异常。 任何给定记录的记录编号都不能保证为常量。例如,更改dataset上的活动索引会更改数据集中所有记录的记录数。 备注 您可以通过检查数据集的RecordCount属性来确定数据集中的记录数。设置RecNo时,不要尝试将其设置为高于RecordCount.的数字。
请参阅:RecNo.html
https://stackoverflow.com/questions/43889873
复制相似问题