cxvieweditor.pas
来自「胜天进销存源码,国产优秀的进销存」· PAS 代码 · 共 966 行 · 第 1/2 页
PAS
966 行
{********************************************************************}
{ }
{ Developer Express Visual Component Library }
{ ExpressQuantumGrid }
{ }
{ 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 EXPRESSQUANTUMGRID 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 cxViewEditor;
{$I cxVer.inc}
interface
uses
{$IFDEF DELPHI6}
DesignIntf, DesignMenus,
{$ELSE}
DsgnIntf,
{$ENDIF}
{$IFDEF DELPHI6}
Variants,
{$ENDIF}
{$IFNDEF NONDB}
DB,
{$ENDIF}
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Menus,
Dialogs, ExtCtrls, cxLibraryReg,
cxClasses, cxStorage, cxDesignWindows, cxCustomData, cxGridCommon, cxGridCustomView;
const
cxGridViewMenuSeparatorCaption = '-';
type
{ TcxViewEditor }
TcxViewEditor = class(TForm)
PViewEditor: TPanel;
procedure FormKeyPress(Sender: TObject; var Key: Char);
private
FView: TcxCustomGridView;
function GetDataController: TcxCustomDataController;
function GetOwnerForm: TComponent;
protected
procedure BeginUpdate;
function CanAddComponent: Boolean;
function CanDeleteComponent(AComponent: TComponent): Boolean;
procedure EndUpdate;
procedure GetSelectionList(AList: TList);
procedure SelectComponent(AComponent: TPersistent);
function UniqueName(AComponent: TComponent;
const ATruncateClassName: string = ScxGridPrefixName): string; virtual;
procedure UpdateDesigner; virtual;
procedure UpdateEditor; virtual;
procedure UpdateSelection; virtual;
property DataController: TcxCustomDataController read GetDataController;
public
FormEditor: TcxDesignFormEditor;
class function GetViewByObject(APersistent: TPersistent): TcxCustomGridView; virtual;
procedure SetView(Value: TcxCustomGridView; ARefreshNeeded: Boolean);
property OwnerForm: TComponent read GetOwnerForm;
property View: TcxCustomGridView read FView;
end;
TcxViewEditorClass = class of TcxViewEditor;
{ TcxCustomGridViewStorage }
TcxCustomGridViewStorage = class(TcxInterfacedPersistent, IcxStoredObject)
private
FView: TcxCustomGridView;
protected
// IcxStoredObject
function GetObjectName: string;
function GetProperties(AProperties: TStrings): Boolean;
procedure GetPropertyValue(const AName: string; var AValue: Variant);
procedure SetPropertyValue(const AName: string; const AValue: Variant);
property View: TcxCustomGridView read FView;
public
constructor Create(AView: TcxCustomGridView); reintroduce; virtual;
class function GetViewClass: TcxCustomGridViewClass; virtual;
end;
TcxCustomGridViewStorageClass = class of TcxCustomGridViewStorage;
{ View Menu Provider }
TcxGridViewMenuItem = class;
TcxGridViewMenuItemActionEvent = procedure(Sender: TcxGridViewMenuItem) of object;
TcxGridViewMenuItems = class
private
FItems: TList;
function GetCount: Integer;
function GetItem(Index: Integer): TcxGridViewMenuItem;
protected
procedure ClearItems;
public
constructor Create;
destructor Destroy; override;
function AddItem(const ACaption: string; AOnClick: TcxGridViewMenuItemActionEvent = nil;
AEnabled: Boolean = True; AChecked: Boolean = False; AData: TObject = nil): TcxGridViewMenuItem;
function AddSeparator: TcxGridViewMenuItem;
procedure Delete(AIndex: Integer);
procedure Prepare(AMenuItem: TMenuItem); overload; virtual;
{$IFDEF DELPHI6}
procedure Prepare(const AMenuItem: TDesignMenuItem); overload; virtual;
{$ENDIF}
procedure RemoveExcessSeparators;
property Count: Integer read GetCount;
property Items[Index: Integer]: TcxGridViewMenuItem read GetItem; default;
end;
TcxGridViewMenuItem = class(TcxGridViewMenuItems)
private
procedure MenuItemClick(Sender: TObject);
protected
OnAction: TcxGridViewMenuItemActionEvent;
public
Caption: string;
Checked: Boolean;
Data: TObject;
Enabled: Boolean;
constructor Create(const ACaption: string; AEnabled: Boolean;
AChecked: Boolean; AData: TObject; AOnAction: TcxGridViewMenuItemActionEvent);
procedure DoAction;
function IsSeparator: Boolean;
procedure Prepare(AMenuItem: TMenuItem); overload; override;
{$IFDEF DELPHI6}
procedure Prepare(const AMenuItem: TDesignMenuItem); overload; override;
{$ENDIF}
end;
TcxCustomGridViewMenuProviderClass = class of TcxCustomGridViewMenuProvider;
TcxCustomGridViewMenuProvider = class
private
FDesigner: IDesigner;
FDesignHelper: TcxDesignHelper;
FGridView: TcxCustomGridView;
FItems: TcxGridViewMenuItems;
{$IFNDEF NONDB}
FDataSourceNames: TStringList;
procedure GetDataSourceName(const S: string);
function GetDBGridView: TcxCustomGridView;
function GetViewDataSource: TDataSource;
procedure SetViewDataSource(Value: TDataSource);
{$ENDIF}
protected
procedure DesignerModified;
procedure ObjectCreated(AObject: TPersistent);
procedure SelectObject(AObject: TPersistent);
procedure InitAdditionalItems; virtual;
procedure InitCopySettingsFromViewItem; virtual;
{$IFNDEF NONDB}
procedure InitDataBindingItems; virtual;
{$ENDIF}
procedure InitItems; virtual;
procedure InitLayoutItems; virtual;
procedure InitStructureItems; virtual;
procedure CopySettings(Sender: TcxGridViewMenuItem);
procedure DeleteView(Sender: TcxGridViewMenuItem);
procedure EditLayoutAndData(Sender: TcxGridViewMenuItem);
procedure SetAsDefault(Sender: TcxGridViewMenuItem);
{$IFNDEF NONDB}
function GetDataSourceNames: TStringList;
procedure LinkToDataSource(Sender: TcxGridViewMenuItem);
{$ENDIF}
{$IFNDEF NONDB}
property ViewDataSource: TDataSource read GetViewDataSource write SetViewDataSource;
property DBGridView: TcxCustomGridView read GetDBGridView;
{$ENDIF}
property Designer: IDesigner read FDesigner;
property DesignHelper: TcxDesignHelper read FDesignHelper;
public
constructor Create(AGridView: TcxCustomGridView); virtual;
destructor Destroy; override;
property GridView: TcxCustomGridView read FGridView;
property Items: TcxGridViewMenuItems read FItems;
end;
{ TcxGridViewList }
TcxGridViewList = class
private
FDesigner: IDesigner;
FViewNames: TStringList;
function GetView(Index: Integer): TcxCustomGridView;
procedure AddViewName(const S: string);
protected
procedure GetViewNames; virtual;
public
constructor Create(ADesigner: IDesigner);
destructor Destroy; override;
function GetViewIndex(AView: TcxCustomGridView): Integer;
property Designer: IDesigner read FDesigner;
property ViewNames: TStringList read FViewNames;
property Views[Index: Integer]: TcxCustomGridView read GetView;
end;
function GetViewEditorClass(AViewClass: TcxCustomGridViewClass): TcxViewEditorClass;
procedure RegisterViewEditorClass(AViewClass: TcxCustomGridViewClass; AViewEditorClass: TcxViewEditorClass);
procedure UnregisterViewEditorClass(AViewClass: TcxCustomGridViewClass; AViewEditorClass: TcxViewEditorClass);
function GetLinkedView(APersistent: TPersistent): TcxCustomGridView;
function IsViewLinkedToComponent(AView: TcxCustomGridView; AComponent: TComponent): Boolean;
function GetViewTemplateRegKey: string;
procedure RegisterDefaultViewStorage(AStorageClass: TcxCustomGridViewStorageClass);
procedure UnregisterDefaultViewStorage(AStorageClass: TcxCustomGridViewStorageClass);
function GetDefaultViewStorageByViewClass(AGridView: TcxCustomGridView): TcxCustomGridViewStorage;
procedure RestoreViewFromTemplate(const ARegPath: string; AView: TcxCustomGridView);
procedure SaveViewToTemplate(const ARegPath: string; AView: TcxCustomGridView);
function CreateViewMenuProvider(AView: TcxCustomGridView): TcxCustomGridViewMenuProvider;
function GetViewMenuProviderClass(AView: TcxCustomGridView): TcxCustomGridViewMenuProviderClass;
procedure RegisterViewMenuProviderClass(AViewClass: TcxCustomGridViewClass;
AViewMenuProviderClass: TcxCustomGridViewMenuProviderClass);
procedure UnregisterViewMenuProviderClass(AViewClass: TcxCustomGridViewClass;
AViewMenuProviderClass: TcxCustomGridViewMenuProviderClass);
function GetViewItemUniqueName(AView: TcxCustomGridView; AItem: TComponent;
const AItemName: string): string;
implementation
{$R *.dfm}
uses
{$IFNDEF NONDB}
TypInfo, cxDBData,
{$ENDIF}
cxGrid, cxGridLevel, cxGridViewLayoutEditor;
type
TcxDesignWindowAccess = class(TcxDesignWindow);
var
ViewEditorClassList: TcxRegisteredClassList;
DefaultViewStorages: TList;
ViewMenuProviderClassList: TcxRegisteredClassList;
function GetViewEditorClass(AViewClass: TcxCustomGridViewClass): TcxViewEditorClass;
begin
Result := TcxViewEditorClass(ViewEditorClassList.FindClass(AViewClass));
end;
procedure RegisterViewEditorClass(AViewClass: TcxCustomGridViewClass; AViewEditorClass: TcxViewEditorClass);
begin
ViewEditorClassList.Register(AViewClass, AViewEditorClass);
end;
procedure UnregisterViewEditorClass(AViewClass: TcxCustomGridViewClass; AViewEditorClass: TcxViewEditorClass);
begin
ViewEditorClassList.Unregister(AViewClass, AViewEditorClass);
end;
function GetLinkedView(APersistent: TPersistent): TcxCustomGridView;
var
I: Integer;
AViewEditorClass: TcxViewEditorClass;
begin
Result := nil;
for I := 0 to ViewEditorClassList.Count - 1 do
begin
AViewEditorClass := TcxViewEditorClass(ViewEditorClassList[I].RegisteredClass);
Result := AViewEditorClass.GetViewByObject(APersistent);
if Result <> nil then
Break;
end;
end;
function IsViewLinkedToComponent(AView: TcxCustomGridView; AComponent: TComponent): Boolean;
function CheckLevels(ALevel: TcxGridLevel): Boolean;
var
I: Integer;
begin
Result := False;
for I := 0 to ALevel.Count - 1 do
if (ALevel[I].GridView = AView) or CheckLevels(ALevel[I]) then
begin
Result := True;
Break;
end;
end;
begin
Result := AView.GetParentComponent = AComponent;
if not Result and (AComponent is TcxCustomGrid) then // check Levels (from Repository)
Result := CheckLevels(TcxCustomGrid(AComponent).Levels);
end;
function GetViewTemplateRegKey: string;
begin
Result := TcxDesignWindow.GetBaseRegKey + '\TcxGridViewTemplate';
end;
procedure RegisterDefaultViewStorage(AStorageClass: TcxCustomGridViewStorageClass);
begin
if DefaultViewStorages = nil then
DefaultViewStorages := TList.Create;
if DefaultViewStorages.IndexOf((AStorageClass)) < 0 then
DefaultViewStorages.Add((AStorageClass));
end;
procedure UnregisterDefaultViewStorage(AStorageClass: TcxCustomGridViewStorageClass);
begin
if DefaultViewStorages <> nil then
DefaultViewStorages.Remove((AStorageClass));
end;
function GetDefaultViewStorageByViewClass(AGridView: TcxCustomGridView): TcxCustomGridViewStorage;
var
I: Integer;
ACurrent, AStorageClass: TcxCustomGridViewStorageClass;
begin
Result := nil;
AStorageClass := nil;
if (DefaultViewStorages <> nil) and (AGridView <> nil) then
begin
for I := 0 to DefaultViewStorages.Count - 1 do
begin
ACurrent := TcxCustomGridViewStorageClass(DefaultViewStorages[I]);
if AGridView.InheritsFrom(ACurrent.GetViewClass) then
if (AStorageClass = nil) or
not AStorageClass.GetViewClass.InheritsFrom(ACurrent.GetViewClass) then
AStorageClass := ACurrent;
if (AStorageClass <> nil) and
(AStorageClass.GetViewClass = AGridView.ClassType) then
Break;
end;
end;
if AStorageClass <> nil then
Result := AStorageClass.Create(AGridView);
end;
procedure RestoreViewFromTemplate(const ARegPath: string; AView: TcxCustomGridView);
var
AStorage: TcxStorage;
AViewStorage: TcxCustomGridViewStorage;
begin
AViewStorage := GetDefaultViewStorageByViewClass(AView);
if AViewStorage = nil then Exit;
try
AStorage := TcxStorage.Create(ARegPath{ + '\' + AViewStorage.GetObjectName});
try
AStorage.Modes := AStorage.Modes + [smSavePublishedClassProperties];
AStorage.RestoreFromRegistry(AViewStorage);
finally
AStorage.Free;
end;
finally
AViewStorage.Free;
end;
end;
procedure SaveViewToTemplate(const ARegPath: string; AView: TcxCustomGridView);
var
AStorage: TcxStorage;
AViewStorage: TcxCustomGridViewStorage;
begin
AViewStorage := GetDefaultViewStorageByViewClass(AView);
if AViewStorage = nil then Exit;
try
AStorage := TcxStorage.Create(ARegPath{ + '\' + AViewStorage.GetObjectName});
try
AStorage.Modes := AStorage.Modes + [smSavePublishedClassProperties];
AStorage.Recreate := False;
AStorage.StoreToRegistry(AViewStorage);
finally
AStorage.Free;
end;
finally
AViewStorage.Free;
end;
end;
function CreateViewMenuProvider(AView: TcxCustomGridView): TcxCustomGridViewMenuProvider;
var
AClass: TcxCustomGridViewMenuProviderClass;
begin
AClass := GetViewMenuProviderClass(AView);
if AClass = nil then
Result := nil
else
Result := AClass.Create(AView);
end;
function GetViewMenuProviderClass(AView: TcxCustomGridView): TcxCustomGridViewMenuProviderClass;
begin
Result := TcxCustomGridViewMenuProviderClass(ViewMenuProviderClassList.FindClass(AView.ClassType));
end;
procedure RegisterViewMenuProviderClass(AViewClass: TcxCustomGridViewClass;
AViewMenuProviderClass: TcxCustomGridViewMenuProviderClass);
begin
ViewMenuProviderClassList.Register(AViewClass, AViewMenuProviderClass);
end;
procedure UnregisterViewMenuProviderClass(AViewClass: TcxCustomGridViewClass;
AViewMenuProviderClass: TcxCustomGridViewMenuProviderClass);
begin
ViewMenuProviderClassList.Unregister(AViewClass, AViewMenuProviderClass);
end;
function GetViewItemUniqueName(AView: TcxCustomGridView; AItem: TComponent;
const AItemName: string): string;
begin
Result := CreateUniqueName(AView.Owner{!!!}, AView, AItem,
Copy(AItem.ClassName, 1, Pos(AItemName, AItem.ClassName) - 1), '');
end;
{ TcxCustomGridViewStorage }
constructor TcxCustomGridViewStorage.Create(AView: TcxCustomGridView);
begin
inherited Create(AView);
FView := AView;
end;
class function TcxCustomGridViewStorage.GetViewClass: TcxCustomGridViewClass;
begin
Result := nil;
end;
function TcxCustomGridViewStorage.GetObjectName: string;
begin
Result := GetViewClass.ClassName;
end;
function TcxCustomGridViewStorage.GetProperties(AProperties: TStrings): Boolean;
begin
Result := False;
end;
procedure TcxCustomGridViewStorage.GetPropertyValue(const AName: string; var AValue: Variant);
begin
end;
procedure TcxCustomGridViewStorage.SetPropertyValue(const AName: string; const AValue: Variant);
begin
end;
{ TcxViewEditor }
class function TcxViewEditor.GetViewByObject(APersistent: TPersistent): TcxCustomGridView;
begin
Result := nil;
end;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?