Перестановка столбцов в DBGrid в Delphi - PullRequest
1 голос
/ 22 декабря 2009

Мне нужно динамически изменить положение определенного столбца в DBGRid. Допустим, мне нужно разместить столбец № 21 в позиции 10. Я использую:

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

Но это также меняет сам массив, это означает, что в следующий раз, когда я захочу получить доступ к этому столбцу, мне нужно будет написать DBGrid.Columns [10], это делает его немного нечистым, мне нужно запомнить позиции все столбцы и т. д. Есть ли более простой способ изменить положение столбца? Также было бы хорошо, если бы индексы массива не менялись во время этого изменения позиции.

Ответы [ 3 ]

6 голосов
/ 22 декабря 2009

Простой способ справиться с проблемой - не обращаться к столбцам по индексу, а по имени поля. Введите метод, подобный этому:

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;

Недостатком является то, что вам приходится запускать цикл каждый раз, когда вам нужно получить доступ к сетке, что вызывает небольшую задержку, поэтому, если скорость важна, вы можете рассмотреть другие варианты.

2 голосов
/ 22 декабря 2009

Вы правы. Вы должны отслеживать, где расположены ваши столбцы. Может быть в отдельной структуре или как объект-потомок, производный от 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;
  // ... 

конец;

1 голос
/ 20 апреля 2015

Во всяком случае, для тех (как я), которые достигли этой страницы, которые ищут способ изменить порядок столбцов в сетке:

type
  THackAccess = class(TCustomGrid);

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

Входные столбцы начинаются с нуля.

...