2016-05-30 15 views
0

フォームの作成時にACRTableを開きます。EListError - それを防ぐ方法

これは私がテーブルのスクロールの後に持っているものです。

procedure TForm1.ACRTable1AfterScroll(DataSet: TDataSet); 
begin 
if ACRTable1.FieldByName('COMPANY_ID').AsString <> '' then 
begin 
ACRQuery1.SQL.Text:= 'select * from MEMBERS where COMPANY_ID = ' + 
ACRTable1.FieldByName('COMPANY_ID').AsString; 
ACRQuery1.Open; 
end; 
end; 

しかしACRQuery1が、私はデータベースEListErrorを取得するすべてのレコードを持っていない場合。 私が試した:

procedure TForm1.ACRQuery1BeforeOpen(DataSet: TDataSet); 
begin 
if ACRQuery1.RecordCount =0 then 
    label1.Caption:='No records found' 
    else label1.Caption:=''; 
end; 

しかし、まだ同じエラーを。 私は何が間違っていますか?このEListErrorをどうやって防ぐことができますか?

答えて

1

あなたのACRQuery1がどのTDataSet-descendant型であるかはわかりませんが、データセットが開いていなければ、実際には存在しないTListなどからRecordCountを計算します(Countプロパティを読み取るなど)。 。だから、私が試してみた最初のことは、それが開いている場合を除き、そのRecordCountをを読み取ろう避けるために、次のようになります。

procedure TForm1.ACRQuery1AfterOpen(DataSet: TDataSet); 
begin 
// Following is how I would have structured it 
// Make sure you remove your BeforeOpen handler 
    if ACRQuery1.Active then begin 
    if (ACRQuery1.RecordCount = 0) then 
     label1.Caption := 'No records' 
    else 
     label1.Caption := IntToStr(ACRQuery1.RecordCount); 
    end 
    else begin 
    label1.Caption:='No records found'; 
end; 

コードがAfterOpenイベントに移動すると、Acttiveされたデータセットのチェックは実際にはありませんRecordCountのチェックをAfterOpenイベントに移動すると、データセットの実装がその値を返すことができないうちに読み込まれないようにする必要がありますが、コードにそのテストを含めました他の場所でコードを使用しようとした場合に備えてください。

Btw、上記のコードを使用してEListErrorを取得した場合、原因はTACRQueryの実装上のバグではなく、「間違っている」ものではなく、作成者に報告する必要がありますs)。

+0

まだエラーが発生します。 – user763539

+0

申し訳ありませんが、私は最初に投稿したものを間違えました。もう一つのことは、コードがAfterOpenイベントにあることです。 – MartynA

+0

まだエラーが表示されています:( – user763539

関連する問題