2009-12-22 96 views
1

我需要動態地改變在某些DBGRID列的位置。比方說,我需要把列數21的位置10.我用:列重新定位在Delphi

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

但是,這也改變了數組本身,這意味着,下一次我要訪問此專欄中,我將需要寫DBGrid.Columns [10],這使得它有點不乾淨,我需要記住所有列等是否有重新定位的列作爲一個更簡單的方法的立場? 如果在此位置更改期間數組索引不改變,這也會很好。

回答

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; 

的缺點是,你必須每次需要訪問網格時運行的循環,造成延遲,所以如果速度是至關重要的,你可能會考慮其他的選擇。

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; 
    // ... 

end;

1

不管怎麼說,對於那些(像我)誰到達了該網頁尋找一種方式重新排序網格列:

type 
    THackAccess = class(TCustomGrid); 

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

輸入列是從零開始的。