cximagecomboboxitemseditor.pas

来自「胜天进销存源码,国产优秀的进销存」· PAS 代码 · 共 599 行 · 第 1/2 页

PAS
599
字号

procedure TfmImageComboBoxItemsEditor.FillGridViewRecords(
  AImageComboBoxItems: TcxImageComboBoxItems);

  function ValueToStr(AValue: Variant): string;
  begin
    if VarIsNull(AValue) then
      Result := cxImageComboNullValue
    else
      case VarType(AValue) of
        varBoolean:
          Result := BooleanIdents[AValue = True];
        varCurrency:
          Result := CurrToStr(AValue);
        varDispatch:
          Result := cxImageComboErrorVarTypeName;
      else
        Result := VarToStr(AValue);
      end;
  end;

  procedure InitRecord(ARecordIndex: Integer;
    AImageComboBoxItem: TcxImageComboBoxItem);
  var
    ARec: TcxCustomGridRecord;
  begin
    ARec := tvImageComboBoxItems.ViewData.Records[ARecordIndex];
    tvImageComboBoxItems.BeginUpdate;
    try
      ARec.Values[clnImage.Index] := AImageComboBoxItem.ImageIndex;
      ARec.Values[clnValue.Index] := ValueToStr(AImageComboBoxItem.Value);
      ARec.Values[clnValueType.Index] :=
        GetVarTypeName(VarType(AImageComboBoxItem.Value));
      ARec.Values[clnDescription.Index] := AImageComboBoxItem.Description;
      ARec.Values[clnTag.Index] := AImageComboBoxItem.Tag;
    finally
      tvImageComboBoxItems.EndUpdate;
    end;
  end;

var
  I: Integer;
begin
  tvImageComboBoxItems.DataController.RecordCount :=
    AImageComboBoxItems.Count;
  if tvImageComboBoxItems.DataController.RecordCount > 0 then
  begin
    tvImageComboBoxItems.BeginUpdate;
    try
      for I := 0 to tvImageComboBoxItems.DataController.RecordCount - 1 do
        InitRecord(I, AImageComboBoxItems[I])
    finally
      tvImageComboBoxItems.EndUpdate;
    end;
  end
  else
  begin
    tvImageComboBoxItems.DataController.RecordCount := 1;
    InitNewRecord(0);
  end;
end;

procedure TfmImageComboBoxItemsEditor.FocusAndSelectRecord(ARecordIndex: Integer);
begin
  tvImageComboBoxItems.DataController.ClearSelection;
  tvImageComboBoxItems.DataController.FocusedRecordIndex :=
    ARecordIndex;
  tvImageComboBoxItems.Controller.FocusedRecord.Selected := True;
end;

function TfmImageComboBoxItemsEditor.GetVarTypeName(AVarType: Word): string;
begin
  AVarType := AVarType and varTypeMask;
  case AVarType of
    Low(cxImageComboVarTypeNames)..High(cxImageComboVarTypeNames):
      Result := cxImageComboVarTypeNames[AVarType];
    varString:
      Result := cxImageComboStringVarTypeName;
  else
    Result := cxImageComboUnknownVarTypeName;
  end;
end;

function TfmImageComboBoxItemsEditor.GetVarTypeByName(AVarTypeName: string): Word;
var
  I: Integer;
begin
  Result := varError;
  if AVarTypeName = cxImageComboStringVarTypeName then
    Result := varString
  else
    for I := Low(cxImageComboVarTypeNames) to High(cxImageComboVarTypeNames) do
      if cxImageComboVarTypeNames[I] = AVarTypeName then
      begin
        Result := I;
        Break;
      end;
end;

procedure TfmImageComboBoxItemsEditor.InitNewRecord(ARecordIndex: Integer);
begin
  tvImageComboBoxItems.BeginUpdate;
  try
    SetItemValueType(ARecordIndex, varNull);
    tvImageComboBoxItems.DataController.Values[ARecordIndex, clnTag.Index] := 0;
    if ARecordIndex <
      TcxImageComboBoxProperties(clnImage.Properties).Items.Count then
        tvImageComboBoxItems.DataController.Values[ARecordIndex, clnImage.Index] := ARecordIndex
      else
        tvImageComboBoxItems.DataController.Values[ARecordIndex, clnImage.Index] := -1;
  finally
    tvImageComboBoxItems.EndUpdate;
  end;
end;

procedure TfmImageComboBoxItemsEditor.PopulateImages(AImages, ALargeImages: TCustomImageList);
var
  I: Integer;
  ACurrentImages: TCustomImageList;
  AImageComboBoxProperties: TcxImageComboBoxProperties;
begin
  if (AImages = nil) and (ALargeImages = nil) then
    Exit;
  AImageComboBoxProperties := TcxImageComboBoxProperties(clnImage.Properties);
  AImageComboBoxProperties.Images := AImages;
  AImageComboBoxProperties.LargeImages := ALargeImages;
  if ALargeImages <> nil then
    ACurrentImages := ALargeImages
  else
    ACurrentImages := AImages;
  AImageComboBoxProperties.Items.Clear;  
  with TcxImageComboBoxItem(AImageComboBoxProperties.Items.Add) do
  begin
    ImageIndex := -1;
    Value := -1;
  end;
  for I := 0 to ACurrentImages.Count - 1 do
    with TcxImageComboBoxItem(AImageComboBoxProperties.Items.Add) do
    begin
      ImageIndex := I;
      Value := I;
    end;
end;

