2009-12-22 7 views
1

DBGRid의 특정 열의 위치를 ​​동적으로 변경해야합니다.Delphi에서 DBGrid의 열 위치 변경

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

그러나, 이것은 또한, 나는이 열을 액세스 할 그 다음 시간을 의미 배열 자체를 변경, 내가 쓸 필요합니다 :의 나는 내가 사용하는 위치 (10)에 열 번호 (21)를 배치해야한다고 가정 해 봅시다 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; 

입력 열은 제로입니다.