thsChanged; var I: Integer; begin inherited ColWidthsChanged; if (FDatalink.Active or (FColumns.State = csCustomized)) and AcquireLayoutLock then try if FVertical then for I := FIndicatorOffset to FColumns.Count - 1 do FColumns[I - FIndicatorOffset].Width := DefaultColWidth else for I := FIndicatorOffset to ColCount - 1 do FColumns[I - FIndicatorOffset].Width := ColWidths[I]; finally EndLayout; end; end;
function TCustomVDBGrid.CreateColumns: TDBGridColumns; begin Result := TDBGridColumns.Create(Self, TColumn); end;
function TCustomVDBGrid.CreateEditor: TInplaceEdit; begin Result := TVDBGridInplaceEdit.Create(Self); end;
procedure TCustomVDBGrid.CreateWnd; begin BeginUpdate; { prevent updates in WMSize message that follows WMCreate } try inherited CreateWnd; finally EndUpdate; end; UpdateRowCount; UpdateActive; UpdateScrollBar; FOriginalImeName := ImeName; FOriginalImeMode := ImeMode; end;
procedure TCustomVDBGrid.DataChanged; begin if not HandleAllocated then Exit; UpdateRowCount; UpdateScrollBar; UpdateActive; InvalidateEditor; ValidateRect(Handle, nil); Invalidate; end;
procedure TCustomVDBGrid.DefaultHandler(var Msg); var P: TPopupMenu; Cell: TGridCoord; begin inherited DefaultHandler(Msg); if TMessage(Msg).Msg = wm_RButtonUp then with TWMRButtonUp(Msg) do begin Cell := MouseCoord(XPos, YPos); if FVertical then begin if (Cell.Y < FTitleOffset) or (Cell.X < 0) then Exit; P := Columns[RawToDataColumn(Cell.Y)].PopupMenu; end else begin if (Cell.X < FIndicatorOffset) or (Cell.Y < 0) then Exit; P := Columns[RawToDataColumn(Cell.X)].PopupMenu; end; if (P <> nil) and P.AutoPopup then begin SendCancelMode(nil); P.PopupComponent := Self; with ClientToScreen(SmallPointToPoint(Pos)) do P.Popup(X, Y); Result := 1; end; end; end;
procedure TCustomVDBGrid.DeferLayout; var M: TMsg; begin if HandleAllocated and not PeekMessage(M, Handle, cm_DeferLayout, cm_DeferLayout, pm_NoRemove) then PostMessage(Handle, cm_DeferLayout, 0, 0); CancelLayout; end;
procedure TCustomVDBGrid.DefineFieldMap; var I: Integer; begin if FColumns.State = csCustomized then begin { Build the column/field map from the column attributes } DataLink.SparseMap := True; for I := 0 to FColumns.Count-1 do FDataLink.AddMapping(FColumns[I].FieldName); end else { Build the column/field map from the field list order } begin FDataLink.SparseMap := False; with Datalink.Dataset do for I := 0 to FieldCount - 1 do with Fields[I] do if Visible then Datalink.AddMapping(FieldName); end; end;
procedure TCustomVDBGrid.DefaultDrawDataCell(const Rect: TRect; Field: TField; State: TGridDrawState); var Alignment: TAlignment; Value: string; begin Alignment := taLeftJustify; Value := ''''''''; if Assigned(Field) then begin Alignment := Field.Alignment; Value := Field.DisplayText; end; WriteText(Canvas, Rect, 2, 2, Value, Alignment); end;
procedure TCustomVDBGrid.DefaultDrawColumnCell(const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); var Value: string; begin Value := ''''''''; if Assigned(Column.Field) then Value := Column.Field.DisplayText; WriteText(Canvas, Rect, 2, 2, Value, Column.Alignment); end;
procedure TCustomVDBGrid.ReadColumns(Reader: TReader); begin Columns.Clear; Reader.ReadValue; Reader.ReadCollection(Columns); end;
procedure TCustomVDBGrid.WriteColumns(Writer: TWriter); begin Writer.WriteCollection(Columns); end;
procedure TCustomVDBGrid.DefineProperties(Filer: TFiler); begin Filer.DefineProperty(''''Columns'''', ReadColumns, WriteColumns, ((Columns.State = csCustomized) and (Filer.Ancestor = nil)) or ((Filer.Ancestor <> nil) and ((Columns.State <> TCustomVDBGrid(Filer.Ancestor).Columns.State) or (not CollectionsEqual(Columns, TCustomVDBGrid(Filer.Ancestor).Columns, nil,nil)) ))); end;
procedure TCustomVDBGrid.DrawCell(ACol, ARow: Longint; ARect: TRect; AState: TGridDrawState);
function RowIsMultiSelected: Boolean; var Index: Integer; begin Result := (dgMultiSelect in Options) and Datalink.Active and FBookmarks.Find(Datalink.Datasource.Dataset.Bookmark, Index); end;
var OldActive: Integer; Indicator: Integer; Highlight: Boolean; Value: string; DrawColumn: TColumn; FrameOffs: Byte; MultiSelected: Boolean; AACol, AARow: Longint; begin if csLoading in ComponentState then begin Canvas.Brush.Color := Color; Canvas.FillRect(ARect); Exit; end;
AARow := IIF(FVertical, ACol, ARow); AACol := IIF(FVertical, ARow, ACol); Dec(AARow, FTitleOffset); Dec(AACol, FIndicatorOffset);
if (gdFixed in AState) and ([dgRowLines, dgColLines] * Options = [dgRowLines, dgColLines]) then begin InflateRect(ARect, -1, -1); FrameOffs := 1; end else FrameOffs := 2;
if (gdFixed in AState) and (AACol < 0) then begin Canvas.Brush.Color := FixedColor; Canvas.FillRect(ARect); if Assigned(DataLink) and DataLink.Active then begin MultiSelected := False; if AARow >= 0 then begin OldActive := FDataLink.ActiveRecord; try FDatalink.ActiveRecord := AARow; MultiSelected := RowIsMultiselected; finally FDatalink.ActiveRecord := OldActive; end; end; if (AARow = FDataLink.ActiveRecord) or MultiSelected then begin Indicator := 0; if FDataLink.DataSet <> nil then case FDataLink.DataSet.State of dsEdit: Indicator := 1; dsInsert: Indicator := 2; dsBrowse: if MultiSelected then if (AARow <> FDatalink.ActiveRecord) then Indicator := 3 else Indicator := 4; // multiselected and current row end; FIndicators.BkColor := FixedColor; if FVertical then FIndicators.Draw << 上一页 [11] [12] [13] [14] [15] [16] [17] [18] [19] [20] 下一页 |