3.2 Gmain.pas单元
这是引擎控制台的主窗口,就是之前说的那个4500行代码的单元,对大神来说,这不算什么,对我看来说,光是理清里边的关系就很吃力.我知道也许从程序的架构角度去理解会好一些,但咱不懂那些,只好继续以一个菜鸟的方式按单元\按页面逐项查看,期待能获得一些营养.
接口部分也有近500行代码,虽然我是初学delphi,但也知道把所有的功能和定义都放到一个单元对以后维护带来很大不变,这份代码是谁写的我不清楚,但是至少不像比较标准的架构,除了重复的复制代码,就是一些嵌套的过程中的过程和函数函数,这恰是我所需要的,让我明白了如何去架构一个良好的可维护的程序,以及很容易让别人读懂的程序,突然我想到了程序设计中面条式的复杂结构,至少能让我知道怎么去避免写一些不容易看懂的代码.
主单元的界面如下:
可以看出来这么多的界面集成到一个单元是多么的不容易,我觉得可以把界面封装到几个或几组dll里边,界面只实现与VCL状态有关的代码,应该好维护一点,500行声明有400行是界面的控件声明和过程声明,仔细过一遍发现很多过程实现都在窗体控件的方法里边,重用的可能性几乎为零.也许是早期代码的原因,但是有一点我不明白,delphi是很好的面向对象设计的IDE,怎么前辈们就没有想到或利用呢?开始怀疑这个源代码也许是高手写的初级版本,毕竟较成熟的版本很少拿来开源.
窗口自身的单元不用介绍,看界面就知道是干什么的,其定义的其他方法如下:
private
m_boOpen: Boolean; //开关标志
m_nStartStatus: Integer;//启动状态标志,在GShare.pas里边有类似声明
m_dwShowTick: LongWord;
m_dwRefTick: LongWord;
{定义时间变量,用于启动脚本和备份脚本}
m_btHour: Byte;
m_btMinute: Byte;
m_dwRunTime: LongWord;
m_dwRunTick: LongWord;
m_boGateStop: Boolean;
m_boGateStopTick: LongWord;
{上述几个适用于检测启动的服务的,异常或停止的通过设置状态重新启动}
{下边是定义的私有过程,其实可以放到另一个单元}
procedure RefGameConsole(); //加载配置信息到可视化界面
procedure GenGameConfig(); //写入游戏设置文件,以下几个都是
procedure GenDBServerConfig();
procedure GenLoginServerConfig();
procedure GenLogServerConfig();
procedure GenM2ServerConfig();
procedure GenLoginGateConfig();
procedure GenSelGateConfig();
procedure GenRunGateConfig;
procedure GenPlugTopConfig();
{启动\停止服务,这里是通过设置状态,然后通过定时器启动,启动方法在GShare里边}
procedure StartGame();
procedure StopGame();
{发送数据信息,还有一个MainOutMessage被我Ppublic了,为了调试用}
procedure MainOutDataListMessage(sMsg: string);
{发送进程消息,其实就是将服务的启动状态发送到引擎控制带主界面}
procedure ProcessDBServerMsg(wIdent: Word; sData: string);
procedure ProcessLoginSrvMsg(wIdent: Word; sData: string);
procedure ProcessLogServerMsg(wIdent: Word; sData: string);
procedure ProcessPlugTopMsg(wIdent: Word; sData: string);
procedure ProcessLoginGateMsg(wIdent: Word; sData: string);
procedure ProcessSelGateMsg(wIdent: Word; sData: string);
procedure ProcessRunGateMsg(wIdent: Word; sData: string);
function ProcessM2ServerMsg(wIdent: Word; sData: string): Integer;
{加载RunGate网关的设置,因为不是一个,所以猜测Mut应该是多个的意思}
procedure GetMutRunGateConfing(nIndex: Integer);
function StartService(): Boolean;//这个是启动游戏控制台
{以下两个类似GetMutRunGateConfing,都是循环读取网关状态}
procedure GenMutSelGateConfig(nIndex: Integer);
procedure GenMutLoginGateConfig(nIndex: Integer);
procedure LoadBackList();//加载备份列表
procedure RefBackListToView();//这个是将备份信息写到ListView里边
{这是通过Socket发送数据,带MD5校验}
function SendDataListData(wIdent: Word; sData: string): Boolean;
function RefDataListItem(): Boolean;//更新数据函数
procedure ClearDataListItem();//清除旧的数据列表
{下边几个是读取地图数据用的,暂时有点理解困难}
function NewDataListInfo(): pTDataListInfo;//初始化新数据列表
procedure DisposeDataListInfo(DataListInfo: pTDataListInfo);//释放数据列表
function GetNextData(): Boolean;
{取得地图数据信息}
function Map