几个苦苦思索的问题!(100分)

  • 主题发起人 主题发起人 youhard
  • 开始时间 开始时间
Y

youhard

Unregistered / Unconfirmed
GUEST, unregistred user!
各位大虾:
1、一个软件安全性要求很高,如果它在一段时间内没有操作的话,就自动关闭这个
软件,关闭之前界面闪动几秒钟,或弹出提示?
2、主窗体的FormStyle 设为fsMDIForm,如何改变这个窗体的图案(不是色彩)?
3、用户对一个软件的操作,如何记录下来?
不胜感激,愿出100大洋!
 
第一,三个问题:可以用一个时钟控制,这需要你能对你软件的鼠标或键盘的闲置进行消息处理.
第二个问题:在大富翁的已答问题中你查找一下MDI方面的问题即可查到.有详细的原码.
 
liang兄:
问题1:只是对本软件没有操作,就关闭本软件,只是判断当前鼠标或键盘的闲置是不
不够的,应该是对本软件的操作闲置。
 

1.这样,有一个时钟,在程序的每个响应函数的头部(比如:按按钮之类)都加上一句
重新计时的语句,就行了。时间到了就关闭!


 
pass兄:
这样恐怕也不行,因为那会变成,程序中任何一个控件一段时间内不操作,就会关闭窗
体。
问题2:我查过关于MDI的答案,测试原代码,发现都不成功。我的系统是Win2000,用的是
Delphi5.0。不知各位大虾有什么其它的好办法。
 
长时间不操作,就关闭程序的方法我已经找到了!
 

我的意思是:共用一个时钟。程序大点,可能比较麻烦.

 
关于2,有个笨办法,在主窗口上加一个panel,当子窗口显示的时候隐藏它,
当没有子窗口显示的时候显示它,在它上面可加上任何你喜欢的东西。
关于1、2,PASS兄是对的,你理解错了,并非每个控件都拥有一个计时器,
而是所有控件公用一个。
 
好长时间都登不上大富翁:-(
Pass and eyes4 两位大虾:
第1个问题我是这样来解决的:检测当前主窗体是否被激活:Tapplication类有一个属
性——Active,这个属性就可以描述当前运行的程序是否被激活,成为Windows的焦点。
检测的代码如下:
procedure TMainForm.Timer1Timer(Sender: TObject);//设定Timer 时间
begin
If Application.Active=False then
Mainform.Close(’当前窗口没有被激活,关闭主窗体’);
end;
请二位大虾给个意见!
第2个问题:eyes4兄的方法很好啊!稍后一定把银子双手奉上!
第3个问题不知哪位大虾遇到过,请指点!!

 
3------可以用applicatio.onmessage来完成,就是需要在处理过程里面加以判断以断定
相应的是什么操作,然后再记录下来,不知道对你的程序有没有用。
 
第二个问题:
来自一行大师 :-)
关于FORM背景新解(包含MDI) ( 一行解决问题!!!!)
在Form中添加Image控件
设BMP图象 name为 IMG_BK
在Foem的Create事件中写入
Self.brush.bitmap:=img_bk.picture.bitmap;
 
3: 做一个日志表,所有需要记录的操作都存入。
 
一段时间内没有操作的话,就自动关闭这个软件:

一个 TTimer ,OnTimer 事件里这样写:
procedure Timer1OnTimer...
begin
if Count = 10000 then Do you Exit Code ...
Inc(Count);
end;

截获所有的键盘和鼠标,只要一产生动作,马上把 Count 设置为 0 。
截获所有的键盘和鼠标可以用钩子,简单地也可以用 Form.KeyPreview 配合 MouseMove 等。
前一个办法比较好。
 
To sunny18 and shd:能不能讲的详细一些!
To tinytao:这个"一行解决问题"只能在Win98下用,在Win2000下不行:-(
 
第二个问题:
"一行解决问题"我在WIN98、WIN NT 用过都可以,WIN2000没有试过,
一行不可以,试试这个吧,不过我也没有在WIN2000试过。但WIN NT可用
给MDI主窗口加背景
由于MDI主窗口的特性,使用普通OnPaint和使用TImage等方法都不会产生作用。
下面将用编写一个简单的MDI程序来介绍如何实现。
第一步:创建一个新的工程。
第二步:将Form1的FormStyle设置为fsMDIForm,设置成MDI的主窗口。
第三步:在Form1上增加一个Image元件,并选择要设置的背景到Image的Picture中。
第四步:在Form1的Private中定义:

FClientInstance,
FPrevClientProc : TFarProc;
PROCEDURE ClientWndProc(VAR Message: TMessage);

第五步:在实现(implementation)中加入上述过程的具体内容:

PROCEDURE TForm1.ClientWndProc(VAR Message: TMessage);
VAR
MyDC : hDC;
Ro, Co : Word;
begin
with Message do
case Msg of
WM_ERASEBKGND:
begin
MyDC := TWMEraseBkGnd(Message).DC;
FOR Ro := 0 TO ClientHeight DIV Image1.Picture.Height DO
FOR Co := 0 TO ClientWIDTH DIV Image1.Picture.Width DO
BitBlt(MyDC, Co*Image1.Picture.Width, Ro*Image1.Picture.Height,
Image1.Picture.Width, Image1.Picture.Height,
Image1.Picture.Bitmap.Canvas.Handle, 0, 0, SRCCOPY);
Result := 1;
end;
else
Result := CallWindowProc(FPrevClientProc, ClientHandle, Msg, wParam, lParam);
end;
end;

第六步:
//---------------------------(方法一)
在Form1的创建事件中加入:
var
Tmp_handle:HWND;
begin
if FormStyle=fsMDIForm then Tmp_handle:=ClientHandle
else Tmp_handle:=Handle;
FClientInstance:=MakeObjectInstance(ClientWndProc);
FPrevClientProc:=Pointer(GetWindowLong(Tmp_handle, GWL_WNDPROC));
SetWindowLong(Tmp_handle, GWL_WNDPROC, LongInt(FClientInstance));
end;
//---------------------------(方法二)

重载form.createwnd;在这里指向新的clientcreatewnd
在private声明
procedure Createwnd; override;
然后:
procedure TForm1.Createwnd;
begin
inherited createwnd;
FPrevClientProc:=pointer(getwindowlong(clienthandle,gwl_wndproc)); //保存旧的
FClientInstance:=makeobjectinstance(clientwndproc);
setwindowlong(clienthandle,gwl_wndproc,longint(FClientInstance)); //指向新的
end;
//---------------------------

上面的步骤已经完成了MDI主窗口背景图案的设置,下面可以增加一个MDIChild窗口,实现MDI程序。

第七步:新增加一个Form,并将FormStyle设置为fsMDIChild。

现在你可以编译运行这个程序,
你会发现,Image元件并不会在Form上显示出来,但是整个Form的客户区域被Image中的图像所铺满。
*************************
第三个问题:
用TProvider控件的 AfterUpdateRecord事件

 
一点说明:以上是来自
http://www.delphibbs.com/delphibbs/dispq.asp?LID=369296
多谢:menxin、yuhung、Crab
 
To tinytao:
这个方法我也试过,不行!:-(
 
第二个问题不行,还是第三个问题?
 
第三个问题:用按钮、菜单的tag属性,tag的定义自己规定。
 
To tinytao:
是第二个问题:父窗体图案,用这个方法不行:-(
关于操作日志的问题,我一点头绪都没有,大家能不能讲的祥细些,谢谢:-)
 
后退
顶部