, W, BLACKNESS); PatBlt(DC, R.Left + Flags + (W * 2), R.Top + Flags, W, W, BLACKNESS); end; ExcludeClipRect(DC, R.Left, R.Top, R.Right, R.Bottom); end; inherited PaintWindow(DC); end;
procedure TVDBGridInplaceEdit.SetEditStyle(Value: TEditStyle); begin if Value = FEditStyle then Exit; FEditStyle := Value; case Value of esPickList: begin if FPickList = nil then begin FPickList := TPopupListbox.Create(Self); FPickList.Visible := False; FPickList.Parent := Self; FPickList.OnMouseUp := ListMouseUp; FPickList.IntegralHeight := True; FPickList.ItemHeight := 11; end; FActiveList := FPickList; end; esDataList: begin if FDataList = nil then begin FDataList := TPopupDataList.Create(Self); FDataList.Visible := False; FDataList.Parent := Self; FDataList.OnMouseUp := ListMouseUp; end; FActiveList := FDataList; end; else { cbsNone, cbsEllipsis, or read only field } FActiveList := nil; end; with TCustomVDBGrid(Grid) do Self.ReadOnly := Columns[SelectedIndex].ReadOnly; Repaint; end;
procedure TVDBGridInplaceEdit.StopTracking; begin if FTracking then begin TrackButton(-1, -1); FTracking := False; MouseCapture := False; end; end;
procedure TVDBGridInplaceEdit.TrackButton(X,Y: Integer); var NewState: Boolean; R: TRect; begin SetRect(R, ClientWidth - FButtonWidth, 0, ClientWidth, ClientHeight); NewState := PtInRect(R, Point(X, Y)); if FPressed <> NewState then begin FPressed := NewState; InvalidateRect(Handle, @R, False); end; end;
procedure TVDBGridInplaceEdit.UpdateContents; var Column: TColumn; NewStyle: TEditStyle; MasterField: TField; begin with TCustomVDBGrid(Grid) do Column := Columns[SelectedIndex]; NewStyle := esSimple; case Column.ButtonStyle of cbsEllipsis: NewStyle := esEllipsis; cbsAuto: if Assigned(Column.Field) then with Column.Field do begin { Show the dropdown button only if the field is editable } if FieldKind = fkLookup then begin MasterField := Dataset.FieldByName(KeyFields); { Column.DefaultReadonly will always be True for a lookup field. Test if Column.ReadOnly has been assigned a value of True } if Assigned(MasterField) and MasterField.CanModify and not ((cvReadOnly in Column.AssignedValues) and Column.ReadOnly) then with TCustomVDBGrid(Grid) do if not ReadOnly and DataLink.Active and not Datalink.ReadOnly then NewStyle := esDataList end else if Assigned(Column.Picklist) and (Column.PickList.Count > 0) and not Column.Readonly then NewStyle := esPickList; end; end; EditStyle := NewStyle; inherited UpdateContents; end;
procedure TVDBGridInplaceEdit.CMCancelMode(var Message: TCMCancelMode); begin if (Message.Sender <> Self) and (Message.Sender <> FActiveList) then CloseUp(False); end;
procedure TVDBGridInplaceEdit.WMCancelMode(var Message: TMessage); begin StopTracking; inherited; end;
procedure TVDBGridInplaceEdit.WMKillFocus(var Message: TMessage); begin if SysLocale.FarEast then begin ImeName := Screen.DefaultIme; ImeMode := imDontCare; end; inherited; CloseUp(False); end;
procedure TVDBGridInplaceEdit.WMLButtonDblClk(var Message: TWMLButtonDblClk); begin with Message do if (FEditStyle <> esSimple) and PtInRect(Rect(Width - FButtonWidth, 0, Width, Height), Point(XPos, YPos)) then Exit; inherited; end;
procedure TVDBGridInplaceEdit.WMPaint(var Message: TWMPaint); begin PaintHandler(Message); end;
procedure TVDBGridInplaceEdit.WMSetCursor(var Message: TWMSetCursor); var P: TPoint; begin GetCursorPos(P); if (FEditStyle <> esSimple) and PtInRect(Rect(Width - FButtonWidth, 0, Width, Height), ScreenToClient(P)) then Windows.SetCursor(LoadCursor(0, idc_Arrow)) else inherited; end;
procedure TVDBGridInplaceEdit.WndProc(var Message: TMessage); begin case Message.Msg of wm_KeyDown, wm_SysKeyDown, wm_Char: if EditStyle in [esPickList, esDataList] then with TWMKey(Message) do begin DoDropDownKeys(CharCode, KeyDataToShiftState(KeyData)); if (CharCode <> 0) and FListVisible then begin with TMessage(Message) do SendMessage(FActiveList.Handle, Msg, WParam, LParam); Exit; end; end end; inherited; end;
{ TGridDataLink }
type TIntArray = array[0..MaxMapSize] of Integer; PIntArray = ^TIntArray;
constructor TGridDataLink.Create(AGrid: TCustomVDBGrid); begin inherited Create; FGrid := AGrid; end;
destructor TGridDataLink.Destroy; begin ClearMapping; inherited Destroy; end;
function TGridDataLink.GetDefaultFields: Boolean; var I: Integer; begin Result := True; if DataSet <> nil then Result := DataSet.DefaultFields; if Result and SparseMap then for I := 0 to FFieldCount-1 do if PIntArray(FFieldMap)^[I] < 0 then begin Result := False; Exit; end; end;
function TGridDataLink.GetFields(I: Integer): TField; begin if (0 <= I) and (I < FFieldCount) and (PIntArray(FFieldMap)^[I] >= 0) then Result := DataSet.Fields[PIntArray(FFieldMap)^[I]] else Result := nil; end;
function TGridDataLink.AddMapping(const FieldName: string): Boolean; var Field: TField; NewSize: Integer; begin Result := True; if FFieldCount >= MaxMapSize then RaiseGridError(STooManyColumns); if SparseMap then Field := DataSet.FindField(FieldName) else Field := DataSet.FieldByName(FieldName);
if FFieldCount = FFieldMapSize then begin NewSize := FFieldMapSize; if NewSize = 0 then NewSize := 8 else Inc(NewSize, NewSize); if (NewSize < FFieldCount) then NewSize := FFieldCount + 1; if (NewSize > MaxMapSize) then NewSize := MaxMapSize; ReallocMem(FFieldMap, NewSize * SizeOf(Integer)); FFieldMapSize := NewSize; end; if Assigned(Field) then begin
上一页 [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] ... 下一页 >> [聊天工具]让你的MSN Messenger好友看到你在干嘛__天极Yesky [聊天工具]让你的Foxmail不再撒谎 [聊天工具]IncrediMail让你的E-mail也作秀 [常用软件]让你的Blog拥有Google日历 [常用软件][网络]Stuff Plug 让你的MSN聊天与众不同 [Delphi程序]让你的DBGridEh的Column自动适应宽度
|