请教:如何动态创建TIDTCPserver并为之分配相应的onexecute处理事件?

sodme 2003-12-19 10:14:00
一般情况下,我们都是把TIDTCPserver的控件拖到FORM上,然后直接双击其ONEXECUTE事件并编写此事件的处理代码,现因需要,要动态创建TIDTCPserver,并在创建后为之分配onexecute的处理事件,请教有经验的朋友,如果为此程序传递参数?给定的处理模块为ServerExecute(AThread: TIdPeerThread),在以下的代码中:
ServerSocket := TIDTcpServer.Create(self);
ServerSocket.DefaultPort := ListenPort;
ServerSocket.OnExecute := ServerExecute(); //此处serverexecute传递进来的参数应该是什么??

ServerSocket.Active := true;

谢谢。
...全文
141 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2003-12-19
  • 打赏
  • 举报
回复
谢谢。问题已经解决。
VeryOldMan 2003-12-19
  • 打赏
  • 举报
回复
可参考:
http://expert.csdn.net/Expert/topic/2520/2520048.xml?temp=.9329187
TApplication.OnIdle   当应用程序变为空闲时,OnIdle事件发生。   使用OnIdle事件,可以写一个应用程序空闲时执行特定处理的事件处理程序。当应用程序不处理代码时,称为应用程序空闲。例如,当应用程序等待来自用户的输入时,应用程序为空闲。   TIdleEvent类型是OnIdle事件的类型,它指向一个应用程序空闲时运行的方法。TIdleEvent类型有一个布尔型参数Done,默认时该参数为True。若参数Done为True,当OnIdle事件返回时,调用Windows API WaitMessage函数。只有在应用程序消息队列中出现一个新消息时,WaitMessage函数才放弃对其他应用程序的控制。参数Done为False时,即使应用程序不忙,也不放弃对其他应用程序的控制。   当应用程序转移到空闲状态时,只调用一次OnIdle事件。除非参数Done设置为False,否则不连续调用OnIdle事件。将参数Done设置为False的应用程序,将消耗过多的CPU时间,从而影响整个系统性能。 在delphi中, 当在一个窗口上放置一个ApplicationEvents控件时,Application将会把所有的事件都转寄到ApplicationEvents; 也就是说,ApplicationEvents可以拦截到应用程序的全部事件,包括OnActivate\OnHelp\OnIdle\OnRestore\OnShortCut等等, 甚至可能通过OnMessage事件,在其中截取所有post到应用程序中所有窗口的消息,如WM_PAINT,WM_KEYDOWN, WM_KEYUP等常见的windows消息; 所以当有消息到来的时候就会触发它的OnMessage事件,在OnMessage中监视消息就可以了。 Action的事件有OnExecute和OnUpdate,OnExecute事件在控制被触发时响应,比如说按钮被按下,菜单被按下,而OnUpdate事件是在应用程序空闲时被调用, APPLICATIONEVENTS是用来捕获程序级事件的 ApplicationEvents1Message(var Msg: tagMSG;var Handled: Boolean); {通过 Perform 向窗体发送 消息; OnMessage 收不到} {通过 SendMessage 向窗体发送 消息; OnMessage 收不到} {通过 PostMessage 向窗体发送  消息; OnMessage 可以收到}
今天做程序的时候发现Action多了不好控制于是做了一个类似dxBar.Group功能的东东继承自TCollection/TCollectionItem可以将一些TContainedAction作为一个组来控制当然,修改一下就可以将TComponent作为一个组来控制 :)写得比较简单如果哪位有时间可以给她做个属性编辑器,呵呵有哪位修改了也请给我发一份 :)sephil@163.comActionGroup.pas是源文件NSC_ComponentGroup.mpb是ModelMaker的工程文件其他的是Demo另外有个问题我不会就是如何将一个Event(比如TNotifyEvent)转换为TMethod我用的是变通的手段var FGroups: TNSC_ActionGroup;procedure TForm1.FormCreate(Sender: TObject);begin FGroups := TNSC_ActionGroup.Create(TNSC_ActionGroupItem); FGroups.Add.AddFromActionList(ActionList1, ‘1‘); FGroups.Add.AddFromActionList(ActionList1, ‘2‘); FGroups.Add.AddFromActionList(ActionList1, ‘3‘); FGroups.Add.AddFromActionList(ActionList1, ‘4‘);end;procedure TForm1.NewClick(Sender: TObject);begin ShowMessage(‘123‘);end;procedure TForm1.Action1Execute(Sender: TObject);var M: TMethod; C: TLabel;begin // Setup OnExecute event // I really don‘t know how to convert an event (such as TNotifyEvent) to TMethod C := TLabel.Create(nil); try C.OnClick := NewClick; M := TMethod(C.OnClick); finally C.Free; end; FGroups[0].SetProperty(‘OnExecute‘, M); FGroups[0].SetProperty(‘Caption‘, ‘11‘); FGroups[1].SetProperty(‘Caption‘, ‘Test‘); FGroups[2].SetProperty(‘Enabled‘, False); // Get OnExecute from gruop 1 and set to group 4 FGroups[0].GetProperty(‘OnExecute‘, M); FGroups[3].SetProperty(‘OnExecute‘, M); if FGroups[3].PropertyGrouped(‘Enabled‘) then ShowMessage(‘Group[3] ‘‘Enabled‘‘ property grouped‘); if not FGroups[3].PropertyGrouped(‘Enabled‘, False) then ShowMessage(‘Group[3] ‘‘Enabled‘‘ property not grouped to ‘‘False‘‘‘); if not FGroups[3].PropertyGrouped(‘Caption‘, ‘Action10‘) then ShowMessage(‘Group[3] ‘‘Caption‘‘ property not grouped to ‘‘Action10‘‘‘);end;
KYWin 使用简单, 只要头文件中包含有: #include "KYWin.h" 就可以了。 KYWin 提供丰富的函数和类, 如: a. 注册表类 {TRegistry} b. 日志事件类 {TEventLogger} c. 服务相关类 {TKYWinSvc, TKYService, TKYSvcApp} 特别是开发服务应用程序时会非常简单, 例子: #include "KYWin.h" // 启动 static bool DoStart(const TKYStringList& AParams, bool AIsSvc) { // ??? ... ... return true; } // 停止 static void DoStop(bool AIsSvc) { // ??? ... ... } // 控制台方式下执行 static void DoExecute(const TKYStringList& AParams) { // 显示 printf("..... OnExecute is running.\n"); // 等待结束 printf("Press Ctrl+C stop application.\n"); while (_getch() != 0x03); } // 用户自定义开关 static void DoUser(long ASwitch, int argc, char* argv[]) { printf("switch(%d) <%s> is run.\n", ASwitch, argv[1]); } // 主函数 int main(int argc, char* argv[]) { // 初始化 TKYSvcApp objApp("TestSvc", "Service demo", "Test TKYSvcApp demo"); // 设置启动/停止的回调函数 objApp.OnStart = DoStart; objApp.OnStop = DoStop; // 自定义应用控制时的回调函数 /* objApp.OnExecute = DoExecute; objApp.OnUser = DoUser; //*/ // 设置对象属性 /* objApp.SvcObj()->SetAllowPause(false); // 关闭暂停控制 objApp.SvcObj()->SetStartType(sstSvcDemand); // 手动启动 //*/ // 若有依赖服务则可以添加 /* objApp.SvcObj()->Dependencies()->Add("Service1"); // 普通服务 objApp.SvcObj()->Dependencies()->Add("Service2", (void*)true); // 组服务 //*/ // 自定义参数开关(注: 默认参数开关可以通过 /? 显示) /* objApp.ClearSwitchs(); objApp.AddSwitch(TKYSvcApp::asHelp, "/?", "显示帮助信息"); // 更改默认的提示信息 objApp.AddSwitch(TKYSvcApp::asHelp, "/help"); objApp.AddSwitch(TKYSvcApp::asConsole, "/console", "控制台方式运行");// 更改默认的提示信息 objApp.AddSwitch(TKYSvcApp::asService, "/service", "服务方式运行"); // 更改默认的提示信息 objApp.AddSwitch(TKYSvcApp::asInstall, "-install"); objApp.AddSwitch(TKYSvcApp::asUninstall, "-remove"); objApp.AddSwitch(TKYSvcApp::asStart, "-start"); objApp.AddSwitch(TKYSvcApp::asStop, "-stop"); objApp.AddSwitch(15, "-u1", "my switch 1"); objApp.AddSwitch(18, "-u2", "my switch 2"); objApp.AddSwitch(20, "-u3"); //*/ // 运行 objApp.Run(argc, argv); // 返回 return 0; }
KYWin 2.0.1.0 (build 2009.08.25) KYWin 使用简单, 只要头文件中包含有: #include "KYWin.h" 就可以了。 KYWin 提供丰富的函数和类, 如: a. 注册表类 {TRegistry} b. 日志事件类 {TEventLogger} c. 服务相关类 {TKYWinSvc, TKYService, TKYSvcApp} d. avi 文件类 {TKYAviFile} e. wav 文件相关类 {TKYWaveHead, TKYWaveFile, TKYWaveStore} 特别是开发服务应用程序时会非常简单, 例子: #include "KYWin.h" // 启动 static bool DoStart(const TKYStringList& AParams, bool AIsSvc) { // ??? ... ... return true; } // 停止 static void DoStop(bool AIsSvc) { // ??? ... ... } // 控制台方式下执行 static void DoExecute(const TKYStringList& AParams) { // 显示 printf("..... OnExecute is running.\n"); // 等待结束 printf("Press Ctrl+C stop application.\n"); while (_getch() != 0x03); } // 用户自定义开关 static void DoUser(long ASwitch, int argc, char* argv[]) { printf("switch(%d) <%s> is run.\n", ASwitch, argv[1]); } // 主函数 int main(int argc, char* argv[]) { // 初始化 TKYSvcApp objApp("TestSvc", "Service demo", "Test TKYSvcApp demo"); // 设置启动/停止的回调函数 objApp.OnStart = DoStart; objApp.OnStop = DoStop; // 自定义应用控制时的回调函数 /* objApp.OnExecute = DoExecute; objApp.OnUser = DoUser; //*/ // 设置对象属性 /* objApp.SvcObj()->SetAllowPause(false); // 关闭暂停控制 objApp.SvcObj()->SetStartType(sstSvcDemand); // 手动启动 //*/ // 若有依赖服务则可以添加 /* objApp.SvcObj()->Dependencies()->Add("Service1"); // 普通服务 objApp.SvcObj()->Dependencies()->Add("Service2", (void*)true); // 组服务 //*/ // 自定义参数开关(注: 默认参数开关可以通过 /? 显示) /* objApp.ClearSwitchs(); objApp.AddSwitch(TKYSvcApp::asHelp, "/?", "显示帮助信息"); // 更改默认的提示信息 objApp.AddSwitch(TKYSvcApp::asHelp, "/help"); objApp.AddSwitch(TKYSvcApp::asConsole, "/console", "控制台方式运行");// 更改默认的提示信息 objApp.AddSwitch(TKYSvcApp::asService, "/service", "服务方式运行"); // 更改默认的提示信息 objApp.AddSwitch(TKYSvcApp::asInstall, "-install"); objApp.AddSwitch(TKYSvcApp::asUninstall, "-remove"); objApp.AddSwitch(TKYSvcApp::asStart, "-start"); objApp.AddSwitch(TKYSvcApp::asStop, "-stop"); objApp.AddSwitch(15, "-u1", "my switch 1"); objApp.AddSwitch(18, "-u2", "my switch 2"); objApp.AddSwitch(20, "-u3"); //*/ // 运行 objApp.Run(argc, argv); // 返回 return 0; }
#include "stdio.h" #include "KYLin.h" // 启动 static int DoStart(const TKYStringList& AParams, bool AIsSvc) { // 显示 if (!AIsSvc) printf("..... OnStart(IsSvc: false) is running.\n"); // ??? ... ... return 0; } // 停止 static void DoStop(bool AIsSvc) { // 显示 if (!AIsSvc) printf("..... OnStop(IsSvc: false) is running.\n"); // ??? ... ... } // 控制台方式下执行 static void DoExecute(const TKYStringList& AParams, TKYSvcApp* ASvcApp) { // 显示 printf("..... OnExecute is running.\n"); // 等待结束 printf("press [Ctrl+C] stop application.\n"); while (!ASvcApp->Terminated()) ASvcApp->Notify()->Wait(); } // 用户自定义开关 static int DoUser(long ASwitch, int argc, char* argv[]) { printf("switch(%d) <%s> is run.\n", ASwitch, argv[1]); return 0; } // 主函数 int main(int argc, char* argv[]) { // 初始化 TKYSvcApp objApp("TestSvc", "Service demo", "Test TKYSvcApp demo"); // 设置启动/停止的回调函数 objApp.OnStart = DoStart; objApp.OnStop = DoStop; // 自定义应用控制时的回调函数 /* objApp.OnExecute = DoExecute; objApp.OnUser = DoUser; //*/ // 设置对象属性 /* objApp.SetRunLevel(235); // 服务运行级别 [1, 2, 3, 4, 5] objApp.SetStartNo(20); // 服务启动序号 objApp.SetStopNo(80); // 服务停止序号 objApp.SetIsAuto(false); // 手动启动 //*/ // 自定义参数开关(注: 默认参数开关可以通过 /? 显示) /* objApp.ClearSwitchs(); objApp.AddSwitch(TKYSvcApp::asHelp, "/?", "显示帮助信息"); // 更改默认的提示信息 objApp.AddSwitch(TKYSvcApp::asHelp, "-help"); objApp.AddSwitch(TKYSvcApp::asConsole, "-console", "控制台方式运行");// 更改默认的提示信息 objApp.AddSwitch(TKYSvcApp::asService, "-service", "服务方式运行"); // 更改默认的提示信息 objApp.AddSwitch(TKYSvcApp::asInstall, "-install"); objApp.AddSwitch(TKYSvcApp::asUninstall, "-remove"); objApp.AddSwitch(TKYSvcApp::asStart, "-start"); objApp.AddSwitch(TKYSvcApp::asStop, "-stop"); objApp.AddSwitch(15, "-u1", "my switch 1"); objApp.AddSwitch(18, "-u2", "my switch 2"); objApp.AddSwitch(20, "-u3"); //*/ // 运行 return objApp.Run(argc, argv); }

1,593

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