TDBGrid 如何把現在那一列用不同顏色顯示? |
尚未結案
|
cancer
高階會員 發表:58 回覆:319 積分:190 註冊:2004-07-31 發送簡訊給我 |
|
tobylin
一般會員 發表:1 回覆:15 積分:18 註冊:2009-12-25 發送簡訊給我 |
DBGrid增強顯示,
只要在程式裡加上粗體字, **************************************** unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Grids, DBGrids, DB, DBTables, uDBGRID; Type TDBGrid = uDBGrid.TDBGrid; type TForm1 = class(TForm) Database1: TDatabase; . . . . . ************************************************************************ unit uDBGrid; interface uses Windows, DBGrids, Classes, Messages, Types,Grids,Graphics,Forms, DB, SysUtils, Controls; type TDBGrid = class(DBGrids.TDBGrid) private FVertScrollBar: Boolean; FOldGridWnd: TWndMethod; FOddRowColor: TColor; FEvenRowColor: TColor; FActiveRowColor: TColor; FOriginalOptions: TDBGridOptions; FAllowAppend: Boolean; procedure NewGridWnd(var aMessage: TMessage); protected procedure ColEnter; override; procedure ColExit; override; procedure KeyDown(var Key: Word; Shift: TShiftState); override; procedure DrawCell(aCol, aRow: Longint; aRect: TRect; aState: TGridDrawState); override; procedure Scroll(Distance: Integer); override; procedure Paint; override; public constructor Create(AOwner: TComponent); override; destructor Destroy; override; property AllowAppend: Boolean read FAllowAppend write FAllowAppend default True; property InplaceEditor; property OddRowColor: TColor read FOddRowColor write FOddRowColor default clCream; property EvenRowColor: TColor read FEvenRowColor write FEvenRowColor default clMoneyGreen; property ActiveRowColor: TColor read FActiveRowColor write FActiveRowColor default $00E7CFFF; property VertScrollBar: Boolean read FVertScrollBar write FVertScrollBar default True; end; implementation { TDBGrid } constructor TDBGrid.Create(AOwner: TComponent); begin inherited; FOldGridWnd := WindowProc; WindowProc := NewGridWnd; FOddRowColor := clCream; FEvenRowColor := $00FFF2E8; FActiveRowColor := $00F2E8FF; FVertScrollBar := True; AllowAppend := False; end; destructor TDBGrid.Destroy; begin WindowProc := FOldGridWnd; inherited Destroy; end; procedure TDBGrid.DrawCell(aCol, aRow: Integer; aRect: TRect; aState: TGridDrawState); function RowIsMultiSelected: Boolean; var Index: Integer; begin Result := (dgMultiSelect in Options) and Datalink.Active and SelectedRows.Find(Datalink.Datasource.Dataset.Bookmark, Index); end; var lOldActiveRecord: Integer; lDrawColumn: TColumn; begin if not Assigned(DataSource) then exit; if not Assigned(DataSource.DataSet) then exit; if not DataSource.DataSet.Active then exit; if (dgTitles in Options) and (ARow = 0) or (gdFixed in AState) and (ACol - IndicatorOffset < 0) then begin inherited DrawCell(ACol, ARow, ARect, AState); Exit; end; if (dgTitles in Options) then Dec(ARow); Dec(ACol, IndicatorOffset); if (gdFixed in AState) and ([dgRowLines, dgColLines] * Options = [dgRowLines, dgColLines]) then InflateRect(ARect, -1, -1) else with Canvas do begin lDrawColumn := Columns[ACol]; if not lDrawColumn.Showing then Exit; Font := lDrawColumn.Font; Brush.Color := lDrawColumn.Color; Font.Color := lDrawColumn.Font.Color; if Odd(ARow) then Brush.Color := FEvenRowColor else Brush.Color := FOddRowColor; if (aCol = 0) and (lDrawColumn.Field.FieldKind = fkCalculated) then Brush.Color := clBtnFace; if not Assigned(DataLink) or not DataLink.Active then FillRect(ARect) else begin if ARow >= 0 then begin lOldActiveRecord := DataLink.ActiveRecord; try DataLink.ActiveRecord := ARow; if (DataLink.ActiveRecord = Row - 1) or RowIsMultiSelected then begin Font.Color := clBlack; Brush.Color := FActiveRowColor; end; if DefaultDrawing then DefaultDrawColumnCell(ARect, ACol, LDrawColumn, AState); if Columns.State = csDefault then DrawDataCell(ARect, lDrawColumn.Field, AState); DrawColumnCell(ARect, ACol, lDrawColumn, AState); finally DataLink.Activerecord := lOldActiveRecord; end; // end try end; // end if aRow > 0 if DefaultDrawing and (gdSelected in AState) and ((dgAlwaysShowSelection in Options) or Focused) and not (csDesigning in Componentstate) and not (dgRowSelect in Options) and (ValidParentForm(self).ActiveControl = self) then begin Windows.DrawFocusRect(Handle, ARect); Canvas.Brush.COlor := clNavy; Canvas.FillRect(ARect); Canvas.Font.Color := clWhite; Canvas.Font.Style := [fsBold]; DefaultDrawColumnCell(ARect, ACol, lDrawColumn, AState); end; end; end; if (gdFixed in AState) and ([dgRowLines, dgColLines] * Options = [dgRowLines, dgColLines]) then begin InflateRect(ARect, -2, -2); DrawEdge(Canvas.Handle, ARect, BDR_RAISEDINNER, BF_BOTTOMRIGHT); DrawEdge(Canvas.Handle, ARect, BDR_SUNKENINNER, BF_TOPLEFT); end; end; procedure TDBGrid.NewGridWnd(var aMessage: TMessage); var IsNeg: Boolean; begin if (aMessage.Msg = WM_MOUSEWHEEL) and DataSource.DataSet.Active then begin IsNeg := short(aMessage.WParamHi) < 0; if IsNeg then DataSource.DataSet.MoveBy(1) else DataSource.DataSet.MoveBy(-1) end else FOldGridWnd(aMessage); end; procedure TDBGrid.Paint; begin if not FVertScrollBar then SetScrollRange(Self.Handle, SB_VERT, 0, 0, False); inherited Paint; end; procedure TDBGrid.Scroll(Distance: Integer); begin inherited Scroll(Distance); Refresh; end; procedure TDBGrid.KeyDown(var Key: Word; Shift: TShiftState); var lStateChange: TNotifyEvent; begin inherited; if (Key = VK_Space) and not SelectedField.ReadOnly and (SelectedField is TBooleanField) then begin lStateChange := DataSource.OnStateChange; DataSource.OnStateChange := nil; try DataLink.DataSet.Edit; SelectedField.AsBoolean := not SelectedField.AsBoolean; DataLink.DataSet.Post; finally DataSource.OnStateChange := lStateChange; end; end; if (not FAllowAppend) and (DataLink.DataSet.Eof) and (Key = VK_DOWN) then begin Key := 0; DataLink.DataSet.Cancel; end; end; procedure TDBGrid.ColEnter; begin inherited; if SelectedField is TBooleanField then begin FOriginalOptions := Options; Options := Options - [dgEditing]; end; end; procedure TDBGrid.ColExit; begin inherited; if SelectedField is TBooleanField then Options := FOriginalOptions end; end. |
cancer
高階會員 發表:58 回覆:319 積分:190 註冊:2004-07-31 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |