4

Delphi 2010では、約15列x5行の水平スクロールバーを持つグリッドを表示する必要があります。

StringGridを使用することにしました。

ただし、マウスボタンを押しながら水平スクロールバーをドラッグしているときに、グリッドをライブでスクロールしたいと思います。

StringGridコンポーネントは、表示されますが、ライブでスクロールしません。マウスボタンが離されるまで待機してから、列を更新し、必要に応じてスクロールします。

また、水平スクロールバーボタン(いわゆる)は列数に比例しません。そして、一番下の行にあるときに下矢印を押すと、右の次の列の一番上に移動します...

これらは一般的なニーズのように思われるので、TStringGridで見つからなかったので驚きました。

これらの2つの問題を回避する方法について何か提案はありますか?DbGridまたは他の標準コンポーネントを使用できますが、回避できる場合は商用グリッドを使用しないことをお勧めします。そして、私はシェアウェアやフリーウェアを使用するつもりはありません...

TIA

4

3 に答える 3

4

最初の質問については、設計時または実行時にgoThumbTrackingStringGridで設定できます。Options

StringGrid1.Options := StringGrid1.Options + [goThumbTracking];


3番目の質問では、コントロールのキーボードイベントハンドラーを使用して、必要な機能を提供できます。例;

procedure TForm1.StringGrid1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
var
  StringGrid: TStringGrid;
begin
  StringGrid := Sender as TStringGrid;
  case Key of
    VK_DOWN:
      if StringGrid.Row = StringGrid.RowCount - 1 then begin
        Key := 0;
        StringGrid.Row := StringGrid.FixedRows;
        if StringGrid.Col = StringGrid.ColCount - 1 then
          StringGrid.Col := StringGrid.FixedCols
        else
          StringGrid.Col := StringGrid.Col + 1;
      end;
    VK_UP:    //...;
    VK_RIGHT: //;
    VK_LEFT:  //;
  end;
end;


2番目の質問では、スクロールコードはのプライベートメソッドに埋め込まれているようですTCustomGrid。私にはそれを達成する方法がわかりません。

于 2010-11-06T09:57:13.963 に答える
3

あなたがサードパーティのコンポーネントに興味がないことに気づいたら-フリーウェア、私もこれらが好きではありませんが、問題を解決したいのであれば、私たち全員が時々犠牲を払わなければなりません。これはこれらの犠牲の1つです!このコンポーネントは無視しておくとよいでしょう。数年の自由時間がなければ、自分でそのようなものを作ることはできません。

TStringGridに基づいて新しいコンポーネントを作成するか(私はそうしません-そもそもボックス内で最適なツールではありません)

ただし、時間をかけてTVirtualStringTreeを学習してください。このコンポーネントは、TStrignGridよりも何年も進んでいます。ソースは利用可能であり、それを使用する多くの人がいます。

また、スクロールバーの変更に対応するためにすでに実装されているイベントがありますOnScroll、OnShowScrollbar

http://www.delphi-gems.com/index.php?option=com_content&task=view&id=12&Itemid=38

stackoverflowで検索すると、tvirtualstringtreeについてさらに詳しく読むことができます

于 2010-11-06T09:28:56.323 に答える
0

次に、TVirtualStringTreeを使用することを提案します。TStringGridコンポーネントを操作することは、さびたはさみで腹を刺すようなものです。

于 2010-11-06T09:45:13.693 に答える