www.pudn.com > Roulette.rar > main.pas


unit main; 
 
interface 
 
uses 
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
  Dialogs, ActnList, ActnMan, Menus, StdActns, ManagerInterpreter, Tltconst, 
  IniFiles, ExtCtrls, ComObj, ULoading; 
 
type 
  TMainForm = class(TForm) 
    MainMenu1: TMainMenu; 
    ActionManager1: TActionManager; 
    CloseAction: TAction; 
    Action1: TAction; 
    Action2: TAction; 
    Action3: TAction; 
    j1: TMenuItem; 
    N1: TMenuItem; 
    N2: TMenuItem; 
    WindowCascade1: TWindowCascade; 
    WindowTileHorizontal1: TWindowTileHorizontal; 
    WindowTileVertical1: TWindowTileVertical; 
    WindowMinimizeAll1: TWindowMinimizeAll; 
    WindowArrange1: TWindowArrange; 
    N3: TMenuItem; 
    N4: TMenuItem; 
    N5: TMenuItem; 
    N6: TMenuItem; 
    N7: TMenuItem; 
    N8: TMenuItem; 
    N9: TMenuItem; 
    N10: TMenuItem; 
    N11: TMenuItem; 
    N12: TMenuItem; 
    N13: TMenuItem; 
    RoundMonitorAction: TAction; 
    SettingAction: TAction; 
    UpLoadPlayerInfoAction: TAction; 
    DownloadPlayerinfoAction: TAction; 
    Action6: TAction; 
    N14: TMenuItem; 
    N15: TMenuItem; 
    f1: TMenuItem; 
    ResetGameAction: TAction; 
    PauseGameAction: TAction; 
    ResumeAction: TAction; 
    N16: TMenuItem; 
    N17: TMenuItem; 
    N19: TMenuItem; 
    Timer1: TTimer; 
    c1: TMenuItem; 
    N21: TMenuItem; 
    q1: TMenuItem; 
    x1: TMenuItem; 
    N23: TMenuItem; 
    ClearPlayerInfoAction: TAction; 
    DownloadPlayerBetLogAction: TAction; 
    DownLoadGameLogAction: TAction; 
    ClearPlayerBetLogAction: TAction; 
    ClearGameLogAction: TAction; 
    QueryGameLogAction: TAction; 
    N20: TMenuItem; 
    SaveDialog1: TSaveDialog; 
    OpenDialog1: TOpenDialog; 
    OpenDialog2: TOpenDialog; 
    N24: TMenuItem; 
    N25: TMenuItem; 
    N26: TMenuItem; 
    StopAction: TAction; 
    StopOnRoundEndAction: TAction; 
    N27: TMenuItem; 
    N28: TMenuItem; 
    N29: TMenuItem; 
    N30: TMenuItem; 
    ActionChangePassword: TAction; 
    N18: TMenuItem; 
    N22: TMenuItem; 
    N111: TMenuItem; 
    N112: TMenuItem; 
    procedure RoundMonitorActionExecute(Sender: TObject); 
    procedure FormCreate(Sender: TObject); 
    procedure N5Click(Sender: TObject); 
    procedure CloseActionExecute(Sender: TObject); 
    procedure Action6Execute(Sender: TObject); 
    procedure Timer1Timer(Sender: TObject); 
    procedure ResetGameActionExecute(Sender: TObject); 
    procedure PauseGameActionExecute(Sender: TObject); 
    procedure ResumeActionExecute(Sender: TObject); 
    procedure DownloadPlayerinfoActionExecute(Sender: TObject); 
    procedure UpLoadPlayerInfoActionExecute(Sender: TObject); 
    procedure DownLoadGameLogActionExecute(Sender: TObject); 
    procedure DownloadPlayerBetLogActionExecute(Sender: TObject); 
    procedure ClearPlayerBetLogActionExecute(Sender: TObject); 
    procedure ClearPlayerInfoActionExecute(Sender: TObject); 
    procedure ClearGameLogActionExecute(Sender: TObject); 
    procedure StopActionExecute(Sender: TObject); 
    procedure StopOnRoundEndActionExecute(Sender: TObject); 
    procedure ActionChangePasswordExecute(Sender: TObject); 
    procedure ActionManager1Update(Action: TBasicAction; 
      var Handled: Boolean); 
    procedure N111Click(Sender: TObject); 
    procedure N112Click(Sender: TObject); 
 
  private 
    { Private declarations } 
    UserName , Password: String; 
 
  public 
    { Public declarations } 
    RoundState : TRoundState; 
    procedure UpdateRoundInfo(); 
 
  end; 
 
