cximagecomboboxitemseditor.pas

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

PAS
599
字号

{********************************************************************}
{                                                                    }
{       Developer Express Visual Component Library                   }
{       ExpressEditors                                               }
{                                                                    }
{       Copyright (c) 1998-2008 Developer Express Inc.               }
{       ALL RIGHTS RESERVED                                          }
{                                                                    }
{   The entire contents of this file is protected by U.S. and        }
{   International Copyright Laws. Unauthorized reproduction,         }
{   reverse-engineering, and distribution of all or any portion of   }
{   the code contained in this file is strictly prohibited and may   }
{   result in severe civil and criminal penalties and will be        }
{   prosecuted to the maximum extent possible under the law.         }
{                                                                    }
{   RESTRICTIONS                                                     }
{                                                                    }
{   THIS SOURCE CODE AND ALL RESULTING INTERMEDIATE FILES            }
{   (DCU, OBJ, DLL, ETC.) ARE CONFIDENTIAL AND PROPRIETARY TRADE     }
{   SECRETS OF DEVELOPER EXPRESS INC. THE REGISTERED DEVELOPER IS    }
{   LICENSED TO DISTRIBUTE THE EXPRESSEDITORS AND ALL                }
{   ACCOMPANYING VCL CONTROLS AS PART OF AN EXECUTABLE PROGRAM ONLY. }
{                                                                    }
{   THE SOURCE CODE CONTAINED WITHIN THIS FILE AND ALL RELATED       }
{   FILES OR ANY PORTION OF ITS CONTENTS SHALL AT NO TIME BE         }
{   COPIED, TRANSFERRED, SOLD, DISTRIBUTED, OR OTHERWISE MADE        }
{   AVAILABLE TO OTHER INDIVIDUALS WITHOUT EXPRESS WRITTEN CONSENT   }
{   AND PERMISSION FROM DEVELOPER EXPRESS INC.                       }
{                                                                    }
{   CONSULT THE END USER LICENSE AGREEMENT FOR INFORMATION ON        }
{   ADDITIONAL RESTRICTIONS.                                         }
{                                                                    }
{********************************************************************}

unit cxImageComboBoxItemsEditor;

{$I cxVer.inc}

interface

uses
{$IFDEF DELPHI6}
  Variants,
{$ENDIF}
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
  Dialogs, cxStyles, cxCustomData, cxGraphics, cxFilter, cxData,
  cxDataStorage, cxEdit, cxImageComboBox, cxLookAndFeels,
  cxGridCustomTableView, cxGridTableView, cxControls, cxGridCustomView,
  cxClasses, cxGridLevel, cxGrid, Menus, StdCtrls, ExtCtrls, cxTextEdit,
  cxMaskEdit, cxDropDownEdit, cxContainer, cxGroupBox,
  cxLookAndFeelPainters, cxButtons, cxCalendar, ImgList;

