次の問題があります。
私は DELPHI XE2 でプログラミングし、TMSで TDBAdvGrid を使用しています。グリッドは SQL SERVER から入力されます。+1000 件のレコードを一度にロードしようとすると、次のエラーが発生します。
$75CCC42D の最初のチャンス例外。「不明なエラーが発生しました」というメッセージを含む例外クラス EOleException。
[Break] をクリックすると、ポインターが次のコードで停止します。
function TDBAdvGrid.GetRecordCount: integer;
function RowsInDataset: Integer;
var
cb: TBookMark;
iseof, isbof: Boolean;
begin
Result := -1;
if not CheckDataSet then
Exit;
FDataLink.DataSet.DisableControls;
iseof := FDataLink.DataSet.Eof;
isbof := FDataLink.DataSet.Bof;
if isbof and iseof then
begin
Result := 0;
//FMaxRows := 0;
end
else
with FDataLink.DataSet do
begin
cb := GetBookMark;
First;
if (csDesigning in ComponentState) then
Result := MoveBy(100)
else
Result := MoveBy($7FFFFFFF) + 1; // <= programs breaks here!
GotoBookMark(cb);
FreeBookMark(cb);
//FMaxRows := Result;
end;
if iseof then
FDataLink.DataSet.Next;
if isbof then
FDataLink.DataSet.Prior;
if FDataLink.DataSet.State = dsInsert then
Result := Result + 1;
FEmptyDataSet := Result = 0;
FDataLink.DataSet.EnableControls;
end;
//var
// OldRecNo: integer;
begin
Result := 0;
if Assigned(FDataLink) then
if Assigned(FDataLink.DataSet) then
if FDataLink.DataSet.Active then
begin
FDoNotUpdateMe := true;
if Assigned(FOnGetRecordCount) then
begin
FDataLink.DataSet.DisableControls;
FOnGetRecordCount(self, Result);
FEmptyDataSet := Result = 0;
if (FloatingFooter.Visible) and PageMode and (FloatingFooter.FooterStyle = fsFixedLastRow) then
begin
if (Result = 0) then
Inc(Result, 2)
else
Inc(Result);
end;
FDataLink.DataSet.EnableControls;
end
else
begin
Result := RowsInDataSet;
if (FloatingFooter.Visible) and PageMode and (FloatingFooter.FooterStyle = fsFixedLastRow) then
begin
if (Result = 0) then
Inc(Result, 2)
else
Inc(Result);
end;
end;
{ OldRecNo:= FDataLink.DataSet.RecNo;
FDataLink.dataset.First;
Result := FDataLink.dataset.MoveBy($FFFF);
FDataLink.DataSet.RecNo:= OldRecNo; }
FDoNotUpdateMe := false;
end;
end;
//------------------------------------------------------------------------------
[続行] をクリックすると、このエラーの無限ループに入ります。このエラーはデバッグモードのときだけ発生し、Delphi の外で exe を起動し、グリッドでフォームに移動すると、まったく問題ありません。また、これは私の PC でのみ発生し、同僚にはこの問題はありません。
TMS を更新しても解決しませんでした。
TMS にメールしましたが、Delphi 自体の問題であり、私を助けることはできないとのことです。彼らは正しいですか?
現時点では、exe を開始し、グリッドをロードし、Delphi をプロセスにアタッチして、必要なコードをデバッグします。あまり便利ではありませんが、何もないよりはましです。
私に何ができる?
近い将来、XE7 または 10 シアトルにアップグレードすることを検討していますが、これはすぐに修正される可能性があります
編集 - 追加情報
私たちは最近 DELPHI 10 SEATTLE への一歩を踏み出しましたが、問題はまだ残っています。また、すべての TMS 製品を更新しました。
その日に TMS に送り返したメールを検索したところ、見つかりませんでした (最初のメールは見つかりませんでした)。会話の流れはこうです。
- 最初に、スクリーンショットを含む、何が起こっているかを説明する電子メールを送信しました(このSO-質問に非常に似ています)
- 使用しているデータセットと、データセット自体で MoveBy 命令を使用できるかどうかを尋ねる電子メールを受け取りました。
- 私は彼らが尋ねたことを試してみました。はい、そうすると同じエラーが発生します
adoquery.moveby($FFFFFFF)
- 彼らは、なぜ私がそのエラーを受け取ったのかは不明であり、誰かがこれを報告したのは初めてだったと言いました. これは、データセット自体の障害であり、仕方がないと彼らが言ったところです。
これを修正する方法がまったくわかりません...そして、なぜこれがデバッグ中にのみ発生し、レコードカウントが1000を超えているのかまだわかりません。ページングの何かでしょうか?
@コビック:
procedure TfrmGrondstoffen.MainDBGridGetRecordCount(Sender: TObject;
var Count: Integer);
begin
ShowMessage(inttostr(MainDBGrid.DataSource.DataSet.RecordCount)); // gives the correct number
ShowMessage(inttostr(qryGrondstoffen.RecordCount)); //gives the correct number
ShowMessage(inttostr(Count)); // gives 0 all the time
end;
また、3 つではなく 12 のメッセージボックスを受け取ったのも少し奇妙です。