2017-05-10 14 views
1

テーブルの最後のレコードを再生中にエラーが発生しました - テーブルの始まりです。データセットのRECNOプロパティを設定:ClientDataSet(ランダムレコード)最後のレコードの再生エラー「テーブルの先頭」

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

そして、どのように 'AddALL()'が何をしているのか、読者はどのように考えていますか? – MartynA

答えて

2

ヴァルマリノフは、あなたの質問に良い答えを与えているようです。
あなたの質問に直接答えることはできないが、何か間違いを避けるのに役立ついくつかのポイントを追加したいだけです。

は、あなたは、リストボックスのItemIndexランダム、有効な値に設定するために使用するいくつかのコード

self.ListBox1.ItemIndex := Random(ListBox1.Items.Count) 

を持っています。これに関するトラブルを求めているものがいくつかあります:

1. Random

online help for the Random functionランダムがランダムに返し、Delphiコードで

を言うを使用するために間違った方法は、範囲内の数値0 < = X <範囲。範囲が指定されていない場合、結果は実数型乱数のListBoxの場合

0 <= X < 1. 

は、有効なItemIndexの値の範囲は0..Items.Count - 1ある範囲内にあります。しかしRandomは小数部を返すことができますので、あなたが望むものを書くためのより良い方法がある:

そのように呼ばれ
ListBox1.ItemIndex := Trunc(Random(ListBox1.Items.Count)); 

RandomListBox1.Items.Count以下の値、およびTrunc破棄小数部への呼び出しを返します。

2. selfの不要な使用。

あなたのコードには、self修飾子を付けて自由に振りかざします。そのようなselfを使用しなければならないのは、通常、悪いか粗雑なコーディングの兆候です。あなたのTForm1.AddALL
、最初の行にselfは、あなたが参照しているListBox1のインスタンスがあなたのTForm1TListBoxコンポーネントである1、というよりも範囲とすることができるいくつかの他のListBox1変数であり、コンパイラ(例えばに指示します行がコンパイルされると、ListBox1というグローバル変数)。しかし、その問題を回避する方法は、最初に他のListBox1をスコープに入れないようにすることです。
self.のすべてのインスタンスを削除することをお勧めします。データセットRecordNumber

を設定

3.避け最後に、TClientDataSetはあなたがRecordNumberの値を指定することができたという事実に頼るのが習慣に取得しない、それはめったに良いアイデアといくつかのデータセットではありませんタイプはそれをサポートします。
あなたはランダムなレコードに移動したい場合は、

Dataset.First; 
DataSet.MoveBy(Random(X)); 

は私がベースの、有効な、ランダム、レコードに移動するために、引数がXRandomにどうあるべきか動作するようにあなたにそれを残して、より良い使用オンラインヘルプがRandomについて何を言いますか?

+0

ClientDataSet1.MoveBy(Random(ClientDataSet1.RecordCount)); – abrakadabra

0

レコード番号

クライアントデータセットは、データセットに与えられた レコードに直接移動する第二の方法をサポートしています。 RecNoは、データセットの先頭に対する現在のレコードの の連続番号を示す1から始まる番号です。

現在の絶対 レコード番号を決定するためにRecNoプロパティを読み取って、現在のレコードを設定するRecNoプロパティを書き込むことができます。 RECNOに関して心に留めておくべき二つの重要な事柄があります。

が1未満の数に、または 開始時におけるデータセットの結果のレコード数よりも多い数にRECNOを設定しようとするが、テーブルの終了、またはテーブル例外の終了のそれぞれになります。

任意のレコードのレコード番号が一定であるとは限りません。たとえば、データセットのアクティブなインデックスを変更すると、データセット内のすべてのレコードのレコード番号が に変更されます。あなたが データセットのRecordCountプロパティを検査することにより、データセット内のレコード数を決定することができ

NOTE

。 RecNoを設定するときは、 をRecordCountよりも高い数値に設定しないでください。

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

+1

'RandomRange(1、ClientDataSet1.RecordCount);'(uses句に 'Math'を追加します)この方法で、あなたは問題を引き起こしていると思われる '0'を避けることができます。 http://www.delphibasics.co.uk/RTL.asp?Name=RandomRange&ExpandCode1=Yes –

+0

'ClientDataSet1.RecNo:= Random(ClientDataSet1.RecordCount)+ 1'はRandomが0を返し、値が1のために機能します。 RandomがRecordCountを返すと、値はRecordCount + 1になるのでエラーが発生します。 –

関連する問題