type
  TfmImageComboBoxItemsEditor = class(TForm)
    Panel1: TPanel;
    btnAdd: TcxButton;
    btnDelete: TcxButton;
    btnInsert: TcxButton;
    mnuValueTypes: TPopupMenu;
    miAdd: TMenuItem;
    miInsert: TMenuItem;
    miDelete: TMenuItem;
    N1: TMenuItem;
    miHelp: TMenuItem;
    Panel3: TPanel;
    cxgImageComboBoxItems: TcxGrid;
    tvImageComboBoxItems: TcxGridTableView;
    clnImage: TcxGridColumn;
    clnValue: TcxGridColumn;
    clnDescription: TcxGridColumn;
    clnTag: TcxGridColumn;
    lvImageComboBoxItems: TcxGridLevel;
    Bevel1: TBevel;
    btnOk: TcxButton;
    btnCancel: TcxButton;
    clnValueType: TcxGridColumn;
    btnSelectAll: TcxButton;
    btnValueType: TcxButton;
    procedure FormCreate(Sender: TObject);
    procedure btnAddClick(Sender: TObject);
    procedure btnDeleteClick(Sender: TObject);
    procedure btnInsertClick(Sender: TObject);
    procedure btnOkClick(Sender: TObject);
    procedure btnSelectAllClick(Sender: TObject);
    procedure clnValueTypePropertiesEditValueChanged(Sender: TObject);
    procedure miValueTypeClick(Sender: TObject);
    procedure tvImageComboBoxItemsKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure tvImageComboBoxItemsDataControllerRecordChanged(
      ADataController: TcxCustomDataController; ARecordIndex,
      AItemIndex: Integer);
    procedure tvImageComboBoxItemsEditKeyDown(Sender: TcxCustomGridTableView;
      AItem: TcxCustomGridTableItem; AEdit: TcxCustomEdit; var Key: Word;
      Shift: TShiftState);
  private
    { Private declarations }
    FImageComboBoxItems: TcxImageComboBoxItems;
    FImages, FLargeImages: TCustomImageList;
    procedure FillGridViewRecords(AImageComboBoxItems: TcxImageComboBoxItems);
    procedure FocusAndSelectRecord(ARecordIndex: Integer);
    function GetVarTypeName(AVarType: Word): string;
    function GetVarTypeByName(AVarTypeName: string): Word;
    procedure InitNewRecord(ARecordIndex: Integer);
    procedure PopulateImages(AImages, ALargeImages: TCustomImageList);
    procedure PopulateValueTypeNames;
    procedure SetItemValueType(ARecordIndex: Integer; AValueType: Word);
    procedure SetSelectionValueType(AValueType: Word);
    function ValueToValueType(var AValue: Variant; AValueType: Word): Boolean;
  public
    { Public declarations }
    constructor Create(AItems: TcxImageComboBoxItems;
      AImages, ALargeImages: TCustomImageList); reintroduce; overload;
  end;

implementation

uses
  cxVariants, TypInfo;

{$R *.dfm}

const
  cxImageComboErrorVarTypeName = 'ERROR';
  cxImageComboNullValue = '(Null)';
  cxImageComboOleStrVarTypeName = 'OleStr';
  cxImageComboStringVarTypeName = 'String';
  cxImageComboUnknownVarTypeName = '(Unknown)';

var
  cxImageComboVarTypeNames: array[varEmpty..{$IFDEF DELPHI6}varInt64{$ELSE}varByte{$ENDIF}]
    of string = (
      'Unassigned', // varEmpty
      'Null',       // varNull
      'Smallint',   // varSmallint
      'Integer',    // varInteger
      'Single',     // varSingle
      'Double',     // varDouble
      'Currency',   // varCurrency
      'Date',       // varDate
      'OleStr',     // varOleStr
      '',           // varDispatch
      '',           // varError
      'Boolean',    // varBoolean
      '',           // varVariant
      '',           // varUnknown
      '',           // [varDecimal]
      '',           // [undefined]
{$IFDEF DELPHI6}
      'Shortint',   // varShortInt
{$ELSE}
      '',
{$ENDIF}
      'Byte'       // varByte
{$IFDEF DELPHI6}
      ,'Word',       // varWord
      'LongWord',   // varLongWord
      'Int64'       // varInt64
{$ENDIF}
    );

constructor TfmImageComboBoxItemsEditor.Create(AItems: TcxImageComboBoxItems;
  AImages, ALargeImages: TCustomImageList);
begin
  FImageComboBoxItems := AItems;
  FImages := AImages;
  FLargeImages :=  ALargeImages;
  inherited Create(Application);
end;

procedure TfmImageComboBoxItemsEditor.FormCreate(Sender: TObject);
begin
  PopulateValueTypeNames;
  PopulateImages(FImages, FLargeImages);
  FillGridViewRecords(FImageComboBoxItems);
  clnImage.ApplyBestFit;
  tvImageComboBoxItems.Controller.GoToLast(False);
end;

procedure TfmImageComboBoxItemsEditor.btnAddClick(Sender: TObject);
begin
  tvImageComboBoxItems.DataController.Post;
  tvImageComboBoxItems.BeginUpdate;
  try
    tvImageComboBoxItems.DataController.AppendRecord;
    InitNewRecord(tvImageComboBoxItems.DataController.RecordCount - 1);
  finally
    tvImageComboBoxItems.EndUpdate;
  end;
  FocusAndSelectRecord(tvImageComboBoxItems.DataController.RecordCount - 1);
