4

プロジェクトにTDbGridがあり、選択した行を変更するたびにイベントをオフにしようとしています。行を変更すると、同じデータソースにリンクされているすべてのデータベース対応コントロールが既に更新されますが、他にも変更が必要であり、イベントハンドラーが必要です。

OnColEnterが機能すると思いました。ヘルプファイルによると、次の場合に起動します。

  • ユーザーはキーボードを使用してセルに移動します。たとえば、ユーザーがTabキーまたはHomeキーを使用する場合です。

  • ユーザーは、セル内でマウスボタンをクリックします。

  • SelectedFieldまたはSelectedIndexプロパティが設定されます。

残念ながら、dgRowSelectオプションが有効になっているときにユーザーがキーボードを使用してナビゲートした場合、OnRowEnterがないため、起動しませんまた、OnKeyDownイベントは、選択が変更される前に発生します。ここでTListBoxのデータベース対応バージョンをシミュレートしようとしていますが、リストボックスのOnClickハンドラーを置き換えるものが必要です。これは、マウスまたはキーボードを使用して選択を変更すると、名前が実際にオフになるにもかかわらずです。TDbGridでそれを行う方法はありますか?そうでない場合は、それを実行する他のグリッドコントロールが必要です。誰かがそれが何であるか知っていますか?(できればオープンソース?)

4

4 に答える 4

8

DataSourceのOnDataChangeイベントを試しましたか?

于 2008-11-17T05:21:42.607 に答える
3

OnDataChangeは1つの選択肢です。もう1つは、TDataset側のイベントAfterScrollです。ほとんどの場合、OnDataChangeよりも実用的であることがわかりました。OnDataChangeでは、スクロールイベントにFieldパラメータnilが付属しているためです(これはトラップであり、AVがそれをコーディングする原因の1つになる可能性があります)。

于 2008-11-17T15:47:15.557 に答える
2

OnDataChange を使用して、データセットをロードするケースを処理するには、ルーチンの最初の行としてブール値チェックを追加し、ロードが完了したらこれを false に設定します。

procedure TForm1.DataSource1DataChange(Sender: TObject; Field: TField);
begin
  if fbLoading then exit;
  // rest of your code here
end;

procedure TForm1.Form1Create(Sender:tObject);
begin
  fbLoading := true;
  // load your table here     
  fbLoading := false; 
end;
于 2008-11-17T14:48:51.900 に答える
1

私はデータセットでAfterScrollのみを使用します。これは、データセットを最初に開いたとき、およびデータセット内を移動するたびに発生します。DBGridでは、行またはスクロールバーをクリックするたびに、またはキーボード(Home、Edn、Up、Down、PgUp、PgDown)などを使用して実行されます。

同じデータセットを多くの異なる形式(作成/解放または表示/閉じるのいずれか)で使用する場合は、動的に割り当てることもできます。

procedure TForm1.myAfterScroll(DataSet: TDataSet); 
begin
   //do your thing here
   if oldAfterScroll<>nil then
      oldAfterScroll(DataSet);
end;

constructor TForm1.Create(AOwner: TComponent);
begin
   oldAfterScroll:=DBGrid1.DataSet.OnAfterScroll;
   DBGrid1.DataSet.OnAfterScroll:=myAdrerScroll;
end;

destructor TForm1.Free;
begin
   DBGrid1.DataSet.OnAfterScroll:=oldAfterScroll;
end;
于 2008-11-17T18:36:29.990 に答える