procedure ANavigatorBeforeAction(Sender: TObject; Button: TNavigateBtn; AFieldName, Avalue: string); } procedure DispMsg(MsgId:String; const DispType:TDispType=dtNormal; Showed:Boolean=True); property SysDate: TDateTime read GetSysDate; property UserNo: String read GetUserNo; end;var frmBase: TfrmBase;implementation{$R *.DFM}{ // 在Navigator的BeforeAction中调用 procedure TfrmBase.ANavigatorBeforeAction(Sender: TObject; Button: TNavigateBtn; AFieldName, Avalue: string); begin case Button of nbFirst : ; nbPrior : ; nbNext : ; nbLast : ; nbInsert : ; nbDelete : begin if bLogicDelete then begin ourDeleted(TDBNavigator(Sender), Button, AFieldName, Avalue); abort; end; end; nbEdit : ; nbPost : ; nbCancel : ; nbRefresh: ; end;end;// 使用 TDBNavigator 上的删除时要调用本函数 // ADeleteFieldName-->一般是状态栏位,AValue-->标记为删除的值 procedure TfrmBase.ourDeleted(ANavigator: TDBNavigator; Button: TNavigateBtn; ADeleteFieldName, AValue: string); var deleteField:TField; strOld,strNow:string; begin deleteField:=ANavigator.DataSource.DataSet.FindField(ADeleteFieldName); if deleteField=nil then begin showmessage(ADeleteFieldName+' is not exist !'); Exit; end; strNow:=UpperCase(trim(AValue)); strOld:=UpperCase(trim(deleteField.AsString)); if strOld<>strNow then begin ANavigator.DataSource.DataSet.Edit; if deleteField.ReadOnly then deleteField.ReadOnly:=False; deleteField.AsString:=strNow; ANavigator.DataSource.DataSet.Post; end; end; } function TfrmBase.GetSysDate; begin //Result:=frmLogin.SysDate; //This should be gotten after system login Result:=now; end;function TfrmBase.GetUserNo; begin //Result:=frmLogin.UserNo; //This should be gotten after system login Result:='User1'; end;procedure TfrmBase.DispMsg(MsgId:String; const DispType:TDispType=dtNormal; Showed:Boolean=True); var MsgText: string; begin MsgText:=frmLogin.GetMsg(MsgId, Showed); if DispType=dtNormal then Application.MessageBox(PChar(MsgText),PChar(Screen.ActiveForm.Caption),MB_OK) else if DispType=dtError then MessageDlg(MsgText,mtError,[mbok],0) else if DispType=dtWarning then MessageDlg(MsgText,mtWarning,[mbok],0) else Exception.Create('Invalid DispType'); end;procedure TfrmBase.FormCreate(Sender: TObject); begin //CheckRights(self, UserInfor); end;procedure TfrmBase.ClearText(Sender: TObject); var i:integer; aParent:TWinControl; begin aParent:=TWinControl(Sender).Parent; if aParent=nil then Exit; for i := 0 to aParent.ControlCount-1 do if aParent.Controls[I] is TEdit then TEdit(aParent.Controls[I]).Clear { else if aParent.Controls[I] is TComboBox then TComboBox(aParent.Controls[I]).Text:=''; } else if (aParent.Controls[I] is TComboBox)then if trim(TComboBox(aParent.Controls[I]).Items[0])='' then TComboBox(aParent.Controls[I]).ItemIndex:=0 else TComboBox(aParent.Controls[I]).Text:=''; end;procedure TfrmBase.FormShow(Sender: TObject); var i:integer; begin for i := 0 to ComponentCount-1 do if components[i] is TDateTimePicker then TDateTimePicker(components[I]).Date:=date; end;procedure TfrmBase.DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); begin if gdSelected in State then Exit; if (TDBGrid(Sender).DataSource = nil) or (TDBGrid(Sender).DataSource.DataSet = nil) then Exit; if TDBGrid(Sender).DataSource.DataSet.RecNo mod 2 = 0 then TDBGrid(Sender).Canvas.Brush.Color := clInfoBk else TDBGrid(Sender).Canvas.Brush.Color := RGB(191, 255, 223); TDBGrid(Sender).DefaultDrawColumnCell(Rect, DataCol, Column, State); TDBGrid(Sender).Canvas.Pen.Color := $00C08000; TDBGrid(Sender).Canvas.MoveTo(Rect.Left, Rect.Bottom); TDBGrid(Sender).Canvas.LineTo(Rect.Right, Rect.Bottom); TDBGrid(Sender).Canvas.LineTo(Rect.Right, Rect.Top); end;procedure TfrmBase.TitleClick(Column: TColumn); begin untBasicServices.DBGridTitleSort(Column); end;procedure TfrmBase.FormCloseQuery(Sender: TObject; var CanClose: Boolean); var i:integer; bfalg:Boolean; DataSource:TDataSource; begin inherited; bfalg:=False; for i := 0 to ComponentCount-1 do if Components[i] is TDBEdit then begin DataSource:=TDBEdit(Components[I]).DataSource; if DataSource=nil then Continue; bfalg:=(DataSource.State in [dsEdit,dsInsert]); break; end else if Components[i] is TDBComboBox then begin DataSource:=TDBComboBox(Components[I]).DataSource; if DataSource=nil then Continue; bfalg:=(DataSource.State in [dsEdit,dsInsert]); break; end else if Components[i] is TDBMemo then begin DataSource:=TDBMemo(Components[I]).DataSource; if DataSource=nil then Continue; bfalg:=(DataSource.State in [dsEdit,dsInsert]); break; end; if bfalg then begin MessageDlg('You are Editting data, please Save or Cancel Before Exit!', mtWarning,[mbOk], 0); CanClose:=False; end else CanClose:=True;end;end.
unit untBFrm;interfaceuses
untInit, untBasicServices, Grids, DBGrids,
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ComCtrls, ExtCtrls, DBCtrls,DB;//type TDispType=(dtNormal, dtWarning, dtError ,dtInformation, dtConfirmation, dtCustom);type
TfrmBase = class(TForm)
procedure FormCreate(Sender: TObject);
procedure ClearText(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);virtual;
procedure TitleClick(Column: TColumn);virtual;
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
private// FGetUserNo: String;
// FGetSysDate: TDateTime;
function GetSysDate:TDateTime;
function GetUserNo:String;// procedure ourDeleted(ANavigator: TDBNavigator; Button: TNavigateBtn;
// ADeleteFieldName, AValue: string);
public
{ bLogicDelete:boolean; //逻辑删除还是物理删除,True时Status='D'
procedure ANavigatorBeforeAction(Sender: TObject; Button: TNavigateBtn;
AFieldName, Avalue: string); } procedure DispMsg(MsgId:String; const DispType:TDispType=dtNormal; Showed:Boolean=True);
property SysDate: TDateTime read GetSysDate;
property UserNo: String read GetUserNo;
end;var
frmBase: TfrmBase;implementation{$R *.DFM}{
// 在Navigator的BeforeAction中调用
procedure TfrmBase.ANavigatorBeforeAction(Sender: TObject;
Button: TNavigateBtn; AFieldName, Avalue: string);
begin
case Button of
nbFirst : ;
nbPrior : ;
nbNext : ;
nbLast : ;
nbInsert : ;
nbDelete :
begin
if bLogicDelete then
begin
ourDeleted(TDBNavigator(Sender), Button, AFieldName, Avalue);
abort;
end;
end;
nbEdit : ;
nbPost : ;
nbCancel : ;
nbRefresh: ;
end;end;// 使用 TDBNavigator 上的删除时要调用本函数
// ADeleteFieldName-->一般是状态栏位,AValue-->标记为删除的值
procedure TfrmBase.ourDeleted(ANavigator: TDBNavigator;
Button: TNavigateBtn; ADeleteFieldName, AValue: string);
var deleteField:TField;
strOld,strNow:string;
begin
deleteField:=ANavigator.DataSource.DataSet.FindField(ADeleteFieldName);
if deleteField=nil then
begin
showmessage(ADeleteFieldName+' is not exist !');
Exit;
end;
strNow:=UpperCase(trim(AValue));
strOld:=UpperCase(trim(deleteField.AsString));
if strOld<>strNow then
begin
ANavigator.DataSource.DataSet.Edit;
if deleteField.ReadOnly then
deleteField.ReadOnly:=False;
deleteField.AsString:=strNow;
ANavigator.DataSource.DataSet.Post;
end;
end; }
function TfrmBase.GetSysDate;
begin
//Result:=frmLogin.SysDate; //This should be gotten after system login
Result:=now;
end;function TfrmBase.GetUserNo;
begin
//Result:=frmLogin.UserNo; //This should be gotten after system login
Result:='User1';
end;procedure TfrmBase.DispMsg(MsgId:String; const DispType:TDispType=dtNormal; Showed:Boolean=True);
var
MsgText: string;
begin
MsgText:=frmLogin.GetMsg(MsgId, Showed);
if DispType=dtNormal then
Application.MessageBox(PChar(MsgText),PChar(Screen.ActiveForm.Caption),MB_OK)
else if DispType=dtError then
MessageDlg(MsgText,mtError,[mbok],0)
else if DispType=dtWarning then
MessageDlg(MsgText,mtWarning,[mbok],0)
else
Exception.Create('Invalid DispType');
end;procedure TfrmBase.FormCreate(Sender: TObject);
begin
//CheckRights(self, UserInfor);
end;procedure TfrmBase.ClearText(Sender: TObject);
var
i:integer;
aParent:TWinControl;
begin
aParent:=TWinControl(Sender).Parent;
if aParent=nil then Exit; for i := 0 to aParent.ControlCount-1 do
if aParent.Controls[I] is TEdit then
TEdit(aParent.Controls[I]).Clear
{ else if aParent.Controls[I] is TComboBox then
TComboBox(aParent.Controls[I]).Text:=''; }
else if (aParent.Controls[I] is TComboBox)then
if trim(TComboBox(aParent.Controls[I]).Items[0])='' then
TComboBox(aParent.Controls[I]).ItemIndex:=0
else
TComboBox(aParent.Controls[I]).Text:='';
end;procedure TfrmBase.FormShow(Sender: TObject);
var
i:integer;
begin
for i := 0 to ComponentCount-1 do
if components[i] is TDateTimePicker then
TDateTimePicker(components[I]).Date:=date;
end;procedure TfrmBase.DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
if gdSelected in State then Exit;
if (TDBGrid(Sender).DataSource = nil) or (TDBGrid(Sender).DataSource.DataSet = nil) then Exit; if TDBGrid(Sender).DataSource.DataSet.RecNo mod 2 = 0 then
TDBGrid(Sender).Canvas.Brush.Color := clInfoBk
else
TDBGrid(Sender).Canvas.Brush.Color := RGB(191, 255, 223); TDBGrid(Sender).DefaultDrawColumnCell(Rect, DataCol, Column, State); TDBGrid(Sender).Canvas.Pen.Color := $00C08000;
TDBGrid(Sender).Canvas.MoveTo(Rect.Left, Rect.Bottom);
TDBGrid(Sender).Canvas.LineTo(Rect.Right, Rect.Bottom);
TDBGrid(Sender).Canvas.LineTo(Rect.Right, Rect.Top);
end;procedure TfrmBase.TitleClick(Column: TColumn);
begin
untBasicServices.DBGridTitleSort(Column);
end;procedure TfrmBase.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
var
i:integer;
bfalg:Boolean;
DataSource:TDataSource;
begin
inherited;
bfalg:=False;
for i := 0 to ComponentCount-1 do
if Components[i] is TDBEdit then
begin
DataSource:=TDBEdit(Components[I]).DataSource;
if DataSource=nil then Continue;
bfalg:=(DataSource.State in [dsEdit,dsInsert]);
break;
end
else
if Components[i] is TDBComboBox then
begin
DataSource:=TDBComboBox(Components[I]).DataSource;
if DataSource=nil then Continue;
bfalg:=(DataSource.State in [dsEdit,dsInsert]);
break;
end
else
if Components[i] is TDBMemo then
begin
DataSource:=TDBMemo(Components[I]).DataSource;
if DataSource=nil then Continue;
bfalg:=(DataSource.State in [dsEdit,dsInsert]);
break;
end; if bfalg then
begin
MessageDlg('You are Editting data, please Save or Cancel Before Exit!',
mtWarning,[mbOk], 0);
CanClose:=False;
end
else CanClose:=True;end;end.
会好点unit untNFrm;interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
UNTBFRM, ExtCtrls, ImgList, ComCtrls, Menus, ToolWin, ActnList, StdCtrls,
Buttons;type
TfrmNormal = class(TfrmBase)
stb1: TStatusBar;
iml1: TImageList;
acl1: TActionList;
pnl1: TPanel;
spd1: TSpeedButton;
tmr1: TTimer;
procedure spd1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
frmNormal: TfrmNormal;implementation{$R *.DFM}procedure TfrmNormal.spd1Click(Sender: TObject);
begin
inherited;
self.Close;
end;end.