1

DBGRid の特定の列の位置を動的に変更する必要があります。列番号 21 を位置 10 に配置する必要があるとします。次を使用します。

DBGrid.Columns[21].Index:=10;

ただし、これにより配列自体も変更されます。つまり、次にこの列にアクセスしたい場合は、DBGrid.Columns[10] を記述する必要があります。これにより、少し汚れてしまいます。すべての列の位置を記憶する必要があります。 . 列の位置を変更する簡単な方法はありますか? この位置変更中に配列インデックスが変更されないことも良いでしょう。

4

3 に答える 3

6

この問題に対処する簡単な方法は、インデックスではなくフィールド名で列にアクセスすることです。次のような方法を導入します。

function GetColumn(aGrid : TDBGrid; aFieldName : string) : TColumn;
var
  I : integer;
begin
  for I := 0 to DBGrid.Columns.Count-1 do
    if aDBGrid.Columns[I].FieldName = aFieldName then
    begin
      Result := aDBGrid.Columns[I];
      exit;
    end;
  Result := nil;
end;

欠点は、グリッドにアクセスする必要があるたびにループを実行する必要があるため、わずかな遅延が発生することです。そのため、速度が重要な場合は、他のオプションを検討してください。

于 2009-12-22T08:26:24.257 に答える
2

とにかく、グリッド内の列を並べ替える方法を探してこのページにたどり着いた (私のような) 人のために:

type
  THackAccess = class(TCustomGrid);

procedure TCustomGrid_MoveColumn(grid: TCustomGrid; fromCol, toCol: integer);
begin
  THackAccess(grid).MoveColumn(fromCol+1, toCol+1);
end;

入力列はゼロから始まります。

于 2015-04-20T17:21:51.633 に答える
2

あなたが正しいです。列がどこにあるかを追跡する必要があります。おそらく別の構造体、または TCustomGrid から派生した子孫オブジェクトとして。

コンテナー オブジェクトを保持します。ここには、列のサイズ、含まれるデータの種類、並べ替え順序、書式設定オプション、グリッド内の位置などを格納します。そして、コンテナを参照するカスタム グリッドがあります。

type
  TpaGrid = class;
  TpaColumnType = (ctText,ctDateTime,ctNumber,ctSize,ctPic,ctFileName);

  TpaColumn = class(TCollectionItem)
   private
    FCaption: string;
    FTitleFont: TFont;
    FTitleAlignment: TAlignment;
    FDataType : TPaColumnType;
    FWidth: Integer;
    FFont: TFont;
    FColor: TColor;
    FBackColor: TColor;
    FAltBackColor: TColor;
    FAlignment: TAlignment;
    FPosition : integer;
    FSortOrder : integer;   // 0=no sort, 1=first, 2=second, etc...
    FSortAscending : boolean;
    // .... and many other interesting attributes 
   public
    // ... published properties
 end;

 TpaColumnClass = class of TPaColumn;

 TpaColumns = class(TCollection)
  private
   FGrid: TPaGrid;
   // ... Getters and Setters, exposing the items as columns
  public
   constructor Create(grid:TPaGrid; ColumnClass: TPaColumnClass);
   function  AddColumn: TPaColumn;
   // ... Load and Save procedures
   // ... published properties
 end;

 TpaGrid = class (TStringGrid)
  // ... overriden methods WMSize, DrawCell, ...
  // ... getters and setters
  private
   FColumns : TpaColumns;
  // ... 

終わり;

于 2009-12-22T07:47:30.433 に答える