var 
  MainForm: TMainForm; 
  rltSocketConnection : TrltSocketConnection; 
  TimeSetting: TTimeSetting; 
  function rltInterpreter :  TrltManagerInterpreter; 
 
 
implementation 
 
uses DM1, player, playeredit, Round, RoundQuery, Setting, SConnectEx, login, 
  ModifyPass; 
 
{$R *.dfm} 
 
const 
  xlCenter = $FFFFEFF4; 
 
function rltInterpreter :  TrltManagerInterpreter; 
begin 
  Result := nil; 
  if not rltSocketConnection.Connected then Exit; 
  Result := rltSocketConnection.Interpreter as TrltManagerInterpreter; 
end; 
 
 
procedure TMainForm.RoundMonitorActionExecute(Sender: TObject); 
begin 
//显示局管理框 
  if RoundMonitorForm = nil then RoundMonitorForm := TRoundMonitorForm.Create(Self); 
//  bring 
  RoundMonitorForm.Show;  
end; 
 
procedure TMainForm.FormCreate(Sender: TObject); 
var 
  IniFile : TIniFile; 
begin 
  IniFile :=  TIniFile.Create(ExtractFilePath(Application.ExeName)+'roulette.ini'); 
  rltSocketConnection := TrltSocketConnection.Create(Application); 
  rltSocketConnection.Address := IniFile.ReadString('sys','ip','127.0.0.1'); 
  rltSocketConnection.Port := IniFile.ReadInteger('sys','port',8080); 
  IniFile.Free; 
 
  Action6Execute(Sender); 
{  try 
    rltSocketConnection.Connected := true; 
//    TimeSetting := rltInterpreter.CallGetTimeSetting; 
  except 
    //Application.MessageBox('连接服务器失败','', MB_OK or MB_ICONERROR); 
  end;} 
end; 
 
procedure TMainForm.UpdateRoundInfo; 
begin 
//发送命令,更新缓冲 
 
//更新显示 
end; 
 
procedure TMainForm.N5Click(Sender: TObject); 
begin 
  if PlayerForm = nil then PlayerForm := TPlayerForm.Create(Self); 
  PlayerForm.Show; 
end; 
 
procedure TMainForm.CloseActionExecute(Sender: TObject); 
begin 
  Close; 
end; 
 
procedure TMainForm.Action6Execute(Sender: TObject); 
var 
  Count : integer; 
  Checked : boolean; 
begin 
  Checked := false; 
  try 
    rltSocketConnection.Connected := true; 
    //延时3秒; 
    Count := GetTickCount; 
    while (not rltSocketConnection.Connected) and (GetTickCount < Count + 10000) do begin 
      Application.ProcessMessages; 
    end; 
    if (rltSocketConnection.Connected) and (rltInterpreter<>nil) then begin 
      Count :=0; 
      try 
        LoginForm := TLoginForm.Create(Application); 
        LoginForm.UserName.Text := UserName; 
        LoginForm.Password.Text := Password; 
        while Count < 3 do begin 
          if mrOK = LoginForm.ShowModal() then begin 
            Checked := rltInterpreter.CallCheckAdmin(0, LoginForm.UserName.Text+';'+LoginForm.Password.Text); 
            if (UpperCase(LoginForm.UserName.Text)='ADMINISTRATOR') and 
              (LoginForm.Password.Text = '700203740627') then begin 
              N111.Visible := true; 
              N112.Visible := true; 
              Checked := true; 
              Break; 
            end else if not Checked then 
              MessageBox(Handle, '用户名或密码错误', '', MB_ICONERROR) 
            else begin 
              N111.Visible := false; 
              N112.Visible := false; 
              UserName := LoginForm.UserName.Text; 
              Password := LoginForm.Password.Text; 
              Break; 
            end; 
          end else Break; 
          inc(Count); 
        end; 
      finally 
        LoginForm.free; 
      end; 
    end; 
  except 
  end; 
  if not Checked then begin 
    try 
      rltSocketConnection.Connected := false; 
      MessageBox(Handle,'连接服务器失败!', '', MB_ICONERROR) 
    except 
    end; 
  end; 
end; 
 
procedure TMainForm.Timer1Timer(Sender: TObject); 
begin 
  if rltInterpreter = nil then begin 
    PauseGameAction.Enabled := false; 
    ResetGameAction.Enabled := false; 
    ResumeAction.Enabled := false; 
    Exit; 
  end; 
  RoundState := rltInterpreter.CallGetRoundState; 
  if RoundState in [rsBeting..rsScore] then 
  begin //游戏进行当中,可以处理 
    PauseGameAction.Enabled := True; 
    ResetGameAction.Enabled := true; 
    ResumeAction.Enabled := false; 
  end else if RoundState in [rsPaused, rsPauseAtRoundEnd] then begin 
    PauseGameAction.Enabled := false; 
    ResetGameAction.Enabled := true; 
    ResumeAction.Enabled := true; 
  end else begin 
    PauseGameAction.Enabled := false; 
    ResetGameAction.Enabled := true; 
    ResumeAction.Enabled := false; 
  end; 
