to 楼主:
哎,又要源代码,你根据以下思路好好测试一下,实在不行,再给你写代码!
1、这里所谓OnBeforePost或对应字段的OnValidate事件,都可以实现你的操作。dev
express公司提供dbgrid3.22版本以前有一个TdxMemData控件(不知4.0以后的tcxdbgrid
是否有提供相类似的控件,如果没有,可以使用一个临时数据表代替),你可以将cxdbgrid
对应的数据集中的数据(包括你当前已经编辑好的),备份给TdxMemData(由于当你处于
编辑状态时,是无法在OnBeforePost或OnValidate事件中移动当前数据集的记录指针,使
用一个相对应的临时表),当你要检查数据时,只要对TdxMemData循环操作一下就可以了。
同理,你也可以使用动态数组来实现(你会灵活使用指针链表则更好了)。
2、以下代码是软件中的一部分,我也不解释了,你可以参考我以下帖子:
http://www.delphibbs.com/delphibbs/dispq.asp?lid=2243199
其中,MainDataModule.ADOQuUserNum对应的sql是sp_who2系统存储过程
如果你使用的是自己用户数据表来控制登陆用户,那当然更简单(但用户没有正常退出时
不好处理)。至于什么时候执行InitDBServerUserNum(),我使用的方法比较简单,在每个
Form的OnActive或OnCreate和OnClose来调用,但是,笨的方法是使用定时器,好的方法是
使用网络通讯(用户一登陆或注销成功,就发送一个特定的消息给所有在线用户),当然,
你也可以专门开一个线程来处理。
function GetFileVersion(vFileName:string;vName_i:integer):string;
const
InfoNum = 10;
InfoStr: array[1..InfoNum] of string = ('CompanyName', 'FileDescription', 'FileVersion', 'InternalName', 'LegalCopyright',
'LegalTradeMarks', 'OriginalFileName', 'ProductName', 'ProductVersion', 'Comments');
var
S: string;
n, Len, i: DWORD;
Buf: PChar;
Value: PChar;
vResult
Char;
begin
S := vFileName;
n := GetFileVersionInfoSize(PChar(S), n);
vResult:='';
if n > 0 then
begin
Buf := AllocMem
;
GetFileVersionInfo(PChar(S), 0, n, Pointer(Buf));
for i := 1 to InfoNum do
if VerQueryValue(Buf, pchar('StringFileInfo/040904E4/'+InfoStr
), Pointer(Value),Len) then
if (i=DWORD(vName_i)) then vResult:=value;
FreeMem(Buf, n);
end
else vResult:='';
result:=vResult;
end;
function InitDBServerUserNum():integer;
var i:integer;
oldSQL:string;
vProductName,vProgramName,vDBName:string;
begin
i:=0;
vProductName:=trim(GetFileVersion(Application.ExeName,8));
vDBName:=lowercase(GetXtDBName());
//showmessage(vProductName);
try
try
oldSQL:=MainDataModule.ADOQuUserNum.SQL.Text ;
{
MainDataModule.ADOQuUserNum.SQL.Text:='select ActiveState from duser1 where ActiveState=1';
MainDataModule.ADOQuUserNum.Active:=true;
i:=MainDataModule.ADOQuUserNum.RecordCount;
}
if MainDataModule.ADOQuUserNum.Active then MainDataModule.ADOQuUserNum.Close;
MainDataModule.ADOQuUserNum.Open;
MainDataModule.ADOQuUserNum.First;
while not MainDataModule.ADOQuUserNum.Eof do
begin
vProgramName:=trim(MainDataModule.ADOQuUserNum.FieldByName('ProgramName').Value);
if (MainDataModule.ADOQuUserNum.FieldByName('spid').Value>50) and
(lowercase(MainDataModule.ADOQuUserNum.FieldByName('dbname').Value)=vDBName) and
(vProgramName=vProductName)
then i:=i+1;
MainDataModule.ADOQuUserNum.next;
end; // while
except
i:=0;
end;
finally
MainDataModule.ADOQuUserNum.SQL.Text:=oldSQL;
// MainDataModule.ADOQuUserNum.Active:=false;
end;
result:=i;
end;
3、如果只是数据库初始化的建立,你可以使用以下方法:你不是在编写软件吗,将你当前
sql server中对应的数据库备份出来(里面的调试记录当然要删除),然后编程将该文件
恢复到用户数据库中即可。使用是backup和restore sql命令,详细的请参见sql server
在线帮助文件(你也可以到 www.playicq.com 去找找类似的源代码)。
祝您好运!顺带说一句,我可不是小子,已经30出头了。