关于引擎控制台的改进想法
引擎控制台集成了许多设置处理事件,庞大的单元结构容易让思路不是很清晰,加上引用文件的定义,或多或少会让维护带来不变,在学习的过程中,将它重写一遍,不用第三方控件,实现的思路大概如下:
将操作界面适当扩大,后续按照标签增加服务端的脚本设置功能,所有涉及文本操作和线程监控的都写到一个程序里边,初步的服务端界面已经基本完成,实现的功能:
1.设置服务启动选项,去掉checkbox,原来大概有30多个,改用CheckListBox.
2.服务器设置不用INI文件和文本文件,在此增加了一access数据库,将代码尽量减少,设置尽量灵活.
3.端口批量处理操作,一机多服的时候进行端口批量加减操作,都用数据库来处理,数据库用的时候读,不用的时候关掉.
unit gmain;//主单元,整个主单元不涉及功能实现部分 interface uses Classes, Controls, Forms, ComCtrls, CheckLst, StdCtrls, SysUtils; type TFormMain = class(TForm) PageControl: TPageControl; ts1: TTabSheet; ts2: TTabSheet; btnDefaule: TButton; CheckListBoxServerControl: TCheckListBox; GroupBoxGameDIRDBSet: TGroupBox; ...... btnSaveSettings: TButton; btnDecOne: TButton; procedure FormShow(Sender: TObject); procedure CheckListBoxServerControlClick(Sender: TObject); procedure btnDefauleClick(Sender: TObject); procedure btnLoadSettingsClick(Sender: TObject); procedure btnSaveSettingsClick(Sender: TObject); procedure btnPortAddOneClick(Sender: TObject); procedure btnDecOneClick(Sender: TObject); private { Private declarations } public { Public declarations } end; var FormMain: TFormMain; implementation uses func; {$R *.dfm} procedure TFormMain.FormShow(Sender: TObject); begin ServerControlSet(Load); //加载服务启动选项 end; procedure TFormMain.CheckListBoxServerControlClick(Sender: TObject); begin ServerControlSet(WriteIn);//更改服务启动选项,这个其实和上边的是一个过程 end; procedure TFormMain.btnDefauleClick(Sender: TObject); begin LoadConfig(DefaultConfig); //记载默认配置 end; procedure TFormMain.btnLoadSettingsClick(Sender: TObject); begin LoadConfig(CustomConfig); //加载自定义配置 end; procedure TFormMain.btnSaveSettingsClick(Sender: TObject); begin SaveConfig; //保存配置 end; procedure TFormMain.btnPortAddOneClick(Sender: TObject); begin PortAdd(1); //端口+1,原先想写到界面里边,现将参数固定到这里 end; procedure TFormMain.btnDecOneClick(Sender: TObject); begin PortAdd(-1); //端口-1 end;
功能实现部分放到函数处理单元,但是怎么尽量不使用可视化控件我还没有理清楚,基本的功能都集中到了这个单元,还有个消息单元正在编写,常量准备放到一个单元,之前applem2端的所有常量我正在按关系进行分类,之后都会整理到一个单元.
下边的函数单元看起来还是有点乱
unit func; //数据处理函数单元,主要用于原先INI和TXT的服务设置部分 interface uses Classes, Controls, CheckLst, StdCtrls,SysUtils; type ServerControl = (Load, WriteIn);{加载,写入} ServerConfig=(DefaultConfig,CustomConfig);{默认设置,自定义设置} procedure ServerControlSet(Flags: ServerControl); procedure LoadConfig(Flags:ServerConfig); procedure SaveConfig; procedure PortAdd(Num: Integer); implementation uses dmmain, gmain; procedure ServerControlSet(Flags: ServerControl); var i: integer; begin DM.Connect(True); with DM.TableServerControl do begin Open; if Flags = Load then begin for i := 1 to FieldCount - 1 do begin FormMain.CheckListBoxServerControl.Items.Add(Fields[i].FieldName); FormMain.CheckListBoxServerControl.Checked[i - 1] := Fields[i].Value; end; end else if Flags = WriteIn then begin Edit; for i := 1 to FieldCount - 1 do begin Fields[i].Value := FormMain.CheckListBoxServerControl.Checked[i - 1]; end; Post; end; Close; end; DM.Connect(False); end; procedure LoadConfig(Flags:ServerConfig); var i: Integer; begin dm.Connect(True); DM.TablePointAndPort.Open; if Flags=DefaultConfig then begin DM.TablePointAndPort.Last;//数据表第二行(一共两行),默认设置 end else begin DM.TablePointAndPort.First;//数据表第一行(一共两行),自定义设置 end; with FormMain do begin for i := 0 to ComponentCount - 1 do begin if Components[i] is TEdit then begin if Components[i].Tag > 0 then //将编辑框按标签分组,遍历从数据库中读取 begin TEdit(Components[i]).Text := DM.TablePointAndPort.Fields[Components[i].Tag].Value; end; end; end; end; DM.TablePointAndPort.Close; DM.Connect(False); end; procedure SaveConfig; //保存设置 var i: Integer; begin Dm.Connect(True); DM.TablePointAndPort.Open; DM.TablePointAndPort.First; DM.TablePointAndPort.Edit; with FormMain do begin for i := 0 to ComponentCount - 1 do begin if Components[i] is TEdit then begin if Components[i].Tag > 0 then begin DM.TablePointAndPort.Fields[Components[i].Tag].Value := TEdit(Components[i]).Text; end; end; end; end; DM.TablePointAndPort.Post; DM.TablePointAndPort.Close; DM.Connect(False); end; procedure PortAdd(Num: Integer); var i: Integer; begin with FormMain do begin for i := 0 to ComponentCount - 1 do begin if Components[i] is TEdit then begin if (Components[i].Tag in [3, 4, 7, 8, 11..13, 16, 19, 20, 23, 28..35]) then begin TEdit(Components[i]).Text := IntToStr(StrToIntDef(TEdit(Components[i]).Text, 0) + Num); end; end; end; end; end; end.
原先的设置都保存在INI文件和文本文件中,我将不需要用作M2脚本的都规整出来,放到access中,先看看一部分启动选项和窗口端口设置:
接下来的设置文件还需要好多表,我觉得使用数据库处理,关系比较容易弄清楚,虽然不如INI简洁\高效,其实所有的设置都可以放到一个XML里边,不过对那个我不是很熟悉,在没有把引用关系搞明白之前,先用数据库代替.
到这里,原先11个界面的处理过程放到了一个页面,并且功能一点都不少,程序看起来也很容易理解,对比原先服务端的代码,我发现这样的处理方式要好很多,至少不用在INI读写时费那么多脑筋,但是在服务启动过程中通过数据库读取配置就不是那么容易和高效了,但我用自己的方式去理解了,我就学到了.整个服务端打算用1年时间重构一遍,我会尽量不用任何第三方控件,这就要牺牲运行效率了,毕竟原端有好多优秀的控件,先不去考虑它,主要为的是学习.自己为自己加油.