关于引擎控制台的改进想法

引擎控制台集成了许多设置处理事件,庞大的单元结构容易让思路不是很清晰,加上引用文件的定义,或多或少会让维护带来不变,在学习的过程中,将它重写一遍,不用第三方控件,实现的思路大概如下:
360截图20151220221953759

将操作界面适当扩大,后续按照标签增加服务端的脚本设置功能,所有涉及文本操作和线程监控的都写到一个程序里边,初步的服务端界面已经基本完成,实现的功能:
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中,先看看一部分启动选项和窗口端口设置:

360截图20151220224019181

接下来的设置文件还需要好多表,我觉得使用数据库处理,关系比较容易弄清楚,虽然不如INI简洁\高效,其实所有的设置都可以放到一个XML里边,不过对那个我不是很熟悉,在没有把引用关系搞明白之前,先用数据库代替.

到这里,原先11个界面的处理过程放到了一个页面,并且功能一点都不少,程序看起来也很容易理解,对比原先服务端的代码,我发现这样的处理方式要好很多,至少不用在INI读写时费那么多脑筋,但是在服务启动过程中通过数据库读取配置就不是那么容易和高效了,但我用自己的方式去理解了,我就学到了.整个服务端打算用1年时间重构一遍,我会尽量不用任何第三方控件,这就要牺牲运行效率了,毕竟原端有好多优秀的控件,先不去考虑它,主要为的是学习.自己为自己加油.

posted @ 2015-12-20 22:51  陨落流星  阅读(801)  评论(0编辑  收藏  举报