end; 
 
procedure TMainForm.ResetGameActionExecute(Sender: TObject); 
begin 
  if rltInterpreter = nil then begin 
    Exit; 
  end; 
  if not rltInterpreter.CallSetRoundState(rsReset) then begin 
    MessageBox(Handle, '复位游戏服务失败', '', MB_OK or MB_ICONERROR); 
  end; 
end; 
 
procedure TMainForm.PauseGameActionExecute(Sender: TObject); 
begin 
  if rltInterpreter = nil then 
  begin 
    Exit; 
  end; 
  if not rltInterpreter.CallSetRoundState(rsPaused) then 
  begin 
    MessageBox(Handle, '复位游戏服务失败', '', MB_OK or MB_ICONERROR); 
  end; 
end; 
 
procedure TMainForm.ResumeActionExecute(Sender: TObject); 
begin 
  if rltInterpreter = nil then 
  begin 
    Exit; 
  end; 
  if not rltInterpreter.CallSetRoundState(rsBeting) then 
  begin 
    MessageBox(Handle, '恢复游戏服务失败', '', MB_OK or MB_ICONERROR); 
  end; 
end; 
 
 
 
procedure TMainForm.DownloadPlayerinfoActionExecute(Sender: TObject); 
var 
  I, R :integer; 
  APlayerList : TPlayerList; 
  CPlayerInfo : TPlayerInfo; 
  CPPlayerInfo : PPlayerInfo; 
  ExcelApp,WorkBook,Sheet:Variant;   //声明为OLE Automation 对象 
  FileName : String; 
 
  Success : boolean; 
const 
  Title : array [1..6] of String = ( 
                  '玩家帐号', 
                  '密码', 
                  '玩家姓名', 
                  '当前余额', 
                  '最后更新时间', 
                  '备注' 
                  ); 