end;

procedure TfmImageComboBoxItemsEditor.btnDeleteClick(Sender: TObject);
var
  AIndex: Integer;
begin
  if tvImageComboBoxItems.DataController.RecordCount = 0 then
    Exit;
  AIndex := tvImageComboBoxItems.Controller.FocusedRecordIndex;
  tvImageComboBoxItems.DataController.DeleteSelection;
  if tvImageComboBoxItems.DataController.RecordCount > AIndex then
  begin
    tvImageComboBoxItems.Controller.FocusedRecordIndex := AIndex;
    tvImageComboBoxItems.Controller.FocusedRecord.Selected := True;
  end
  else
    tvImageComboBoxItems.Controller.GoToLast(False);
end;

procedure TfmImageComboBoxItemsEditor.btnOkClick(Sender: TObject);

  procedure InitImageComboBoxItem(AItem: TcxImageComboBoxItem;
    ARecord: TcxCustomGridRecord);

      function VarToInteger(AValue: Variant): Integer;
      begin
        if VarIsNull(AValue) then
          Result := 0
        else
          Result := AValue;
      end;

  var
    AValue: Variant;
    AVarType: Word;
  begin
    AItem.Description := VarToStr(ARecord.Values[clnDescription.Index]);
    AItem.Tag := VarToInteger(ARecord.Values[clnTag.Index]);
    AItem.ImageIndex := VarToInteger(ARecord.Values[clnImage.Index]);
    AValue := ARecord.Values[clnValue.Index];
    AVarType := GetVarTypeByName(ARecord.Values[clnValueType.Index]);
    case AVarType of
      varNull:
        AValue := Null;
      varEmpty:
        VarClear(AValue);
      varError:
      begin
        AValue := Null;
        raise EVariantError.Create('Invalid value type');
      end;
      else
        VarCast(AValue, AValue, AVarType);
    end;
    AItem.Value := AValue;
  end;

var
  I: Integer;
begin
  FImageComboBoxItems.Clear;
  for I := 0 to tvImageComboBoxItems.ViewData.RecordCount - 1 do
    InitImageComboBoxItem(
      FImageComboBoxItems.Add as TcxImageComboBoxItem,
      tvImageComboBoxItems.ViewData.Records[I]);
end;

procedure TfmImageComboBoxItemsEditor.btnInsertClick(Sender: TObject);

  function InsertRecordBeforeFocused: Integer;
  begin
    Result := tvImageComboBoxItems.DataController.InsertRecord(
      tvImageComboBoxItems.Controller.FocusedRecord.Index);
  end;

var
  ARecordIndex: Integer;
begin
  tvImageComboBoxItems.DataController.Post;
  if tvImageComboBoxItems.Controller.FocusedRecord = nil then
    btnAddClick(nil)
  else
  begin
    tvImageComboBoxItems.BeginUpdate;
    try
      ARecordIndex := InsertRecordBeforeFocused;
      InitNewRecord(ARecordIndex);
    finally
      tvImageComboBoxItems.EndUpdate;
    end;
    FocusAndSelectRecord(ARecordIndex);
  end;
end;

procedure TfmImageComboBoxItemsEditor.btnSelectAllClick(Sender: TObject);
begin
  tvImageComboBoxItems.DataController.SelectAll;
end;

procedure TfmImageComboBoxItemsEditor.clnValueTypePropertiesEditValueChanged(
  Sender: TObject);
begin
  SetItemValueType(tvImageComboBoxItems.DataController.FocusedRecordIndex,
    GetVarTypeByName(TcxComboBox(Sender).Text));
end;

procedure TfmImageComboBoxItemsEditor.miValueTypeClick(Sender: TObject);
begin
  SetSelectionValueType(TMenuItem(Sender).Tag);
end;

⌨️ 快捷键说明

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