問題タブ [tdbgrid]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
delphi - TDBGridレコードビューを更新前の状態に復元するにはどうすればよいですか?
重複の可能性:
前の場所に戻るときにTDbgridのスクロールを回避する方法
TDBGrid
更新が発生した後、Delphiの垂直スクロール位置を保存および復元する方法を探しています。現在、グリッドはそれ自体をリセットして、選択したレコードがレコードのリストの中央に表示されるようにします。
最初は、プロパティLeftCol
とTopRow
が解決策のように見えましたが、機能するだけLeftCol
です。TopRow
値は常に1であり、変更されることはありません。これは、グリッドに表示されている行数に設定されている、グリッドの内部レコードバッファーへの位置のように見えます。つまり、FBuffersは上下にスライドしているように見えますが、常にTopRow
1のままです。
私が見ているものの詳細な例は次のとおりです。
- グリッドには
TClientDataSet
、レコード5から始まる11個のレコードが表示され、レコード15まで順番に表示されます。 - 選択したレコードカーソルは、レコード15(ビューの最後のレコード)にあります。
TDataSetProvider
データセットは、にリンクされて更新されTADODataSet
ます。(.Openまたは.Refresh呼び出し)。- dataset.Locateメソッドは、挿入/削除に直面しても実際に選択されたレコードを保持するために使用されます。
- レコード15が中央になり、レコード10から20が表示されるように、グリッドが変更されます。
グリッドを元の表示構成に復元して、同じ選択されたレコードにカーソルを置いてレコード5〜15を表示できるように、保存/復元/実行できるものはありますか?
多くの検索試行で私が見つけることができる最も近いものは、Delphi 3.0でTopRow、LeftColを使用して解決された問題です。http://www.delphigroups.info/2/79/314206.html
DBGrids.pasを介して洞窟探検することは、基礎となるデータセットレコードに相対的なバッファーポインターを見つける方法を私に与えません。
delphi - DBGridセルの画面座標を取得するにはどうすればよいですか
現在の行の特定のセルの右下隅のすぐ下に、ポップアップボタンまたは派手なメッセージ(背景色など)を表示したいと思います。
今のところ、グリッド座標を取得する方法だけを考えました
。x = DBGrid.DataSource.DataSet.RecNo
y = DBGrid.Columns [index]
TCustomGrid.CellRectもあります。これは私が望むことを実行しますが、保護されており、別のコンポーネントクラスを継承して作成したくありません。
私が考えることができる1つのクレイジーな回避策は、onDrawColumnCellイベントのTRect-sをいくつかの配列に保存することです。
それで、あなたはどう思いますか ?
編集
現在の行の2番目のセルなどの画面座標を取得するにはどうすればよいですか?
c++builder - VCLコンポーネントを使用して、非常に大きなデータセットをグリッドに表示する
私のC++CADアプリケーションは、ユーザーのモデリング操作のログを保持しているため、適用を解除して再適用することができます。特定のプロジェクトには、ほんの数回の操作が含まれる場合もあれば、数十万回の操作が含まれる場合もあります。このデータをメモリ効率の高い方法で管理するための独自のデータ構造がすでに用意されており、これはうまく機能しています。しかし今、私はユーザーがグリッドで自分の操作ログを検査できるようにする機能を追加しています。(私はEmbarcadero RAD Studio 2010を使用しています。すべてのGUIはVCLを使用しています。)
現在、TDBGridコンポーネントを使用して、操作データを行でユーザーに表示しています。コンポーネントを接続する方法は次のとおりです。
TDBGrid.DataSource = TDataSource
TDataSource.DataSet = TClientDataSet
TClientDataSet.ProviderName = TDataSetProvider
TDataSetProvider.DataSet = ProjectDataSet
ProjectDataSetは、TDataSetから派生したクラスです。
データベースからではなく、自分のデータ構造から操作データを取得しているため、ProjectDataSetクラスのGetFieldData関数とGetRecord関数(およびその他のいくつか)をオーバーライドして、自分のデータ構造から直接データを返すようにしました(データベースクエリ)。これは機能します。
多くの操作を表示するときのメモリ使用量を最小限に抑えるために、TClientDataSetで「FetchOnDemand」プロパティを設定し、「PacketRecords」を100に設定しました。したがって、最初は最初の100個の操作のみがグリッドに表示されます。ユーザーがグリッドの一番下までスクロールすると、次の100個の操作がTClientDataSetによって自動的にフェッチされ、グリッドに表示されます。
これはすべて非常にうまく機能します。私の問題は、ユーザーがグリッドをスクロールすると、TClientDataSetが何もリリースせずにますます多くのレコードをフェッチし続けることです。したがって、非常に大規模なプロジェクトでユーザーが十分に下にスクロールすると、最終的にメモリが不足します。
だから、私の質問は、このGUIを機能させるための最良の方法は何ですか?基本的に、グリッドをスプレッドシートのように動作させたいと思います。操作の数に関係なく、ユーザーが操作リストを上下にスクロールできるようにする(または特定の行にジャンプできるようにする)必要があります。また、GUIコンポーネントがメモリ内に多くのものを保持することは望ましくありません。ユーザーは差し迫った必要はありません。
TDBGrid(または他のVCLコンポーネント)は、一度に少数のレコードのみをフェッチすることで任意の大きなデータセットを表示できるように設計されていると思いますが、それはどのように行われるのでしょうか?
GUIを再考する必要がある場合は、それで問題ありません。しかし、同じGUIを使用して10操作のプロジェクトまたは100,000操作のプロジェクトを表示できれば本当に素晴らしいと思います。
ありがとう。
delphi - 行ごとに異なるデータ型を動的に表示する Delphi グリッド
行ごとに異なるデータ型を持つ可能性のあるデータの db グリッドで表示および編集できるように、Delphi グリッドを作成しようとしています。データ タイプごとに特定のコントロールを表示したいと考えています。たとえば、データ タイプが DateTime の場合、日付を入力したりカレンダーをポップアップしたりできるカスタム編集コントロールを表示したいと考えています。
データは次のようになります。
...そしてデータベースでは、このテーブルには値の可能なタイプごとに列があります。などのBooleanValue
列があります。DateValue
私がしたいのは、その行の「DataType」に応じて適切な編集コントロールを表示するグリッドに単一の「値」列を表示することです。したがって、グリッドは次のようになります。
Value
列の値に基づいて、行ごとに動的に異なる編集コントロールを表示する必要があるようです (ユーザーが列を編集できるようにするため) DataType
。この種の問題を処理する、より高度なグリッドがあることは知っていますが、その能力では、Delphi ですぐに使用できるもの以外は許可されません。
このようなものを作る方法についてのアイデアはありますか?
delphi - DELPHI: 詳細がグリッドにあるマスター詳細に計算値を入力します
ClientDataSets (サービスとアドオン) を使用してマスター/詳細関係を作成しました。サービスは DBLookupComboBox (cboServices) に表示され、サービスが選択されると、アドオンが DBGrid (grdMain) に表示されます。
アドオンには、アドオンが選択されていることを示すチェックボックス、名前フィールド、ユーザーが変更できる数量フィールド、単価フィールド、および合計価格フィールドがあります。
単価と数量を使用して合計金額を更新する OnQuantityChange メソッドを作成しましたが、行から実際のデータを取得して更新するにはどうすればよいですか? 次のようなことを行うために、さまざまなフィールドを参照するにはどうすればよいですか。
delphi - 列集計のTDBGridステータスバー
いくつかの数値列を持つグリッドを取得しました。各列に集計(合計またはカウント)を実装し、対応する列の下に表示する必要があります。
一部のスイート(DevExpressまたはその他)はすでに「デフォルト」で実装されていることを私は知っています。しかし、デフォルトのコントロールまたはJVCLを使用してそれを実装する方法はありますか?
delphi - DelphiのTDBGridでクリックされたタイトルの長方形は何ですか?
TDBGridイベントTitleClick(Column:TColumn)でクリックされたTitleセルの画面座標を特定したいと思います。
ColWidthsプロパティ(TDBGrid = class(DBGrids.TDBGrid)型宣言を介して公開)を使用できますが、TDBGridの水平スクロールと組み合わせて、列がユーザーによって並べ替えられたかどうかを判断するのが困難です。また、この列がグリッドからスクロールアウトされる可能性があることにも注意して、後続の移動およびサイズ変更中にこの列がどこにあるかを追跡したいと思います。
私はこの問題に長い間費やしてきましたが、Delphiはかなり得意なので、これは怠惰な質問ではありません。
delphi - 複数のレコードを dbgrid からドラッグする
いくつかのレコードを含む TDbGrid があります。単純なドラッグ アンド ドロップで複数のレコードをリスト ボックスにドラッグしたい。しかし、ドラッグのためにグリッドの選択されたレコードをクリックすると、複数のレコードを選択した後、現在のレコードを除いて、選択されたすべてのレコードが選択解除されます。この問題を解決するにはどうすればよいですか?
delphi - Delphi-DBGridはUTF8計算フィールドを表示しません
TDBGridがTDataSourceにリンクされており、TFibDataSetが背後にあります。データセットのOnCalcFieldsに、文字列「Russisch(русский)」を追加しようとしています。
問題は、グリッドで結果が:Russisch(????????)として表示されることです。
同じ結果になります
FibDataBaseコンポーネントでは、ConnectParams.CharsetがUTF-8に設定されています。また、DBParams値を設定しましたlc_ctype=UTF8
。
私がここで間違っていることは何ですか?
LE:Delphi XE、Firebird、UTF8-これは私の問題を解決しません。
LE1:問題は計算フィールドでのみ発生します。ライブデータ「ロシア語(русский)」が正しく表示されます。
delphi - Delphi TDBGrid でセル値を変更する方法
VCL TDBGrid (Delphi XE2) で変更された「マスクされた」値を表示する必要があります。つまり、「password」を「xxxxxxxx」に変更するか、大文字の「pass」を「PASS」などに変更します。私のフィールドは動的に作成されるため(ただし、名前はコード化されているため、それらをマスクする方法とタイミングがわかります。つまり、パスワードフィールドの場合は xxxx_PASSW です)OnGetTextイベントを使用できません(私は思います)。
では、これを行う最も効率的な方法は何ですか (私はまだプレゼンテーションの変更に OnDrawColumnCell を使用しているので、使用したいと思います) ?