delphi數據庫編程一個規範化的控件, 主要有三种狀態,
DES_NONE, 清屏
DES_NEW, 新增
DES_BROWSE, 瀏覽
DES_EDIT 編輯
沒有增加過渡狀態描述, 如需要,請自擴充之
===========================================================================
unit JDBCmn;
interface
uses SysUtils;
type
TDBEditorStatus = (DES_NONE, DES_NEW, DES_BROWSE, DES_EDIT);
TDBEditorTryEvent = procedure(Sender: TObject; var Passed:Boolean) of object;
TEditBaseException = class(Exception)
end;
IDBValidate = interface
function Validate():boolean;
end;
implementation
end.
===========================================================================
unit JDBEditorNotify;
interface
uses
Windows, Messages, SysUtils, Classes, JDBCmn;
type
IDBEditor = interface
['{98901426-28EC-4E8E-8952-888C587B59CC}']
//
function GetStatus():TDBEditorStatus;
function TryInitData():Boolean;
function TryActivateEditor(Active:Boolean):Boolean;
function CanCloseEditor():Boolean;
function TryCloseEditor():Boolean;
//
function CanNew():Boolean;
function CanDelete():Boolean;
function CanModify():Boolean;
function CanSave():Boolean;
function CanReset():boolean;
//
function TryNew():Boolean;
function TryDelete():Boolean;
function TrySave():boolean;
function TryModify():Boolean;
function TryReset():Boolean;
end;
TDBEditorNotify = class(TComponent, IDBEditor)
private
FCaption: string;
FOnDBEditorSave: TNotifyEvent;
FOnDBEditorDelete: TNotifyEvent;
FOnDBEditorNew: TNotifyEvent;
FOnDBEditorQuery: TNotifyEvent;
FOnDBEditorModify: TNotifyEvent;
FEditStatus: TDBEditorStatus;
FOnDBEditorBeforeDelete: TDBEditorTryEvent;
FOnDBEditorBeforeQuery: TDBEditorTryEvent;
FOnDBEditorBeforeReset: TDBEditorTryEvent;
FOnDBEditorBeforeSave: TDBEditorTryEvent;
FOnDBEditorBeforeModify: TDBEditorTryEvent;
FOnDBEditorBeforeNew: TDBEditorTryEvent;
FOnDBEditorAfterNew: TNotifyEvent;
FOnDBEditorAfterSave: TNotifyEvent;
FOnDBEditorAfterQuery: TNotifyEvent;
FOnDBEditorAfterReset: TNotifyEvent;
FOnDBEditorReset: TNotifyEvent;
FOnDBEditorAfterDelete: TNotifyEvent;
FOnDBEditorAfterModify: TNotifyEvent;
FOnDBEditorStatusChanged: TNotifyEvent;
FEditStatusAfterSave: TDBEditorStatus;
FAskSaveQuestion: String;
FOnInit: TNotifyEvent;
FOnActiveEditor: TNotifyEvent;
FOnBeginTransaction: TNotifyEvent;
FOnEndTransaction: TNotifyEvent;
FOnRollBackTransaction: TNotifyEvent;
FOnBeforeCloseEditor: TDBEditorTryEvent;
FOnAfterCloseEditor: TNotifyEvent;
{ Private declarations }
procedure SetFCaption(const Value: string);
procedure SetOnDBEditorDelete(const Value: TNotifyEvent);
procedure SetOnDBEditorModify(const Value: TNotifyEvent);
procedure SetOnDBEditorNew(const Value: TNotifyEvent);
procedure SetOnDBEditorQuery(const Value: TNotifyEvent);
procedure SetOnDBEditorSave(const Value: TNotifyEvent);
procedure SetEditStatus(const Value: TDBEditorStatus);
procedure SetOnDBEditorAfterDelete(const Value: TNotifyEvent);
procedure SetOnDBEditorAfterModify(const Value: TNotifyEvent);
procedure SetOnDBEditorAfterNew(const Value: TNotifyEvent);
procedure SetOnDBEditorAfterQuery(const Value: TNotifyEvent);
procedure SetOnDBEditorAfterReset(const Value: TNotifyEvent);
procedure SetOnDBEditorAfterSave(const Value: TNotifyEvent);
procedure SetOnDBEditorBeforeDelete(const Value: TDBEditorTryEvent);
procedure SetOnDBEditorBeforeModify(const Value: TDBEditorTryEvent);
procedure SetOnDBEditorBeforeNew(const Value: TDBEditorTryEvent);
procedure SetOnDBEditorBeforeQuery(const Value: TDBEditorTryEvent);
procedure SetOnDBEditorBeforeReset(const Value: TDBEditorTryEvent);
procedure SetOnDBEditorBeforeSave(const Value: TDBEditorTryEvent);
procedure SetOnDBEditorReset(const Value: TNotifyEvent);
procedure SetOnDBEditorStatusChanged(const Value: TNotifyEvent);
procedure SetEditStatusAfterSave(const Value: TDBEditorStatus);
procedure SetAskSaveQuestion(const Value: String);
procedure SetOnInit(const Value: TNotifyEvent);
procedure SetOnActiveEditor(const Value: TNotifyEvent);
procedure SetOnBeginTransaction(const Value: TNotifyEvent);
procedure SetOnEndTransaction(const Value: TNotifyEvent);
procedure SetOnRollBackTransaction(const Value: TNotifyEvent);
procedure SetOnAfterCloseEditor(const Value: TNotifyEvent);
procedure SetOnBeforeCloseEditor(const Value: TDBEditorTryEvent);
public
{ Public declarations }
//
constructor Create(AOwner:TComponent); override;
function MessageBox(Info:String;BtnAndIcon:Integer=-1):Integer;
function LocalTryAskDirtyDataAction(): Boolean;
procedure WorkBegin(BeginTrans:Boolean);
procedure WorkRollBack();
// IDBEditor implementation
function GetStatus():TDBEditorStatus;
function TryInitData():Boolean;
function TryActivateEditor(Active:Boolean):Boolean;
function CanCloseEditor():Boolean;
function TryCloseEditor():Boolean;
// Auto Invoke OnDBEditorBeforeXXXXX Event
function CanNew():Boolean;
function CanDelete():Boolean;
function CanModify():Boolean;
function CanSave():Boolean;
function CanReset():boolean;
// Auto Invoke OnDBEditorXXXXX events, Auto Invoke OnDBEditorAfterXXXXX events, trace edit status
function TryNew():Boolean;
function TryDelete():Boolean;
function TrySave():boolean;
function TryModify():Boolean;
function TryReset():Boolean;
//
property EditStatus:TDBEditorStatus read FEditStatus write SetEditStatus default DES_NONE;
published
{ Published declarations }
property Caption:string read FCaption write SetFCaption;
property AskSaveQuestion:String read FAskSaveQuestion write SetAskSaveQuestion;
property EditStatusAfterSave:TDBEditorStatus read FEditStatusAfterSave write SetEditStatusAfterSave default DES_NONE;
// initialize, finalize
property OnInit:TNotifyEvent read FOnInit write SetOnInit;
property OnActiveEditor:TNotifyEvent read FOnActiveEditor write SetOnActiveEditor;
property OnBeforeCloseEditor:TDBEditorTryEvent read FOnBeforeCloseEditor write SetOnBeforeCloseEditor;
property OnAfterCloseEditor:TNotifyEvent read FOnAfterCloseEditor write SetOnAfterCloseEditor;
//property OnCloseEditor:TNotifyEvent read FOnCloseEditor write SetOnCloseEditor;
// before
property OnDEBeforeNew:TDBEditorTryEvent read FOnDBEditorBeforeNew write SetOnDBEditorBeforeNew;
property OnDEBeforeModify:TDBEditorTryEvent read FOnDBEditorBeforeModify write SetOnDBEditorBeforeModify;
property OnDEBeforeDelete:TDBEditorTryEvent read FOnDBEditorBeforeDelete write SetOnDBEditorBeforeDelete;
property OnDEBeforeSave:TDBEditorTryEvent read FOnDBEditorBeforeSave write SetOnDBEditorBeforeSave;
property OnDEBeforeQuery:TDBEditorTryEvent read FOnDBEditorBeforeQuery write SetOnDBEditorBeforeQuery;
property OnDEBeforeReset:TDBEditorTryEvent read FOnDBEditorBeforeReset write SetOnDBEditorBeforeReset;
// on
property OnDENew:TNotifyEvent read FOnDBEditorNew write SetOnDBEditorNew;
property OnDEModify:TNotifyEvent read FOnDBEditorModify write SetOnDBEditorModify;
property OnDEDelete:TNotifyEvent read FOnDBEditorDelete write SetOnDBEditorDelete;
property OnDESave:TNotifyEvent read FOnDBEditorSave write SetOnDBEditorSave;
property OnDEQuery:TNotifyEvent read FOnDBEditorQuery write SetOnDBEditorQuery;
property OnDEReset:TNotifyEvent read FOnDBEditorReset write SetOnDBEditorReset;
// after
property OnDEAfterNew:TNotifyEvent read FOnDBEditorAfterNew write SetOnDBEditorAfterNew;
property OnDEAfterModify:TNotifyEvent read FOnDBEditorAfterModify write SetOnDBEditorAfterModify;
property OnDEAfterDelete:TNotifyEvent read FOnDBEditorAfterDelete write SetOnDBEditorAfterDelete;
property OnDEAfterSave:TNotifyEvent read FOnDBEditorAfterSave write SetOnDBEditorAfterSave;
property OnDEAfterQuery:TNotifyEvent read FOnDBEditorAfterQuery write SetOnDBEditorAfterQuery;
property OnDEAfterReset:TNotifyEvent read FOnDBEditorAfterReset write SetOnDBEditorAfterReset;
//
property OnDEStatusChanged:TNotifyEvent read FOnDBEditorStatusChanged write SetOnDBEditorStatusChanged;
property OnBeginTransaction:TNotifyEvent read FOnBeginTransaction write SetOnBeginTransaction;
property OnEndTransaction:TNotifyEvent read FOnEndTransaction write SetOnEndTransaction;
property OnRollBackTransaction:TNotifyEvent read FOnRollBackTransaction write SetOnRollBackTransaction;
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('MY_CUSTOM', [TDBEditorNotify]);
end;
constructor TDBEditorNotify.Create(AOwner: TComponent);
begin
inherited;
Caption := 'Info';
FAskSaveQuestion := 'Data is dirty, save it ?';
end;
function TDBEditorNotify.GetStatus: TDBEditorStatus;
begin
result := EditStatus;;
end;
function TDBEditorNotify.CanDelete: Boolean;
var
Passed:Boolean;
begin
Result := false;
try
Passed := true;
if Assigned(FOnDBEditorBeforeDelete) then FOnDBEditorBeforeDelete(Self, Passed);
result := Passed;
except
end;
end;
function TDBEditorNotify.CanNew: Boolean;
var
Passed:Boolean;
begin
Result := false;
try
Passed := true;
if Assigned(FOnDBEditorBeforeNew) then FOnDBEditorBeforeNew(Self, Passed);
result := Passed;
except
end;
end;
function TDBEditorNotify.CanCloseEditor: Boolean;
var
Passed:Boolean;
begin
Result := false;
try
Passed := true;
if Assigned(FOnBeforeCloseEditor) then FOnBeforeCloseEditor(Self, Passed);
result := Passed;
except
end;
end;
function TDBEditorNotify.CanSave: Boolean;
var
Passed:Boolean;
begin
Result := false;
try
Passed := true;
if Assigned(FOnDBEditorBeforeSave) then FOnDBEditorBeforeSave(Self, Passed);
result := Passed;
except
end;
end;
function TDBEditorNotify.CanModify: Boolean;
var
Passed:Boolean;
begin
Result := false;
try
Passed := true;
if Assigned(FOnDBEditorBeforeModify) then FOnDBEditorBeforeModify(Self, Passed);
result := Passed;
except
end;
end;
function TDBEditorNotify.CanReset: boolean;
var
Passed:Boolean;
begin
Result := false;
try
Passed := true;
if Assigned(FOnDBEditorBeforeReset) then FOnDBEditorBeforeReset(Self, Passed);
result := Passed;
except
end;
end;
function TDBEditorNotify.TryActivateEditor(
Active: Boolean): Boolean;
begin
Result := true;
end;
function TDBEditorNotify.TryInitData: Boolean;
begin
if Assigned(FOnInit) then FOnInit(Self);
Result := true;
end;
function TDBEditorNotify.TryDelete: Boolean;
begin
result := False;
try
if Assigned(FOnDBEditorDelete) then
begin
WorkBegin(true);
FOnDBEditorDelete(Self);
if Assigned(FOnDBEditorAfterDelete) then
FOnDBEditorAfterDelete(Self);
EditStatus := DES_NONE;
result := true;
WorkBegin(false);
end;
except
on E:Exception do
begin
WorkRollBack;
MessageBox(PChar(e.Message), MB_OK OR MB_ICONERROR);
end;
end;
end;
function TDBEditorNotify.TryNew: Boolean;
begin
result := False;
try
if Assigned(FOnDBEditorNew) then
begin
//WorkBegin(true);
FOnDBEditorNew(Self);
if Assigned(FOnDBEditorAfterNew) then
FOnDBEditorAfterNew(Self);
EditStatus := DES_NEW;
result := true;
//WorkBegin(false);
end;
except
on E:Exception do
begin
//WorkRollBack;
MessageBox(PChar(e.Message), MB_OK OR MB_ICONERROR);
end;
end;
end;
function TDBEditorNotify.TryModify: Boolean;
begin
result := False;
try
if Assigned(FOnDBEditorModify) then
begin
//WorkBegin(true);
FOnDBEditorModify(Self);
if Assigned(FOnDBEditorAfterModify) then
FOnDBEditorAfterModify(Self);
EditStatus := DES_EDIT;
result := true;
//WorkBegin(false);
end;
except
on E:Exception do
begin
WorkRollBack;
MessageBox(PChar(e.Message), MB_OK OR MB_ICONERROR);
end;
end;
end;
function TDBEditorNotify.TrySave: boolean;
begin
result := False;
try
if Assigned(FOnDBEditorSave) then
begin
WorkBegin(true);
FOnDBEditorSave(Self);
if Assigned(FOnDBEditorAfterSave) then
FOnDBEditorAfterSave(Self);
EditStatus := EditStatusAfterSave;
result := true;
WorkBegin(false);
end;
except
on E:Exception do
begin
WorkRollBack;
MessageBox(PChar(e.Message), MB_OK OR MB_ICONERROR);
end;
end;
end;
function TDBEditorNotify.TryReset: Boolean;
begin
result := False;
try
if Assigned(FOnDBEditorReset) then
begin
WorkBegin(true);
FOnDBEditorReset(Self);
if Assigned(FOnDBEditorAfterReset) then
FOnDBEditorAfterReset(Self);
EditStatus := DES_NONE;
result := true;
WorkBegin(false);
end;
except
on E:Exception do
begin
WorkRollBack;
MessageBox(PChar(e.Message), MB_OK OR MB_ICONERROR);
end;
end;
end;
procedure TDBEditorNotify.SetFCaption(const Value: string);
begin
FCaption := Value;
end;
procedure TDBEditorNotify.SetOnDBEditorDelete(const Value: TNotifyEvent);
begin
FOnDBEditorDelete := Value;
end;
procedure TDBEditorNotify.SetOnDBEditorModify(const Value: TNotifyEvent);
begin
FOnDBEditorModify := Value;
end;
procedure TDBEditorNotify.SetOnDBEditorNew(const Value: TNotifyEvent);
begin
FOnDBEditorNew := Value;
end;
procedure TDBEditorNotify.SetOnDBEditorQuery(const Value: TNotifyEvent);
begin
FOnDBEditorQuery := Value;
end;
procedure TDBEditorNotify.SetOnDBEditorSave(const Value: TNotifyEvent);
begin
FOnDBEditorSave := Value;
end;
procedure TDBEditorNotify.SetEditStatus(const Value: TDBEditorStatus);
begin
FEditStatus := Value;
if Assigned(FOnDBEditorStatusChanged) then FOnDBEditorStatusChanged(Self);
end;
procedure TDBEditorNotify.SetOnDBEditorAfterDelete(
const Value: TNotifyEvent);
begin
FOnDBEditorAfterDelete := Value;
end;
procedure TDBEditorNotify.SetOnDBEditorAfterModify(
const Value: TNotifyEvent);
begin
FOnDBEditorAfterModify := Value;
end;
procedure TDBEditorNotify.SetOnDBEditorAfterNew(const Value: TNotifyEvent);
begin
FOnDBEditorAfterNew := Value;
end;
procedure TDBEditorNotify.SetOnDBEditorAfterQuery(
const Value: TNotifyEvent);
begin
FOnDBEditorAfterQuery := Value;
end;
procedure TDBEditorNotify.SetOnDBEditorAfterReset(
const Value: TNotifyEvent);
begin
FOnDBEditorAfterReset := Value;
end;
procedure TDBEditorNotify.SetOnDBEditorAfterSave(
const Value: TNotifyEvent);
begin
FOnDBEditorAfterSave := Value;
end;
procedure TDBEditorNotify.SetOnDBEditorBeforeDelete(
const Value: TDBEditorTryEvent);
begin
FOnDBEditorBeforeDelete := Value;
end;
procedure TDBEditorNotify.SetOnDBEditorBeforeModify(
const Value: TDBEditorTryEvent);
begin
FOnDBEditorBeforeModify := Value;
end;
procedure TDBEditorNotify.SetOnDBEditorBeforeNew(
const Value: TDBEditorTryEvent);
begin
FOnDBEditorBeforeNew := Value;
end;
procedure TDBEditorNotify.SetOnDBEditorBeforeQuery(
const Value: TDBEditorTryEvent);
begin
FOnDBEditorBeforeQuery := Value;
end;
procedure TDBEditorNotify.SetOnDBEditorBeforeReset(
const Value: TDBEditorTryEvent);
begin
FOnDBEditorBeforeReset := Value;
end;
procedure TDBEditorNotify.SetOnDBEditorBeforeSave(
const Value: TDBEditorTryEvent);
begin
FOnDBEditorBeforeSave := Value;
end;
procedure TDBEditorNotify.SetOnDBEditorReset(const Value: TNotifyEvent);
begin
FOnDBEditorReset := Value;
end;
procedure TDBEditorNotify.SetOnDBEditorStatusChanged(
const Value: TNotifyEvent);
begin
FOnDBEditorStatusChanged := Value;
end;
procedure TDBEditorNotify.SetEditStatusAfterSave(
const Value: TDBEditorStatus);
begin
if (Value = DES_NONE) or (Value = DES_BROWSE) or (Value = DES_NEW) then FEditStatusAfterSave := Value;
end;
function TDBEditorNotify.MessageBox(Info: String;
BtnAndIcon: Integer=-1): Integer;
begin
if BtnAndIcon=-1 then BtnAndIcon := MB_OK OR MB_ICONINFORMATION;
result := Windows.MessageBox(GetForegroundWindow(), PChar(Info), PChar(Caption), BtnAndIcon);
end;
{
return true if data doesn't need saving
}
function TDBEditorNotify.LocalTryAskDirtyDataAction(): Boolean;
var
iReply:integer;
begin
Result := false;
if (EditStatus=DES_EDIT) or (EditStatus=DES_NEW) then
begin
iReply := MessageBox(AskSaveQuestion, MB_YESNOCANCEL or MB_ICONQUESTION);
case iReply of
IDCANCEL :
EXIT;
IDYES:
begin
if CanSave() then
if not TrySave() then exit else
else
exit;
end;
end;
end;
Result := true;
end;
procedure TDBEditorNotify.SetAskSaveQuestion(const Value: String);
begin
FAskSaveQuestion := Value;
end;
procedure TDBEditorNotify.SetOnInit(const Value: TNotifyEvent);
begin
FOnInit := Value;
end;
procedure TDBEditorNotify.SetOnActiveEditor(const Value: TNotifyEvent);
begin
FOnActiveEditor := Value;
end;
procedure TDBEditorNotify.SetOnBeginTransaction(const Value: TNotifyEvent);
begin
FOnBeginTransaction := Value;
end;
procedure TDBEditorNotify.SetOnEndTransaction(const Value: TNotifyEvent);
begin
FOnEndTransaction := Value;
end;
procedure TDBEditorNotify.WorkBegin(BeginTrans: Boolean);
begin
if BeginTrans then
begin
if Assigned(FOnBeginTransaction) then FOnBeginTransaction(Self);
end
else
begin
if Assigned(FOnEndTransaction) then FOnEndTransaction(Self);
end;
end;
procedure TDBEditorNotify.SetOnRollBackTransaction(
const Value: TNotifyEvent);
begin
FOnRollBackTransaction := Value;
end;
procedure TDBEditorNotify.WorkRollBack;
begin
if Assigned(FOnRollBackTransaction) then FOnRollBackTransaction(Self);
end;
procedure TDBEditorNotify.SetOnAfterCloseEditor(
const Value: TNotifyEvent);
begin
FOnAfterCloseEditor := Value;
end;
procedure TDBEditorNotify.SetOnBeforeCloseEditor(
const Value: TDBEditorTryEvent);
begin
FOnBeforeCloseEditor := Value;
end;
function TDBEditorNotify.TryCloseEditor: Boolean;
begin
result := False;
try
result := true;
if Assigned(FOnAfterCloseEditor) then
begin
WorkBegin(true);
FOnAfterCloseEditor(Self);
WorkBegin(false);
end;
except
on E:Exception do
begin
WorkRollBack;
MessageBox(PChar(e.Message), MB_OK OR MB_ICONERROR);
end;
end;
end;
end.