C/S 模块文件的调用
我在调用模块时,为保障用户使用顺畅,只能调用一个模块。打开一个模块,其它模块自动关闭。因此,使用时,不能同时查看所有的窗口,很不方便。近期脑洞一开,可否同时调用二个模块,这样,软件可以以一个模块为主,再调用一个模块,这样就可以浏览全部窗口了,试用一下很好用。经验分享:
前期说明:
一、结构
C/S模式下,模块文件,本人喜欢使用,以下格式:
UpLoad.exe // 下载更新EXE
↓
Main.exe // 主程序
↓
UpLosdFirst.exe // 下载UpLoad.exe
↓ ↓ ↓
M1.exe M2.exe ........ Mn.exe
这样,可以快速更新全体EXE以及配套文件。使用上功能全面,界面细至友好,不象B/S选择浏览器,还不断地出现问题。
上图,是查看内存中的二个模块(线程)。
这样,让C/S程序,能够更加好用,实现调用全部的窗口的目的。
二、模块的组成
软件中,涉及的模块达30多个,窗口有200-300多个,包含某业务的全部制度和台账的设置,浏览、记录和打印。如此多的的窗口。使用B/S也是很困难的,更谈不上完美打印了。
通过B/S的子模块,完全可以实现。
1、单个模块,以业务员的独特的主要功能为主,组成30个以内的窗口。
2、主Main.EXE,调用所有的子程序模块。这样,如同Windows同时打开多个程序,会造成操作系统的反应速度,并占用内存过多。
因此,需要在主程序中,建立一个函数,调用子程序时前,关闭忆打开的子程序,保障主程序,只能调用 一个子程序。
注意:通过实践,建议主程序可以同时调用二个独立的模块(EXE)。这样,同时打开二个功能模块,业务上就能完全同时兼顾查看全部窗口,软件的全部窗口。
3、每个模块,结构上完全独立的EXE。管理下载时,指定电脑下载模块权限,加强软件的安全性。通过每台电脑的机器码,实现权限管理。
4、每个用户(业务员),各自的模块权限和窗口权限,以及业务的编辑权限。
模块窗口,与用户友好界面,功能实现快捷。
三、使用VPN
只要有网,就能使用,达到远程办公的效果。
四、登录以及对数据的操作的记录
1、建立业务员使用记录,记录操作时,例如登录退出模块、保存、删除数据的详细记录。
五、让主程序同时能调用二个模块,解决C/S,全功能窗口的调用。
1、将每次调用EXE的文件名,加入EXE_List中,用于判断删除取舍;
2、使用保障只能调用二个模块,否则,造成系统的负担;
3、调用模块时,保持一个主模块EXE,调用其他模块,及时删除其它模块(线程)。
例如:
主程序:
调用“风险控件”模块后,还可以调用"护理报告”模块,二者任务中切换:
这样,C/S可以操作一个主业务模块,同时调用另一个模块。达到全部窗口的调用。
相关关闭模块的代码:
procedure KilAllExe; // 关闭正在运行的进程
var i:Integer;
begin
if EXE_List.Count>0 then // 全部删除
begin
for i:=0 to EXE_List.Count-1 do
if FindTask(EXE_List.Strings[i]) then
KillTask(EXE_List.Strings[i]);
for i:=EXE_List.Count-1 downto 0 do
EXE_List.Delete(i);
end;
end;
procedure KilAllExe_Keep2; // 保持2个
var i:Integer;
begin
if EXE_List.Count>=2 then
begin
for i:=1 to EXE_List.Count-1 do // 保持第一个
if FindTask(EXE_List.Strings[i]) then
begin
KillTask(EXE_List.Strings[i]);
end;
for i:=EXE_List.Count-1 downto 1 do
EXE_List.Delete(i);
end;
end;
同时,设置一个Boolean全局参数EXEKeep2,确定业务员能打开二个模块,否则。只能打开一个模块。
对于电脑操作好的业务员,可以开通调用二个模块(甚至多个模块)。
调用代码:
procedure TFrame1.sSpeedButton1Click(Sender: TObject);
var FirstName,EXEName,FileName,sParam,S:string;
IniFile: TIniFile;
begin
FirstName:='Best';
if EXEKeep2
then KilAllExe_Keep2 // 保持 2个 EXE
else KilAllExe; // 关闭全部EXE
if not Meun[1] then
begin
ShowMessage('你无权限,进入!');
exit;
end;
EXEName:=FirstName+'_'+sFCID+'.exe';
FileName:=MainPath+EXEName;
if Not FileExists(FileName) then
begin
EXEName:=FirstName+'.exe';
FileName:=MainPath+EXEName;
end;
if FileExists(FileName) then begin
EXE_List.Add(EXEName);
DateTimetoString(S,'yyyy-MM-dd hh:nn:ss',now);
REC_List.add(S+' 进入;'+EXEName);
shellexecute(ExeHandle,'open',pchar(FileName),pchar(sParam),nil,sw_shownormal);
end
else ShowMessage('无模块文件! ');
end;