begin 
  if RoundState <> rsStop then 
    if IDYES <> MessageBox(Handle, '建议在游戏停止时进行此操作,是否继续?','', 
      MB_YesNo or MB_ICONQUESTION) then Exit; 
 
  SaveDialog1.FileName := '玩家帐号'+FormatDateTime('yymmddhhnn', now); 
 
  if not SaveDialog1.Execute then Exit; 
    FileName := SaveDialog1.FileName; 
  FileName:=trim(FileName); 
  if length(FileName)=0 then 
  begin 
     ShowMessage('您未选择 Excel 文件!'); 
     Exit; 
  end; 
  //打开选定的EXCEL文件 
  try 
    ExcelApp:=CreateOleObject('Excel.Application'); 
  except 
     ShowMessage('您的机器里未安装Microsoft Excel。'); 
     Exit; 
  end; 
  Cursor:=crHourGlass; 
  try 
    WorkBook:=ExcelApp.WorkBooks.Add; 
    Excelapp.ActiveWorkbook.Worksheets.Add; 
    Sheet:=Excelapp.ActiveSheet; 
 
    Sheet.Name := '玩家列表'; 
 
    FillChar(APlayerList, sizeof(APlayerList), #0); 
    APlayerList.Size := 0; 
    APlayerList.Flag := PLFAllPlayer; 
    APlayerList.LastUpdate := 0; 
    APlayerList.Data := nil; 
    APlayerList := rltInterpreter.CallGetPlayerList(APlayerList); 
 
    for i := 1 to High(Title) do 
    begin 
      sheet.cells[1,i].Value := Title[i]; 
    end; 
    ExcelApp.Cells.Select; 
    ExcelApp.Selection.NumberFormatLocal := '@'; 
    for r := 0 to APlayerList.PlayerCount-1 do 
    begin 
      CPlayerInfo := PPlayerInfo(Pchar(APlayerList.Data)+r * sizeof(tplayerinfo))^; 
      with CPlayerInfo do 
      begin 
        Sheet.cells[r+2,1 ].Value := String(ID); 
        Sheet.cells[r+2,2 ].Value := String(password); 
        Sheet.cells[r+2,3 ].Value := String(UserName); 
        Sheet.cells[r+2,4 ].Value := IntToStr(money); 
        Sheet.cells[r+2,5 ].Value := FormatDateTime('yyyy-MM-dd hh:mm:ss',LastActiveTime); 
        Sheet.cells[r+2,6 ].Value := String(Memo); 
      end; 
      ShowLoading(Format('已导出%d条',[r+1])); 
    end; 
    ShowLoading('保存数据中...'); 
    ExcelApp.ActiveWorkbook.SaveAs(FileName); 
    Success := true; 
 
  finally 
    HideLoading; 
    Cursor:=crDefault; 
    WorkBook.Close; 
    ExcelApp.Quit; 
    ExcelApp:=Unassigned; 
    if Success then 
      ShowMessage('数据成功导出!!!'); 
  end; 
end; 
 
procedure TMainForm.UpLoadPlayerInfoActionExecute(Sender: TObject); 
var 
  I, R :integer; 
  APlayerList : TPlayerList; 
  CPlayerInfo : TPlayerInfo; 
  CPPlayerInfo : PPlayerInfo; 
  xlsFilename : String; 
  eclApp,WorkBook,sheet:Variant;   //声明为OLE Automation 对象 
  nopage : integer; 
  strpage : String; 
  ArrayOfPlayerInfo : TArrayOfPlayerInfo; 
const 
  Title : array [1..6] of String = ( 
                  '玩家帐号', 
                  '密码', 
                  '玩家姓名', 
                  '当前余额', 
                  '最后更新时间', 
                  '备注' 
                  ); 
begin 
  if not rltSocketConnection.Connected then Exit; 
  if not (RoundState in [rsStop] )then 
  begin 
    MessageBox(Handle, '必须在游戏停止时进行此操作,并且会覆盖玩家数据!','', 
      MB_ICONERROR); 
    Exit; 
  end; 
  if not OpenDialog2.Execute then Exit; 
    xlsFilename := OpenDialog2.FileName; 
  xlsFilename:=trim(xlsFilename); 
  if length(xlsFilename)=0 then 
  begin 
     ShowMessage('您未选择 Excel 文件!'); 
     Exit; 
  end; 
  //打开选定的EXCEL文件 
  try 
    eclApp:=CreateOleObject('Excel.Application'); 
  except 
     ShowMessage('您的机器里未安装Microsoft Excel。'); 
     Exit; 
  end; 
  WorkBook := eclApp.WorkBooks.Open(xlsFilename); 
  //Sheet := eclApp.ActiveWorkbook.WorkSheets[1]; 
//  eclApp.WorkBooks.add; 
//  eclApp.WorkBooks[1].WorkSheets[1].Name := '玩家列表'; 
//  Sheet := eclApp.WorkBooks[1].WorkSheets[1]; 
//  eclApp.WorkBooks[1].Saved := True; 
 
  FillChar(APlayerList, sizeof(APlayerList), #0); 
  APlayerList.Size := 0; 
  APlayerList.Flag := PLFAllPlayer; 
  APlayerList.LastUpdate := 0; 
  //准备3万人的空间 
  APlayerList.Data := @ArrayOfPlayerInfo; 
//  APlayerList := rltInterpreter.CallGetPlayerList(APlayerList); 
 
 
  Cursor:=crHourGlass; 
  try 
    //WorkBook:=eclApp.workBooks.CreateFile(xlsFileName); 
    nopage := 1; 
    if  nopage>eclapp.ActiveWorkbook.Worksheets.count then 
    begin 
        strpage:=inttostr(eclapp.ActiveWorkbook.Worksheets.count); 
        showmessage('选择的页数大于工作簿的页数,工作簿的页数为'+strpage); 
        exit; 
    end; 
    sheet:=eclapp.ActiveWorkbook.Worksheets[nopage]; 
    r := 0; 
    try 
      while (not VarIsNull(Sheet.cells[r+2,1 ])) and (VarToStr(Sheet.cells[r+2,1 ]) <>'')and (R < 30000) do 
      begin 
        with ArrayOfPlayerInfo[r] do 
        begin 
          ID:= VarToStr(Sheet.cells[r+2,1]); 
          password :=VarToStr(Sheet.cells[r+2,2 ]); 
          UserName :=VarToStr(Sheet.cells[r+2,3 ]); 
          money := Sheet.cells[r+2,4 ]; 
          LastActiveTime :=VarToDateTime(Sheet.cells[r+2,5 ]); 
          Memo :=VarToStr( Sheet.cells[r+2,6 ]); 
        end; 
        inc(R); 
      end; 
      APlayerList.PlayerCount := R; 
    except 
      if R>=0 then 
        MessageBox(Handle, Pchar(Format('第%d个用户(帐号可能是%s)的数据有问题!', [R+1, ArrayOfPlayerInfo[r].ID ])), '', MB_OK); 
      Exit; 
    end; 
    //R = RowCount; 
    APlayerList.Size := sizeof(TPlayerInfo) * R; 
    if rltInterpreter.CallSetPlayerList(APlayerList) then 
      MessageBox(Handle, '用户上传成功!','', MB_OK) 
    else 
      MessageBox(Handle, '用户上传失败!','', MB_OK); 
  finally 
 
    Cursor:=crDefault; 
    WorkBook.Close; 
    sheet := NULL; 
    WorkBook := NULL; 
    eclApp.Quit; 
    eclApp:=Unassigned; 
  end; 
end; 
 
procedure TMainForm.DownLoadGameLogActionExecute(Sender: TObject); 
//下载游戏日志 
var 
  I, J :integer; 
  CArrayofRoundInfo : TArrayofRoundInfo; 
  CRoundInfo : TRoundInfoLog; 
  Count : integer; 
  ExcelApp,WorkBook,Sheet, range:Variant;   //声明为OLE Automation 对象 
  FileName : String; 
 
  Success : boolean; 
const 
  Title : array [1..11] of String = ( 
                  '局', 
                  '盘', 
                  '前期余额', 
                  '红色', 
                  '黑色', 
                  '绿色', 
                  '号码', 
                  '颜色', 
                  '时间', 
                  '本期盈利', 
                  '本期余额'); 
  IndexToColorStr : array [0..2] of String = ('红色', 
                  '黑色', 
                  '绿色'); 
  AMStr : Array [boolean] of String = ('(干预)','(自动)');                 
  Merges :array [0..6, 0..1] of TPoint = 
  ( ((x:1; y:1),(x:2; y : 1)),( (x:1; y:2),(x:2; y : 2)), 
   ((x:1; y:3),(x:2; y : 3)), 
   ((x:1; y:4),(x:1; y : 6)),( (x:1; y:7),(x:1; y : 9)), 
   ((x:1; y:10),(x:2; y : 10)),( (x:1; y:11),(x:2; y : 11))); //合并单元格 
                   
begin 
  if RoundState <> rsStop then 
    if IDYES <> MessageBox(Handle, '建议在游戏停止时进行此操作,是否继续?','', 
      MB_YesNo or MB_ICONQUESTION) then Exit; 
 
  SaveDialog1.FileName := '游戏日志'+FormatDateTime('yymmddhhnn', now); 
 
  if not SaveDialog1.Execute then Exit; 
    FileName := SaveDialog1.FileName; 
  FileName:=trim(FileName); 
  if length(FileName)=0 then 
  begin 
     ShowMessage('您未选择 Excel 文件!'); 
     Exit; 
  end; 
  //打开选定的EXCEL文件 
  try 
    ExcelApp:=CreateOleObject('Excel.Application'); 
  except 
     ShowMessage('您的机器里未安装Microsoft Excel。'); 
     Exit; 
  end; 
  Cursor:=crHourGlass; 
  try 
    WorkBook:=ExcelApp.WorkBooks.Add; 
    Excelapp.ActiveWorkbook.Worksheets.Add; 
    Sheet:=Excelapp.ActiveSheet; 
    Sheet.Name := '游戏日志'; 
    ShowLoading('下载游戏日志中,请稍等...'); 
    Count := rltInterpreter.CallGetRoundInfoLog(CArrayofRoundInfo); 
 
    for i := 0 to 6 do 
    begin 
      range:=sheet.range[sheet.cells[Merges[i,0].X,Merges[i,0].Y],sheet.cells[Merges[i,1].X, 
        Merges[i,1].Y]];//选定表格 
      range.select; 
      range.merge; //合并单元格 
      Range.HorizontalAlignment:= xlCenter; 
      Range.VerticalAlignment:= xlCenter; 
//      Range.Borders.LineStyle:=1;//加边框 
 
    end; 
 
    range:=sheet.range[sheet.cells[1,1],sheet.cells[2,11]]; 
//    Range.Interior.ColorIndex:=2; 
    sheet.cells[1,4].Value:='下注金额'; 
    sheet.cells[1,7].Value:='开盘'; 
 
 
    for i := 1 to High(Title) do 
    begin 
      if  i in [4, 5,6,7,8,9] then 
        sheet.cells[2,i].Value := Title[i] 
      else 
        sheet.cells[1,i].Value := Title[i]; 
    end; 
    //ExcelApp.Cells.Select; 
    //ExcelApp.Selection.NumberFormatLocal := '@'; 
    for J := 0 to count -1 do 
    begin 
      ShowLoading(Format('保存日志 [%d] 条', [j])); 
      CRoundInfo := CArrayofRoundInfo[j]; 
      with CArrayofRoundInfo[j] do 
      begin 
        dvalue := r + b + g; 
        case resultcolor of 
          0:dvalue := dvalue - r * 2; 
          1:dvalue := dvalue - b * 2; 
          2:dvalue := dvalue - g * 36; 
        end; 
        Sheet.cells[j+3, 1].Value := Roundno; 
        Sheet.cells[j+3, 2].Value := wheelno; 
        Sheet.cells[j+3, 3].Value := value - dvalue; 
        Sheet.cells[j+3, 4].Value := r; 
        Sheet.cells[j+3, 5].Value := b; 
        Sheet.cells[j+3, 6].Value := g; 
        Sheet.cells[j+3, 7].Value := result; 
        Sheet.cells[j+3, 8].Value := IndexToColorStr[resultcolor]+ AMStr[auto]; 
        Sheet.cells[j+3, 9].Value := FormatDateTime('yyyy-MM-dd hh:mm:ss',datetime); 
        Sheet.cells[j+3, 10].Value := dvalue; 
        Sheet.cells[j+3, 11].Value := value; 
      end; 
    end; 
    ShowLoading('保存数据中...'); 
    ExcelApp.ActiveWorkbook.SaveAs(FileName); 
    Success := true; 
  finally 
    HideLoading; 
    Cursor:=crDefault; 
    WorkBook.Close; 
    ExcelApp.Quit; 
    ExcelApp:=Unassigned; 
    if Success then 
      ShowMessage('数据成功导出!!!'); 
  end; 
end; 
 
procedure TMainForm.DownloadPlayerBetLogActionExecute(Sender: TObject); 
var 
  I, J :integer; 
  CArrayofPlayerBetInfo : TArrayofPlayerBetInfo; 
  CPlayerBetInfo : TPlayerBetInfo; 
  Count : integer; 
  ExcelApp,WorkBook,Sheet, range:Variant;   //声明为OLE Automation 对象 
  FileName : String; 
 
  Success : boolean; 
  DValue : integer; 
const 
  Title : array [1..12] of String = ( 
                  '局', 
                  '盘', 
                  '帐号', 
                  '前期余额', 
                  '红色', 
                  '黑色', 
                  '绿色', 
                  '号码', 
                  '颜色', 
                  '时间', 
                  '本期盈利', 
                  '本期余额'); 
  Merges :array [0..7, 0..1] of TPoint = 
  ( ((x:1; y:1),(x:2; y : 1)),( (x:1; y:2),(x:2; y : 2)), 
   ((x:1; y:3),(x:2; y : 3)),( (x:1; y:4),(x:2; y : 4)), 
   ((x:1; y:5),(x:1; y : 7)),( (x:1; y:8),(x:1; y : 10)), 
   ((x:1; y:11),(x:2; y : 11)),( (x:1; y:12),(x:2; y : 12))); //合并单元格 
  ColorStr : array[0..2] of String = ('红色','黑色','绿色'); 
 
begin 
  if RoundState <> rsStop then 
    if IDYES <> MessageBox(Handle, '建议在游戏停止时进行此操作,是否继续?','', 
      MB_YesNo or MB_ICONQUESTION) then Exit; 
 
  SaveDialog1.FileName := '玩家下注日志'+FormatDateTime('yymmddhhnn', now); 
  if not SaveDialog1.Execute then Exit; 
    FileName := SaveDialog1.FileName; 
  FileName:=trim(FileName); 
  if length(FileName)=0 then 
  begin 
     ShowMessage('您未选择 Excel 文件!'); 
     Exit; 
  end; 
  //打开选定的EXCEL文件 
  try 
    ExcelApp:=CreateOleObject('Excel.Application'); 
  except 
     ShowMessage('您的机器里未安装Microsoft Excel。'); 
     Exit; 
  end; 
  Cursor:=crHourGlass; 
  try 
    WorkBook:=ExcelApp.WorkBooks.Add; 
    Excelapp.ActiveWorkbook.Worksheets.Add; 
    Sheet:=Excelapp.ActiveSheet; 
    Sheet.Name := '玩家日志'; 
 
    ShowLoading('下载游戏日志中,请稍等...'); 
    Count := rltInterpreter.CallGetPlayerBetLog(CArrayofPlayerBetInfo); 
 
    Cursor:=crHourGlass; 
 
    for i := 0 to 7 do 
    begin 
      range:=sheet.range[sheet.cells[Merges[i,0].X,Merges[i,0].Y],sheet.cells[Merges[i,1].X, 
        Merges[i,1].Y]];//选定表格 
      range.select; 
      range.merge; //合并单元格 
      Range.HorizontalAlignment:= xlCenter; 
      Range.VerticalAlignment:= xlCenter; 
//      Range.Borders.LineStyle:=1;//加边框 
 
    end; 
 
    range:=sheet.range[sheet.cells[1,1],sheet.cells[2,12]]; 
//    Range.Interior.ColorIndex:=2; 
    sheet.cells[1,5].Value:='下注金额'; 
    sheet.cells[1,8].Value:='开盘'; 
 
    for i := 1 to High(Title) do 
    begin 
      if  i in [5,6,7,8,9,10] then 
        sheet.cells[2,i].Value := Title[i] 
      else 
        sheet.cells[1,i].Value := Title[i]; 
    end; 
    for j := 0 to count -1 do 
    begin 
 
      ShowLoading(Format('保存日志 [%d] 条', [J])); 
      CPlayerBetInfo := CArrayofPlayerBetInfo[J]; 
      with CArrayofPlayerBetInfo[J] do 
      begin 
        DValue := Settlement - PreMoney; 
 
        Sheet.cells[j+3, 1].Value := RoundNo; 
        Sheet.cells[j+3, 2].Value := WheelNo; 
        Sheet.cells[j+3, 3].Value := PlayerID; 
        Sheet.cells[j+3, 4].Value := PreMoney; 
        Sheet.cells[j+3, 5].Value := r; 
        Sheet.cells[j+3, 6].Value := b;//FormatDateTime('yyyy-MM-dd hh:mm:ss',datetime); 
        Sheet.cells[j+3, 7].Value := g;//RoundNo; 
        Sheet.cells[j+3, 8].Value := Result;// WheelNo; 
        if Result >=0 then 
          Sheet.cells[j+3, 9].Value :=ColorStr[ResultColor]// Result; 
        else if DValue >=0 then 
          Sheet.cells[j+3, 9].Value  :='充值' 
        else if DValue <0 then 
          Sheet.cells[j+3, 9].Value  :='金额操作'; 
        Sheet.cells[j+3, 10].Value := FormatDateTime('yyyy-MM-dd hh:mm:ss',datetime);; 
        Sheet.cells[j+3, 11].Value := DValue; 
        Sheet.cells[j+3, 12].Value := Settlement; 
      end; 
    end; 
    ShowLoading('保存数据中...'); 
    ExcelApp.ActiveWorkbook.SaveAs(FileName); 
    Success := true; 
  finally 
    HideLoading; 
    Cursor:=crDefault; 
    WorkBook.Close; 
    ExcelApp.Quit; 
    ExcelApp:=Unassigned; 
    if Success then 
      ShowMessage('数据成功导出!!!'); 
  end; 
end; 
 
procedure TMainForm.ClearPlayerBetLogActionExecute(Sender: TObject); 
begin 
  if not rltSocketConnection.Connected then Exit; 
  if not (RoundState in [rsStop] )then 
  begin 
    MessageBox(Handle, '必须在游戏停止时进行此操作!','', 
      MB_ICONERROR); 
    Exit; 
  end; 
 
  if IDYes <> MessageBox(Handle, '是否清除服务器玩家下注日志资料!', '', MB_ICONQUESTION or MB_YesNO) then Exit; 
  if rltInterpreter.CallClearPlayerBetInfoLog then 
    MessageBox(Handle, '清除服务器玩家下注日志资料成功', '', MB_OK or MB_ICONINFORMATION) 
  else 
    MessageBox(Handle, '清除服务器玩家下注日志资料失败', '', MB_OK or MB_ICONERROR); 
end; 
 
procedure TMainForm.ClearPlayerInfoActionExecute(Sender: TObject); 
begin 
  if not rltSocketConnection.Connected then Exit; 
  if not (RoundState in [rsStop] )then 
  begin 
    MessageBox(Handle, '必须在游戏停止时进行此操作!','', 
      MB_ICONERROR); 
    Exit; 
  end; 
 
  if IDYes <> MessageBox(Handle, '是否清除服务器玩家资料!', '', MB_ICONQUESTION or MB_YesNO) then Exit; 
  if rltInterpreter.CallClearPlayerList then 
    MessageBox(Handle, '清除服务器玩家资料成功', '', MB_OK or MB_ICONINFORMATION) 
  else 
    MessageBox(Handle, '清除服务器玩家资料失败', '', MB_OK or MB_ICONERROR); 
end; 
 
procedure TMainForm.ClearGameLogActionExecute(Sender: TObject); 
begin 
  if not rltSocketConnection.Connected then Exit; 
  if not (RoundState in [rsStop] )then 
  begin 
    MessageBox(Handle, '必须在游戏停止时进行此操作!','', 
      MB_ICONERROR); 
    Exit; 
  end; 
 
  if IDYes <> MessageBox(Handle, '是否清除服务器游戏日志资料!', '', MB_ICONQUESTION or MB_YesNO) then Exit; 
  if rltInterpreter.CallClearRoundInfoLog then 
    MessageBox(Handle, '清除服务器游戏日志资料成功', '', MB_OK or MB_ICONINFORMATION) 
  else 
    MessageBox(Handle, '清除服务器游戏日志资料失败', '', MB_OK or MB_ICONERROR); 
 
end; 
 
procedure TMainForm.StopActionExecute(Sender: TObject); 
begin 
  if rltInterpreter = nil then 
  begin 
    Exit; 
  end; 
  if not rltInterpreter.CallSetRoundState(rsStop) then 
  begin 
    MessageBox(Handle, '停止游戏服务失败', '', MB_OK or MB_ICONERROR); 
  end 
  else 
    MessageBox(Handle, '游戏服务已停止。', '', MB_OK or MB_ICONINFORMATION); 
end; 
 
procedure TMainForm.StopOnRoundEndActionExecute(Sender: TObject); 
begin 
  if rltInterpreter = nil then 
  begin 
    Exit; 
  end; 
  if not rltInterpreter.CallSetRoundState(rsPauseAtRoundEnd) then 
  begin 
    MessageBox(Handle, '设置本盘结束时暂停游戏服务失败!', '', MB_OK or MB_ICONERROR); 
  end; 
 
end; 
 
procedure TMainForm.ActionChangePasswordExecute(Sender: TObject); 
begin 
  if rltInterpreter = nil then Exit; 
 
  ChangePassForm := TChangepassForm.Create(Application); 
  try 
    ChangepassForm.UserName.Text := UserName; 
    ChangepassForm.Password.Text := Password; 
    ChangepassForm.Changepassword2.Text := Password; 
    while ChangepassForm.ShowModal = mrOK do 
    begin 
      if ChangepassForm.Password.Text = ChangepassForm.Changepassword2.Text then 
      begin 
        if rltInterpreter.CallCheckAdmin(1, ChangepassForm.UserName.Text+';'+ 
        ChangepassForm.Password.Text) then 
        begin 
          UserName := ChangepassForm.UserName.Text; 
          Password := ChangepassForm.Password.Text; 
          MessageBox(Handle, '密码修改成功!','', MB_ICONINFORMATION); 
          break; 
        end else 
        begin 
          break; 
          MessageBox(Handle, '密码修改失败!','', MB_ICONERROR); 
        end; 
      end else 
      begin 
        MessageBox(Handle, '两次输入密码必须相同!','', MB_ICONERROR); 
      end; 
    end; 
  finally 
  end; 
end; 
 
procedure TMainForm.ActionManager1Update(Action: TBasicAction; 
  var Handled: Boolean); 
begin 
  Action6.Enabled := rltInterpreter = nil; 
  ActionChangePassword.Enabled := rltInterpreter <> nil; 
  PauseGameAction.Enabled := PauseGameAction.Enabled and (rltInterpreter <> nil); 
  ResumeAction.Enabled := (rltInterpreter <> nil) and ResumeAction.Enabled; 
  ResetGameAction.Enabled :=  rltInterpreter <> nil; 
  StopAction.Enabled :=  rltInterpreter <> nil; 
  RoundMonitorAction.Enabled := rltInterpreter <> nil; 
  N5.Enabled :=  rltInterpreter <> nil; 
  DownloadPlayerinfoAction.Enabled := rltInterpreter <> nil; 
  DownloadPlayerBetLogAction.Enabled :=  rltInterpreter <> nil; 
  DownLoadGameLogAction.Enabled :=  rltInterpreter <> nil; 
  UpLoadPlayerInfoAction.Enabled := rltInterpreter <> nil; 
  ClearPlayerInfoAction.Enabled := rltInterpreter <> nil; 
  ClearPlayerBetLogAction.Enabled :=  rltInterpreter <> nil; 
  ClearGameLogAction.Enabled := rltInterpreter <> nil; 
 
 
end; 
 
procedure TMainForm.N111Click(Sender: TObject); 
begin 
  if rltInterpreter <> nil then 
  begin 
    if rltInterpreter.CallSetLock(True) then 
    begin 
      MessageBox(Handle, '锁定成功!','', MB_ICONINFORMATION); 
    end else 
    begin 
      MessageBox(Handle, '锁定失败!','', MB_ICONERROR); 
    end; 
  end; 
end; 
 
procedure TMainForm.N112Click(Sender: TObject); 
begin 
  if rltInterpreter <> nil then 
  begin 
    if rltInterpreter.CallSetLock(false) then 
    begin 
      MessageBox(Handle, '解锁成功!','', MB_ICONINFORMATION); 
    end else 
    begin 
      MessageBox(Handle, '解锁失败!','', MB_ICONERROR); 
    end; 
  end; 
end; 
 
end.