2010. 9. 13. 02:15
델파이에서 기본적으로 제공하는 DBGrid는 UI 면에서 볼 때 그리 강력하지 않다.
보통의 다른 그리드에서 제공하는 기본적인 기능이 구현되어 있지 않다.
예를 들면 컬럼명을 클릭하면 오름차순이나 내림차순으로 정렬되는 기능(Sort function)이 없고,
컬럼의 오른쪽 끝을 더블 클릭하면 내용의 길이에 따라 컬럼너비가 늘어나는 기능(Column autoFit function)이 없다.
또한 디자이너에서 그리드 외곽선을 솔리드로 만드는 기능이 없다.
이중 Column autoFit 을 구현하는 방법에 대해 기록한다.
목표 : 컬럼명을 더블 클릭하면 해당 컬림이 autoFit이 되도록 한다.
1. DBGrid1DblClick 이벤트 속에서 컬럼명이 더블클릭 되었는지 판단한다.(gridCoord.Y == 0)
2. 컬럼명이 더블클릭 되었으면 해당 컬럼을 다시 그린다.(Repaint)
3. 다시 그릴때 그려지는 텍스트들의 너비를 비교하여, 최대 너비를 구한다.(DrawColumnCell)
4. 구해진 너비를 컬럼너비에 대입한다.
아래 소스처럼 구현 하면 된다. 자세한 설명은 나중에...
출처 : http://delphi.about.com/od/usedbvcl/a/dbgrid_autofit.htm
type
TColumnWidthHelper = record
Index : integer;
MaxWidth : integer;
end;
procedure TForm1.DBGrid1DblClick(Sender: TObject) ;
var
mouseInGrid : TPoint;
gridCoord: TGridCoord;
begin
//Convert "Screen" Mouse to "Grid" Mouse
mouseInGrid := DBGrid1.ScreenToClient(Mouse.CursorPos) ;
gridCoord := DBGrid1.MouseCoord(mouseInGrid.X, mouseInGrid.Y) ;
//Column titles NOT displayed?
if not (dgTitles in DBGrid1.Options) then Exit;
//Titles displayed but we double-clicked on "regular" row?
if gridCoord.Y <> 0 then Exit;
//find Column index
if dgIndicator in DBGrid1.Options then
ColumnWidthHelper.Index := -1 + gridCoord.x
else
ColumnWidthHelper.Index := gridCoord.x;
//Indicator Column?
if ColumnWidthHelper.Index < 0 then Exit;
... // continues below When we are sure that a column title was double clicked we can find the widest entry in that column and set column width ...
//continues from above ...
ColumnWidthHelper.MaxWidth := -1;
//"recalculate" ColumnWidthHelper.MaxWidth
DBGrid1.Repaint;
//"auto size" Column width
DBGrid1.Columns[ColumnWidthHelper.Index].Width := 4 + ColumnWidthHelper.MaxWidth;
end;
//The trick is in the DBGrid1.Repaint call. This forces the grid to repaint itself thus fireing the DrawColumnCell event (for all the visible rows). procedure TForm1.DBGrid1DrawColumnCell( Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState) ; begin //is this is the column we want to auto-size? if DataCol = ColumnWidthHelper.Index then begin //Column has field? if Assigned(Column.Field) then begin //find the widest string ColumnWidthHelper.MaxWidth := Max(ColumnWidthHelper.MaxWidth, DBGrid1.Canvas.TextWidth(Column.Field.DisplayText)) ; end; end; end;
'Windows Programming > Delphi 6/7' 카테고리의 다른 글
Delphi6/7 디렉토리(폴더) 다이알로그, 폴더속에 있는 파일들 복사하기 (0) | 2010.09.13 |
---|---|
Delphi6/7 ShellAPI unit의 ShellExecute (0) | 2010.09.13 |
Delphi6/7 TADOQuery - Binary 조회 (0) | 2010.09.13 |
Delphi6/7 TADOQuery - 기본적인 조회 코드 조각 (0) | 2010.09.13 |
Delphi6/7 TDBGrid - Scroll problem (0) | 2010.09.13 |