播放表格中的最后一条记录时出错 - 表格开头如何解决此问题。
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;
答案 0 :(得分:2)
Val Marinov 似乎已经为您提供了一个很好的答案 我只想补充一下 一些不直接回答你问题的观点,但可以帮助你避免犯错误。
你有一些代码
self.ListBox1.ItemIndex := Random(ListBox1.Items.Count)
您要使用它将列表框的ItemIndex
设置为随机有效值。有几件事情要求麻烦:
<强> 1。错误的使用方式Random
online help for the Random
function说
在Delphi代码中, Random 返回0&lt; = X&lt;范围内的随机数。范围。如果未指定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
实例是TListBox
组件TForm1
。 1}},而不是在编译行时也可能在范围内的其他ListBox1
变量(例如,名为ListBox1
的全局变量)。但避免这个问题的方法是首先避免在范围内使用其他ListBox1
我建议你只删除self.
的所有实例,因为你不应该拥有它们。
第3。避免设置数据集RecordNumber
最后,不要养成依赖TClientDataSet
允许您为RecordNumber
指定值的事实的习惯,这很少是一个好主意,很少有数据集类型支持它。
如果你想去随机记录,最好使用
Dataset.First;
DataSet.MoveBy(Random(X));
我留给你来研究X
到Random
的论点应该是什么,根据在线帮助说明{{1}的内容,转移到有效的随机记录}。
答案 1 :(得分:0)
记录数字
客户端数据集支持直接移动到给定的第二种方式 记录在数据集中:设置数据集的RecNo属性。 RecNo是一个基于1的数字,表示序列号 相对于数据集开头的当前记录。
您可以阅读RecNo属性以确定当前的绝对值 记录号,并写入RecNo属性以设置当前记录。 关于RecNo,要记住两件重要的事情:
尝试将RecNo设置为小于1的数字,或者设置为大于数据集中记录数的数字会导致At 表格的开头或表格异常的结尾。
任何给定记录的记录编号不保证是恒定的。例如,更改数据集上的活动索引会更改 数据集中所有记录的记录号。
请注意
您可以通过检查确定数据集中的记录数 数据集的RecordCount属性。设置RecNo时,请勿尝试 将其设置为高于RecordCount的数字。