VK_PRIOR: begin ClearSelection; MoveBy(-VisibleColCount); end; VK_INSERT: if CanModify and (not ReadOnly) and (dgEditing in Options) then begin ClearSelection; Insert; end; VK_TAB: if not (ssAlt in Shift) then Tab(not (ssShift in Shift)); VK_ESCAPE: begin FDatalink.Reset; ClearSelection; if not (dgAlwaysShowEditor in Options) then HideEditor; end; VK_F2: EditorMode := True; end else if ssCtrl in Shift then begin if (Key in RowMovementKeys) then ClearSelection; case Key of VK_UP, VK_PRIOR: MoveBy(-FDatalink.ActiveRecord); VK_DOWN, VK_NEXT: MoveBy(FDatalink.BufferCount - FDatalink.ActiveRecord - 1); VK_LEFT: MoveCol(FIndicatorOffset); VK_RIGHT: MoveCol(ColCount - 1); VK_HOME: First; VK_END: Last; VK_DELETE: if (not ReadOnly) and not IsEmpty and CanModify and DeletePrompt then if FBookmarks.Count > 0 then FBookmarks.Delete else Delete; end end else case Key of VK_UP: PriorRow(True); VK_DOWN: NextRow(True); VK_LEFT: if dgRowSelect in Options then PriorRow(False) else MoveCol(Col - 1); VK_RIGHT: if dgRowSelect in Options then NextRow(False) else MoveCol(Col + 1); VK_HOME: if (ColCount = FIndicatorOffset+1) or (dgRowSelect in Options) then begin ClearSelection; First; end else MoveCol(FIndicatorOffset); VK_END: if (ColCount = FIndicatorOffset+1) or (dgRowSelect in Options) then begin ClearSelection; Last; end else MoveCol(ColCount - 1); VK_NEXT: begin ClearSelection; MoveBy(VisibleRowCount); end; VK_PRIOR: begin ClearSelection; MoveBy(-VisibleRowCount); end; VK_INSERT: if CanModify and (not ReadOnly) and (dgEditing in Options) then begin ClearSelection; Insert; end; VK_TAB: if not (ssAlt in Shift) then Tab(not (ssShift in Shift)); VK_ESCAPE: begin FDatalink.Reset; ClearSelection; if not (dgAlwaysShowEditor in Options) then HideEditor; end; VK_F2: EditorMode := True; end; end;
procedure TCustomVDBGrid.KeyPress(var Key: Char); begin if not (dgAlwaysShowEditor in Options) and (Key = #13) then FDatalink.UpdateData; inherited KeyPress(Key); end;
{ InternalLayout is called with layout locks and column locks in effect } procedure TCustomVDBGrid.InternalLayout; var I, J, K: Integer; Fld: TField; Column: TColumn; SeenPassthrough: Boolean; RestoreCanvas: Boolean;
function FieldIsMapped(F: TField): Boolean; var X: Integer; begin Result := False; if F = nil then Exit; for X := 0 to FDatalink.FieldCount-1 do if FDatalink.Fields[X] = F then begin Result := True; Exit; end; end;
begin if (csLoading in ComponentState) then Exit;
if HandleAllocated then KillMessage(Handle, cm_DeferLayout);
{ Check for Columns.State flip-flop } SeenPassthrough := False; for I := 0 to FColumns.Count-1 do begin if (FColumns[I] is TPassthroughColumn) then SeenPassthrough := True else if SeenPassthrough then begin { We have both custom and passthrough columns. Kill the latter } for J := FColumns.Count-1 downto 0 do begin Column := FColumns[J]; if Column is TPassthroughColumn then Column.Free; end; Break; end; end;
FIndicatorOffset := 0; if dgIndicator in Options then Inc(FIndicatorOffset); FDatalink.ClearMapping; if FDatalink.Active then DefineFieldMap; if FColumns.State = csDefault then begin { Destroy columns whose fields have been destroyed or are no longer in field map } if (not FDataLink.Active) and (FDatalink.DefaultFields) then FColumns.Clear else for J := FColumns.Count-1 downto 0 do with FColumns[J] do << 上一页 [11] [12] [13] [14] [15] [16] [17] [18] [19] [20] 下一页 |