procedure TfmImageComboBoxItemsEditor.PopulateValueTypeNames;

  procedure AddValueTypeToDropDownMenu(AValuetypeName: string; AValue: Integer);
  var
    AMenuItem: TMenuItem;
  begin
    AMenuItem := TMenuItem.Create(mnuValueTypes);
    AMenuItem.Caption := AValuetypeName;
    AMenuItem.OnClick := miValueTypeClick;
    AMenuItem.Tag := AValue;
    mnuValueTypes.Items.Add(AMenuItem);
  end;

  procedure AddValueTypeToValueTypeColumn(AValuetypeName: string; AValue: Integer);
  var
    AComboBoxProperties: TcxComboBoxProperties;
  begin
    AComboBoxProperties :=
      TcxComboBoxProperties(clnValueType.Properties);
    AComboBoxProperties.Items.AddObject(AValuetypeName, TObject(AValue));
  end;

var
  I: Integer;
begin
  TcxComboBoxProperties(clnValueType.Properties).Items.Clear;
  mnuValueTypes.Items.Clear;
  for I := Low(cxImageComboVarTypeNames) to High(cxImageComboVarTypeNames) do
    if cxImageComboVarTypeNames[I] <> '' then
    begin
      AddValueTypeToDropDownMenu(cxImageComboVarTypeNames[I], I);
      AddValueTypeToValueTypeColumn(cxImageComboVarTypeNames[I], I);
    end;
  AddValueTypeToDropDownMenu(cxImageComboStringVarTypeName, varString);
  AddValueTypeToValueTypeColumn(cxImageComboStringVarTypeName, varString);
end;

procedure TfmImageComboBoxItemsEditor.SetItemValueType(ARecordIndex: Integer; AValueType: Word);
var
  AValue: Variant;
begin
  tvImageComboBoxItems.BeginUpdate;
  try
    tvImageComboBoxItems.DataController.Values[ARecordIndex, clnValueType.Index] :=
      GetVarTypeName(AValueType);
    AValue := tvImageComboBoxItems.DataController.Values[ARecordIndex, clnValue.Index];
    ValueToValueType(AValue, AValueType);
    tvImageComboBoxItems.DataController.Values[ARecordIndex, clnValue.Index] := AValue;
  finally
    tvImageComboBoxItems.EndUpdate;
  end;
end;

procedure TfmImageComboBoxItemsEditor.SetSelectionValueType(AValueType: Word);
var
  I: Integer;
begin
  tvImageComboBoxItems.BeginUpdate;
  try
    for I := 0 to tvImageComboBoxItems.Controller.SelectedRecordCount -1 do
      SetItemValueType(
        tvImageComboBoxItems.Controller.SelectedRecords[I].RecordIndex, AValueType);
  finally
    tvImageComboBoxItems.EndUpdate;
  end;
end;

function TfmImageComboBoxItemsEditor.ValueToValueType(var AValue: Variant; AValueType: Word): Boolean;
var
  AStringValue: string;
begin
  Result := True;
  case AValueType of
    varEmpty:
      if not VarIsSoftNull(AValue) then
      begin
        Result := False;
        VarClear(AValue);
      end;
    varNull:
      if not VarEquals(AValue, cxImageComboNullValue) then
      begin
        AValue := cxImageComboNullValue;
        Result := False;
      end;
    varString, varOleStr:
      if VarEquals(AValue, cxImageComboNullValue) or VarIsNull(AValue) then
         AValue := '';
  else
    if Result then
      try
        AStringValue := VarToStr(AValue);
        VarCast(AValue, AValue, AValueType);
        Result := (AValueType in [varDate, varCurrency, varDouble, varBoolean]) or
          (VarToStr(AValue) = AStringValue);
      except
        Result := False;
        VarClear(AValue);
        VarCast(AValue, AValue, AValueType);
      end;
  end;
end;

procedure TfmImageComboBoxItemsEditor.tvImageComboBoxItemsKeyDown(
  Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  if (Key = VK_INSERT) and (Shift = []) then
  begin
    btnInsertClick(Self);
    Key := 0;
  end;
end;

procedure TfmImageComboBoxItemsEditor.tvImageComboBoxItemsDataControllerRecordChanged(
  ADataController: TcxCustomDataController; ARecordIndex,
  AItemIndex: Integer);

  function GetFocusedItemValueType: Word;
  begin
    Result := GetVarTypeByName(ADataController.GetValue(ARecordIndex, clnValueType.Index));
  end;

var
  AValue: Variant;
begin
  if AItemIndex = clnValue.Index then
  begin
    ADataController.OnRecordChanged := nil;
    try
      AValue := clnValue.EditValue;
      if VarIsSoftNull(AValue) then
        ADataController.SetValue(ARecordIndex, clnValueType.Index, GetVarTypeName(varEmpty))
      else
        if VarEquals(AValue, cxImageComboNullValue) then
          ADataController.SetValue(ARecordIndex, clnValueType.Index, GetVarTypeName(varNull))
        else
          if not ValueToValueType(AValue, GetFocusedItemValueType) then
            ADataController.SetValue(ARecordIndex, clnValueType.Index, cxImageComboStringVarTypeName)
          else
            ADataController.SetValue(ARecordIndex, clnValue.Index, VarToStr(AValue));
    finally
      ADataController.OnRecordChanged := tvImageComboBoxItemsDataControllerRecordChanged;
    end;
  end;
end;

procedure TfmImageComboBoxItemsEditor.tvImageComboBoxItemsEditKeyDown(
  Sender: TcxCustomGridTableView; AItem: TcxCustomGridTableItem;
  AEdit: TcxCustomEdit; var Key: Word; Shift: TShiftState);
begin
  tvImageComboBoxItemsKeyDown(Sender, Key, Shift);
end;

end.

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?