3)例如你的button1的click事件是 procedure TForm1.Button1OnClick(Sender : TObject); begin // your code here. end; 直接调用就可以 procedure DoButtonClick;// your function begin Button1OnClick(self); end; end;
触发一个按钮的OnClick最好用Button1.Click
我要拿分了。hcman请看下面的例子,我运行过的:unit Unit1;interfaceuses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;type // 用线程实现,否则你的主程序会一直等 TChangeNotifyThread = class(TThread) private FButton: TButton; protected procedure Execute; override; procedure TriggerButton; public property Button: TButton read FButton write FButton; end; TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); private { Private declarations } FThread: TChangeNotifyThread; FShowingMsg: Boolean; public { Public declarations } end;var Form1: TForm1;implementation{$R *.DFM}{ TForm1 }procedure TForm1.Button1Click(Sender: TObject); begin if not FShowingMsg then try FShowingMsg := TRUE; // 这是为了防止重入 MessageBeep( MB_ICONINFORMATION ); Application.BringToFront; ShowMessage( '文件更新!' ); finally FShowingMsg := FALSE; end; end;procedure TForm1.FormCreate(Sender: TObject); begin FThread := TChangeNotifyThread.Create( TRUE ); // 参数CreateSuspended为真是为了设置Button属性 FThread.Button := Button1; FThread.Resume; // 起动 end;function IsThreadTerminated( Handle: THandle ): Boolean; var lwExitCode: LongWord; begin GetExitCodeThread( Handle, lwExitCode ); Result := STILL_ACTIVE<>lwExitCode; end;procedure WaitForThread( AThread: TThread ); // 这个与上面的函数可以公用出去 begin if not IsThreadTerminated( AThread.Handle ) then Application.ProcessMessages; // 如果没有结束,则让应用程序处理消息,如WM_PAINT end;procedure TForm1.FormDestroy(Sender: TObject); begin FThread.Terminate; WaitForThread( FThread ); // 等待线程结束 FThread.Free; end; { TChangeNotifyThread }procedure TChangeNotifyThread.Execute; var hand: THandle; begin // 我们的例子是要监视C盘根目录下文件名是否改变、是否有文件复制和删除 hand := FindFirstChangeNotification( 'c:\', FALSE, // 第一次创建句柄 FILE_NOTIFY_CHANGE_FILE_NAME ); while not Terminated do // 别忘了检测这个属性 begin if WaitForSingleObject( hand, 2000 )=WAIT_OBJECT_0 then // 等待变化 begin Synchronize( TriggerButton ); // 调用Button.Click FindNextChangeNotification( hand ); // 等待下次的变化 end; end; FindCloseChangeNotification( hand ); // 关闭句柄 end; procedure TChangeNotifyThread.TriggerButton; begin Button.Click; end;end.// 一个简单例子,你可能还需要加一些修改才能实际用到你的程序中btw: kxy,关于线程结束的示范我也做在这里了。
FindNextChangeNotification监测文件改变的source
其中也有waitForSIngerObject的使用 e-mail发出
3)
触发事件(例如:button1.click)是何意思?
procedure TForm1.Button1OnClick(Sender : TObject);
begin
// your code here.
end;
直接调用就可以
procedure DoButtonClick;// your function
begin
Button1OnClick(self);
end;
end;
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;type
// 用线程实现,否则你的主程序会一直等
TChangeNotifyThread = class(TThread)
private
FButton: TButton; protected
procedure Execute; override;
procedure TriggerButton; public
property Button: TButton read FButton write FButton; end;
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
FThread: TChangeNotifyThread;
FShowingMsg: Boolean; public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.DFM}{ TForm1 }procedure TForm1.Button1Click(Sender: TObject);
begin
if not FShowingMsg then
try
FShowingMsg := TRUE; // 这是为了防止重入
MessageBeep( MB_ICONINFORMATION );
Application.BringToFront;
ShowMessage( '文件更新!' );
finally
FShowingMsg := FALSE;
end;
end;procedure TForm1.FormCreate(Sender: TObject);
begin
FThread := TChangeNotifyThread.Create( TRUE );
// 参数CreateSuspended为真是为了设置Button属性
FThread.Button := Button1;
FThread.Resume; // 起动
end;function IsThreadTerminated( Handle: THandle ): Boolean;
var
lwExitCode: LongWord;
begin
GetExitCodeThread( Handle, lwExitCode );
Result := STILL_ACTIVE<>lwExitCode;
end;procedure WaitForThread( AThread: TThread ); // 这个与上面的函数可以公用出去
begin
if not IsThreadTerminated( AThread.Handle ) then
Application.ProcessMessages; // 如果没有结束,则让应用程序处理消息,如WM_PAINT
end;procedure TForm1.FormDestroy(Sender: TObject);
begin
FThread.Terminate;
WaitForThread( FThread ); // 等待线程结束
FThread.Free;
end;
{ TChangeNotifyThread }procedure TChangeNotifyThread.Execute;
var
hand: THandle;
begin
// 我们的例子是要监视C盘根目录下文件名是否改变、是否有文件复制和删除
hand := FindFirstChangeNotification( 'c:\', FALSE, // 第一次创建句柄
FILE_NOTIFY_CHANGE_FILE_NAME );
while not Terminated do // 别忘了检测这个属性
begin
if WaitForSingleObject( hand, 2000 )=WAIT_OBJECT_0 then // 等待变化
begin
Synchronize( TriggerButton ); // 调用Button.Click
FindNextChangeNotification( hand ); // 等待下次的变化
end;
end;
FindCloseChangeNotification( hand ); // 关闭句柄
end;
procedure TChangeNotifyThread.TriggerButton;
begin
Button.Click;
end;end.// 一个简单例子,你可能还需要加一些修改才能实际用到你的程序中btw: kxy,关于线程结束的示范我也做在这里了。