procedure TLoginForm.FormClose(Sender: TObject; var Action: TCloseAction); var Id : Integer; i : integer; Reg: TRegistry; begin With HDataModule.tblUsers do begin open; if IsOk then if not Locate('UserName;Password',vararrayof([LoginForm.cmbUser.text,LoginForm.edtPwd.text]),[]) then begin application.MessageBox('用户名或密码不正确!','系统提示',MB_OK); action:=canone; end else begin action:=cafree; iright:=FieldValues['Right']; /////////////////////////////////////////////////////////////////////// FrmSystemLog:=TFrmSystemLog.Create(self); with FrmSystemLog.ADOTable1 do begin FrmSystemLog.ADOTable1.Connection:=HDatamodule.ADOConnection1; FrmSystemLog.ADOTable1.TableName:='SystemLog'; FrmSystemLog.ADOTable1.Open; Reg:=TRegistry.create; reg.RootKey:=HKEY_LOCAL_MACHINE; ///////////////////////////////////////////////////////////////////////////////////////////// if reg.OpenKey('software\公路数据库管理系统\系统日志',false) then begin Id:=StrToInt(Reg.ReadString('SystemLogId')); //读取出日志的ID号 for i:=0 to FrmSystemLog.ADOTable1.RecordCount-1 do begin if FrmSystemLog.ADOTable1.FieldValues['id']=Id then begin FrmSystemLog.ADOTable1.Edit; FrmSystemLog.ADOTable1.FieldValues['ExitTime']:=DateToStr(Date)+' '+TimeToStr(Time); FrmSystemLog.ADOTable1.post; Break; end; FrmSystemLog.ADOTable1.Next; end; end; //////////////////////////////////////////////////////////////////////////// FrmSystemLog.ADOTable1.Append; FrmSystemLog.ADOTable1.FieldValues['UserName']:=LoginForm.cmbUser.text; username:=LoginForm.cmbUser.text; ////////////////////////////////////////////////////// if IRight=15 then FrmSystemLog.ADOTable1.FieldValues['UserId']:='数据库管理员' Else FrmSystemLog.ADOTable1.FieldValues['UserId']:='一般浏览者'; FrmSystemLog.ADOTable1.FieldValues['LoginTime']:=DateToStr(Date)+' '+TimeToStr(Time); FrmSystemLog.ADOTable1.FieldValues['Operation']:=LoginForm.cmbUser.text; LoginTime:=FrmSystemLog.ADOTable1.FieldValues['LoginTime']; Post; reg.CloseKey; reg.RootKey:=HKEY_LOCAL_MACHINE; if reg.OpenKey('software\公路数据库管理系统\系统日志',True) then //写入日志的ID号 Reg.WriteString('SystemLogId',IntToStr(Fieldvalues['Id'])); reg.CloseKey; reg.Free; FrmSystemLog.ADOTable1.close; end; FrmSystemLog.Destroy; ///////////////////////////////////////////////////////////// close; end else begin action:=cafree; close; end; end; end;我做的
从用户一登陆就开始记录信息。其实也挺简单的。不过,你把对记录的访问\增加\删除都记录在日子里不大好(成了sql server的日志了),在业务表里完全可以记录修改人的信息。
var
Id : Integer;
i : integer;
Reg: TRegistry;
begin
With HDataModule.tblUsers do
begin
open;
if IsOk then
if not Locate('UserName;Password',vararrayof([LoginForm.cmbUser.text,LoginForm.edtPwd.text]),[]) then
begin
application.MessageBox('用户名或密码不正确!','系统提示',MB_OK);
action:=canone;
end
else
begin
action:=cafree;
iright:=FieldValues['Right'];
///////////////////////////////////////////////////////////////////////
FrmSystemLog:=TFrmSystemLog.Create(self);
with FrmSystemLog.ADOTable1 do
begin
FrmSystemLog.ADOTable1.Connection:=HDatamodule.ADOConnection1;
FrmSystemLog.ADOTable1.TableName:='SystemLog';
FrmSystemLog.ADOTable1.Open;
Reg:=TRegistry.create;
reg.RootKey:=HKEY_LOCAL_MACHINE;
/////////////////////////////////////////////////////////////////////////////////////////////
if reg.OpenKey('software\公路数据库管理系统\系统日志',false) then
begin
Id:=StrToInt(Reg.ReadString('SystemLogId')); //读取出日志的ID号
for i:=0 to FrmSystemLog.ADOTable1.RecordCount-1 do
begin
if FrmSystemLog.ADOTable1.FieldValues['id']=Id then
begin
FrmSystemLog.ADOTable1.Edit;
FrmSystemLog.ADOTable1.FieldValues['ExitTime']:=DateToStr(Date)+' '+TimeToStr(Time);
FrmSystemLog.ADOTable1.post;
Break;
end;
FrmSystemLog.ADOTable1.Next;
end;
end;
////////////////////////////////////////////////////////////////////////////
FrmSystemLog.ADOTable1.Append;
FrmSystemLog.ADOTable1.FieldValues['UserName']:=LoginForm.cmbUser.text;
username:=LoginForm.cmbUser.text;
//////////////////////////////////////////////////////
if IRight=15 then
FrmSystemLog.ADOTable1.FieldValues['UserId']:='数据库管理员'
Else
FrmSystemLog.ADOTable1.FieldValues['UserId']:='一般浏览者';
FrmSystemLog.ADOTable1.FieldValues['LoginTime']:=DateToStr(Date)+' '+TimeToStr(Time);
FrmSystemLog.ADOTable1.FieldValues['Operation']:=LoginForm.cmbUser.text;
LoginTime:=FrmSystemLog.ADOTable1.FieldValues['LoginTime'];
Post;
reg.CloseKey;
reg.RootKey:=HKEY_LOCAL_MACHINE;
if reg.OpenKey('software\公路数据库管理系统\系统日志',True) then //写入日志的ID号
Reg.WriteString('SystemLogId',IntToStr(Fieldvalues['Id']));
reg.CloseKey;
reg.Free;
FrmSystemLog.ADOTable1.close;
end;
FrmSystemLog.Destroy;
/////////////////////////////////////////////////////////////
close;
end
else
begin
action:=cafree;
close;
end;
end;
end;我做的
可以记录每次用户登陆、更新、增加和删除记录信息,
LogNo:表示Log号码
DateTime:操作的时间
UserName:用户名
Event:做何种操作
Type: 操作类型
Status:操作成功还是失败
满意了吗?
如BDE吧,可以通过它把发出的语句取到的。我是见过的,实现我也不太清楚的,
祝你好运。
1: 重写你用到的控件,在你要管理的事件中,写入要写日志的代码。
2: 写一个类,监视你的数据集。其实和上一个是一样的,不过,是不用写新的控件(componets)做了一个小例子,请你试试看:unit Unit1;interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls, DBCtrls, Db, DBTables, Grids, DBGrids;type
//这就是一个数据集监视类,简单起见,只监视BeforePost,并在BeforePost时,showMesage.
TDataSetMonitor = class
private
FDataSet: TDataSet; FOldBeforePost: TDataSetNotifyEvent; //被监视数据集的BeforePost事件处理过程
procedure SetDataSet(const Value: TDataSet);
protected
procedure MyBeforePost(xDataSet: TDataSet); //监视程序的BeforePost过程
public
property DataSet: TDataSet read FDataSet write SetDataSet;
end; TForm1 = class(TForm)
DBGrid1: TDBGrid;
DataSource1: TDataSource;
Query1: TQuery; //我们就是要监视他!·!!!
DBNavigator1: TDBNavigator;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
FdsMon : TDataSetMonitor; //申明一个对象
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.DFM}{ TDataSetMonitor }procedure TDataSetMonitor.MyBeforePost(xDataSet: TDataSet);
begin
ShowMessage(' Before Post!'); //在这里写入日志 if Assigned(FOldBeforePost) then //如果原数据集有处理,则处理之。
FOldBeforePost(xDataSet);
end;procedure TDataSetMonitor.SetDataSet(const Value: TDataSet);
begin
//在给之前,先看看是不是已经有监视了,如果有,结束!
if FDataSet <> nil then
begin
FDataSet.BeforePost := FOldBeforePost;
end; FDataSet := Value; //监视起来,如果为空,就不用。 //把被监视者的事件都接过来
if FDataSet <> nil then
begin
FOldBeforePost := FDataSet.BeforePost;
FDataSet.BeforePost := self.MyBeforePost;
end;
end;procedure TForm1.FormCreate(Sender: TObject);
begin
FdsMon := TDataSetMonitor.Create;
FdsMon.DataSet := self.Query1; //给我看紧喽!!! Query1.open();
end;procedure TForm1.FormDestroy(Sender: TObject);
begin
FdsMon.Free; //Free
end;end.
根据操作命令进行日志记录.
然后在其派生类中inherit后,再进行其他操作就不用为日志写代码了.
我想是在基类窗体中加个QinfoBase的基类数据源,在其的BeforePost,BeforeInsert,BeforeEdit,BeforeDelete......等等事件中加入函数
问题是如何自动获得每个窗体的自身名字.