请高手帮忙!如何自动运行?(100分)

  • 主题发起人 主题发起人 偶像痞子
  • 开始时间 开始时间

偶像痞子

Unregistered / Unconfirmed
GUEST, unregistred user!
我是初学者,公司要我做一个类似sql的数据维护计划的东西。
描述:通过向导填写一些必要的资料,按完成就生成了自己的维护计划,随后进入后台运行(功能:可自己删除几天前的文件,并每天自动复制文件)。
可小生就是不懂怎么让他每天自动运行,要是每天都关机那不是要每天都打开一次??
还有就是如果它已经工作,可顾客又打开这个程序,那会不会和原来的产生冲突?
请大侠们务必说得详细一点。
 
用Tregedit类操作注册表
写入 run,runonce 健值里面即可
这方面www.google.com艘一下 很多的
 
做成Windows的服务程序
new--Service Applciation
具体方法到全文检索中搜一下
 
既然是维护数据库的,想来服务器也不能常关常启啦
做成windows的服务程序就行,
也可以,做成实时的可执行文件
 
1:自动运行,可以用tregestry类来访问注册标,改其中的run键值即可
2:防止一个程序启动两次,也可以用代码实现
明天我找找代码再告诉你
 
var
Reg: TRegistry;
begin
Reg := TRegistry.Create;
try
Reg.RootKey := HKEY_CURRENT_USER;
if Reg.OpenKey('/Software/Microsoft/Windows/CurrentVersion/Run', True)
then
Reg.WriteString('写入键值');//包括名称、路径等
finally
Reg.CloseKey;
Reg.Free;
end;
end;
 
流浪ren大哥,如何防止程序启动两次啊?
就是我的程序要在幕后运行,势必要隐藏,可别人不知道,不停的打开怎么办?
大哥快找找啊!
 
program test;
uses
Forms,
windows,
messages,
Main in 'Main.pas' {Form1};
const
CM_RESTORE = WM_USER + $1000;
{自定义的“恢复”消息}
MYAPPNAME = 'My Delphi Program';
var
RvHandle : hWnd;
{$R *.RES}
begin
RvHandle := FindWindow(MYAPPNAME,NIL);
if RvHandle > 0 then
begin
PostMessage(RvHandle,CM_RESTORE,0,0);
Exit;
end;

Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.

////////////////////////
unit Main;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
const
CM_RESTORE = WM_USER + $1000;
{自定义的“恢复”消息}
MYAPPNAME ='My Delphi Program';
type
TForm1 = class(TForm)
Label1: TLabel;
private
{ Private declarations }
public
procedure CreateParams(var Params: TCreateParams);
override;
Procedure RestoreRequest(var message: TMessage);
message CM_RESTORE;
{ Public declarations }
end;

var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.CreateParams(var Params: TCreateParams);
begin
inherited CreateParams(Params);
Params.WinClassName := MYAPPNAME;
end;

{处理“恢复”消息}
procedure TForm1.RestoreRequest(var message: TMessage);
begin
if IsIconic(Application.Handle) = TRUE then
Application.Restore
else
Application.BringToFront;
end;

end.
 
可参考Delphi安装目录下的Source/Vcl/scktsrvr.dpr工程是怎样实现的。
 
避免一个程序二次运行
--------------------------------------------------------------------------------
实现单实例运行的关键是判断前一实例是否存在,Win3.x中运行的程序能获知前一实例的句柄,从而可以方便地进行判断,但 Windows 95 是抢先式多任务系统,其程序的前一实例句柄恒为零,所以只有另寻其他办法。目前最有效的办法是通过查看是否有相同窗口类名的例程存在来进行判断。下面介绍在Delphi中实现的方法。
1、对主窗口程序的改动:
在主窗口(即程序创建的第一个窗口)中interface节加入
const
CM_RESTORE = WM_USER + $1000;
{自定义的“恢复”消息}
MYAPPNAME = "My Delphi Program";
并在Form的定义的public节中加入
procedure CreateParams(var Params: TCreateParams);
override;
Procedure RestoreRequest(var message: TMessage);
message CM_RESTORE;
在implementation节中加入
{指定窗口名称}
procedure TForm1.CreateParams(var Params: TCreateParams);
begin
inherited CreateParams(Params);
Params.WinClassName := MYAPPNAME;
end;

{处理“恢复”消息}
procedure TForm1.RestoreRequest(var message: TMessage);
begin
if IsIconic(Application.Handle) = TRUE then
Application.Restore
else
Application.BringToFront;
end;

经过以上修改,程序的主窗口的类名已经被指定了,这是进行判断的基础。一般在程序刚开始运行的时候进行判断,所以还要对DPR文件进行修改。
2、对DPR文件的改动
在 uses 节中添加 windows、messages这两个单元加入下列语句,注意两个文件中常量CM_RESTORE和MYAPPNAME的定义必须一致
const
CM_RESTORE = WM_USER + $1000;
{自定义的“恢复”消息}
MYAPPNAME = "My Delphi Program";
var
RvHandle : hWnd;
将下列语句插到程序最前部(在Application.Initialize之前)
RvHandle := FindWindow(MYAPPNAME, NIL);
if RvHandle > 0 then
begin
PostMessage(RvHandle, CM_RESTORE, 0, 0);
Exit;
end;
这段程序的意思是如果找到一个类名相同的窗口,则向该窗口发送一个消息,并退出,而本例中原窗口收到该消息后会自动激活或从图标还原,从而达到了避免二次运行且能自动调出前一例程的目的
 
各位大哥,ok了。小弟已接受答案,谢谢。小小意思,不承敬意。
 
后退
顶部