ClientDataSet(随机记录)最后一条记录播放错误“在表格的开头”

时间:2017-05-10 10:29:09

标签: delphi

播放表格中的最后一条记录时出错 - 表格开头如何解决此问题。

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;

2 个答案:

答案 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));

我留给你来研究XRandom的论点应该是什么,根据在线帮助说明{{1}的内容,转移到有效的随机记录}。

答案 1 :(得分:0)

  

记录数字

     

客户端数据集支持直接移动到给定的第二种方式   记录在数据集中:设置数据集的RecNo属性。   RecNo是一个基于1的数字,表示序列号   相对于数据集开头的当前记录。

     

您可以阅读RecNo属性以确定当前的绝对值   记录号,并写入RecNo属性以设置当前记录。   关于RecNo,要记住两件重要的事情:

     

尝试将RecNo设置为小于1的数字,或者设置为大于数据集中记录数的数字会导致At   表格的开头或表格异常的结尾。

     

任何给定记录的记录编号不保证是恒定的。例如,更改数据集上的活动索引会更改   数据集中所有记录的记录号。

     

请注意

     

您可以通过检查确定数据集中的记录数   数据集的RecordCount属性。设置RecNo时,请勿尝试   将其设置为高于RecordCount的数字。

请参阅:http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/DB_TDataSet_RecNo.html

相关问题