📄 dxbardbnav.pas
字号:
{*******************************************************************}
{ }
{ Developer Express Visual Component Library }
{ ExpressBars DB Navigator }
{ }
{ 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 EXPRESSBARS 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 dxBarDBNav;
interface
{$I cxVer.inc}
uses
Classes, Messages, DB, cxClasses, dxBar;
type
TdxBarDBNavigator = class;
TdxBarDBNavButton = class;
TdxBarDBNavDataLink = class(TDataLink)
private
FNavigator: TdxBarDBNavigator;
protected
procedure ActiveChanged; override;
procedure DataSetChanged; override;
procedure EditingChanged; override;
end;
TdxBarDBEnableType = (dxdbtCanModify, dxdbtNotEOF, dxdbtNotBOF,
dxdbtHasRecords, dxdbtIsModified, dxdbtIsNotModified);
TdxBarDBEnableTypes = set of TdxBarDBEnableType;
TdxBarDBCheckLink = class(TCollectionItem)
private
FEnableTypes: TdxBarDBEnableTypes;
FFreeNotificator: TcxFreeNotificator;
FItem: TdxBarItem;
procedure FreeNotification(Sender: TComponent);
function GetDBNavigator: TdxBarDBNavigator;
procedure SetEnableTypes(Value: TdxBarDBEnableTypes);
procedure SetItem(Value: TdxBarItem);
public
constructor Create(Collection: TCollection); override;
destructor Destroy; override;
procedure Assign(Value: TPersistent); override;
property DBNavigator: TdxBarDBNavigator read GetDBNavigator;
published
property Item: TdxBarItem read FItem write SetItem;
property EnableTypes: TdxBarDBEnableTypes read FEnableTypes write SetEnableTypes;
end;
TdxBarDBCheckLinks = class(TCollection)
private
FDBNavigator: TdxBarDBNavigator;
function GetItem(Index: Integer): TdxBarDBCheckLink;
protected
function GetOwner: TPersistent; override;
public
function Add: TdxBarDBCheckLink;
property Items[Index: Integer]: TdxBarDBCheckLink read GetItem; default;
end;
TdxBarDBNavButtonType = (dxbnFirst, dxbnPrior, dxbnNext, dxbnLast,
dxbnInsert, dxbnDelete, dxbnEdit, dxbnPost, dxbnCancel, dxbnRefresh);
TdxBarDBNavButtonTypes = set of TdxBarDBNavButtonType;
TdxBarDBNavButton = class(TdxBarButton)
private
FBarDBNavigator: TdxBarDBNavigator;
FNavButton: TdxBarDBNavButtonType;
procedure SetNavButton(Value: TdxBarDBNavButtonType);
protected
procedure Loaded; override;
public
destructor Destroy; override;
procedure DoClick; override;
published
property BarDBNavigator: TdxBarDBNavigator read FBarDBNavigator write FBarDBNavigator;
property NavButton: TdxBarDBNavButtonType read FNavButton write SetNavButton;
end;
TdxBarDBNavigator = class(TComponent)
private
FBarManager: TdxBarManager;
FCategoryName: string;
FConfirmDelete: Boolean;
FDataLink: TdxBarDBNavDataLink;
FDBCheckLinks: TdxBarDBCheckLinks;
FSetVisFlag: Boolean;
FVisibleButtons: TdxBarDBNavButtonTypes;
function GetDataSource: TDataSource;
procedure SetBarManager(Value: TdxBarManager);
procedure SetCategoryName(Value: string);
procedure SetDataSource(Value: TDataSource);
procedure SetDBNavItems(Value: TdxBarDBCheckLinks);
procedure SetVisibleButtons(Value: TdxBarDBNavButtonTypes);
procedure AddButton(AButton: TdxBarDBNavButton);
procedure RemoveButton(AButton: TdxBarDBNavButton);
procedure CheckItemsEnable;
protected
Buttons: array[TdxBarDBNavButtonType] of TdxBarDBNavButton;
procedure ActiveChanged;
procedure DataChanged;
procedure EditingChanged;
procedure Notification(AComponent: TComponent; Operation: TOperation); override;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
published
property BarManager: TdxBarManager read FBarManager write SetBarManager;
property CategoryName: string read FCategoryName write SetCategoryName;
property ConfirmDelete: Boolean read FConfirmDelete write FConfirmDelete;
property DataSource: TDataSource read GetDataSource write SetDataSource;
property DBCheckLinks: TdxBarDBCheckLinks read FDBCheckLinks write SetDBNavItems;
property VisibleButtons: TdxBarDBNavButtonTypes read FVisibleButtons
write SetVisibleButtons default [];
end;
implementation
{$R dxBarDBNav.res}
uses
Windows, SysUtils, Forms, dxBarDBNavStrs;
const
BtnResStr = 'DXBARDBNAVBTN_';
dxBarDBNavBtnName = 'dxBarDBNav';
{ TdxBarDBNavDataLink }
procedure TdxBarDBNavDataLink.ActiveChanged;
begin
if FNavigator <> nil then FNavigator.ActiveChanged;
end;
procedure TdxBarDBNavDataLink.DataSetChanged;
begin
if FNavigator <> nil then FNavigator.DataChanged;
end;
procedure TdxBarDBNavDataLink.EditingChanged;
begin
if FNavigator <> nil then FNavigator.EditingChanged;
end;
{ TdxBarDBCheckLink }
procedure TdxBarDBCheckLink.FreeNotification(Sender: TComponent);
begin
Free;
end;
function TdxBarDBCheckLink.GetDBNavigator: TdxBarDBNavigator;
begin
Result := TdxBarDBCheckLinks(Collection).FDBNavigator;
end;
procedure TdxBarDBCheckLink.SetEnableTypes(Value: TdxBarDBEnableTypes);
begin
if FEnableTypes <> Value then
begin
FEnableTypes := Value;
TdxBarDBCheckLinks(Collection).FDBNavigator.DataChanged;
end;
end;
procedure TdxBarDBCheckLink.SetItem(Value: TdxBarItem);
begin
if Value <> FItem then
begin
if FItem <> nil then
FFreeNotificator.RemoveSender(FItem);
FItem := Value;
if FItem <> nil then
FFreeNotificator.AddSender(FItem);
end;
end;
constructor TdxBarDBCheckLink.Create(Collection: TCollection);
begin
inherited Create(Collection);
FFreeNotificator := TcxFreeNotificator.Create(nil);
FFreeNotificator.OnFreeNotification := FreeNotification;
end;
destructor TdxBarDBCheckLink.Destroy;
begin
Item := nil;
FreeAndNil(FFreeNotificator);
inherited Destroy;
end;
procedure TdxBarDBCheckLink.Assign(Value: TPersistent);
var
ADBNavItem: TdxBarDBCheckLink;
begin
if Value is TdxBarDBCheckLink then
begin
ADBNavItem := TdxBarDBCheckLink(Value);
if (ADBNavItem.Item <> nil) and (DBNavigator <> nil) and
(csUpdating in DBNavigator.ComponentState) and (DBNavigator.BarManager <> nil) then
Item := DBNavigator.BarManager.GetItemByName(ADBNavItem.Item.Name)
else
Item := ADBNavItem.Item;
FEnableTypes := ADBNavItem.FEnableTypes;
end
else
inherited Assign(Value);
end;
{ TdxBarDBCheckLinks }
function TdxBarDBCheckLinks.GetItem(Index: Integer): TdxBarDBCheckLink;
begin
if (Index > -1) and (Index < Count) then
Result := TdxBarDBCheckLink(inherited Items[Index])
else Result := nil;
end;
function TdxBarDBCheckLinks.GetOwner: TPersistent;
begin
Result := FDBNavigator;
end;
function TdxBarDBCheckLinks.Add: TdxBarDBCheckLink;
begin
Result := TdxBarDBCheckLink(inherited Add);
end;
{ dxBarDBNavButton }
destructor TdxBarDBNavButton.Destroy;
begin
if BarDBNavigator <> nil then
BarDBNavigator.RemoveButton(Self);
inherited Destroy;
end;
procedure TdxBarDBNavButton.SetNavButton(Value: TdxBarDBNavButtonType);
const
dxBarNames: array[TdxBarDBNavButtonType] of string =
('First', 'Prev', 'Next', 'Last',
'Insert', 'Delete', 'Edit', 'Post', 'Cancel', 'Refresh');
PResStrs: array[TdxBarDBNavButtonType] of Pointer = (@dxSBAR_BTNCAPTION_FIRST,
@dxSBAR_BTNCAPTION_PRIOR, @dxSBAR_BTNCAPTION_NEXT, @dxSBAR_BTNCAPTION_LAST,
@dxSBAR_BTNCAPTION_INSERT, @dxSBAR_BTNCAPTION_DELETE, @dxSBAR_BTNCAPTION_EDIT,
@dxSBAR_BTNCAPTION_POST, @dxSBAR_BTNCAPTION_CANCEL, @dxSBAR_BTNCAPTION_REFRESH);
begin
if (FNavButton <> Value) or (Name = '') then
if csLoading in ComponentState then
FNavButton := Value
else
begin
if (BarDBNavigator <> nil) and not BarDBNavigator.FSetVisFlag and
(BarDBNavigator.Buttons[Value] <> nil) then
raise Exception.Create(cxGetResourceString(@dxSBAR_DBNAVERROR1));
if (BarDBNavigator <> nil) and not BarDBNavigator.FSetVisFlag then
BarDBNavigator.RemoveButton(Self);
FNavButton := Value;
if BarDBNavigator <> nil then
begin
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -