关于传奇引擎控制台的改进想法
引擎控制台集成了许多设置处理事件,庞大的单元结构容易让思路不是很清晰,加上引用文件的定义,或多或少会让维护带来不变,在学习的过程中,将它重写一遍,不用第三方控件,实现的思路大概如下:
关于传奇引擎控制台的改进想法
将操作界面适当扩大,后续按照标签增加服务端的脚本设置功能,所有涉及文本操作和线程监控的都写到一个程序里边,初步的服务端界面已经基本完成,实现的功能:
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年时间重构一遍,我会尽量不用任何第三方控件,这就要牺牲运行效率了,毕竟原端有好多优秀的控件,先不去考虑它,主要为的是学习.自己为自己加油.
关注过程,不知不觉就发现了结果原来如此...
|