zoukankan      html  css  js  c++  java
  • 关于引擎控制台的改进想法

    引擎控制台集成了许多设置处理事件,庞大的单元结构容易让思路不是很清晰,加上引用文件的定义,或多或少会让维护带来不变,在学习的过程中,将它重写一遍,不用第三方控件,实现的思路大概如下:
    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年时间重构一遍,我会尽量不用任何第三方控件,这就要牺牲运行效率了,毕竟原端有好多优秀的控件,先不去考虑它,主要为的是学习.自己为自己加油.

    关注过程,不知不觉就发现了结果原来如此...
  • 相关阅读:
    nodeType 节点简介
    Hamming Codes
    Preface Numbering(还没好好看USACO的解答)
    位运算常见应用即ACM题优化实例
    Dynamic Programming(动态规划)
    operator new & new operator
    资料记录
    Ordered Fractions
    Healthy Holsteins
    Sorting A ThreeValued Sequence
  • 原文地址:https://www.cnblogs.com/iicc/p/5062137.html
Copyright © 2011-2022 走看看