⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xqwizard.pas

📁 象棋演播室1.6的dephi源码 作者 董世伟
💻 PAS
📖 第 1 页 / 共 2 页
字号:
///////////////////////////////////////////////////////////////////////////////
//
// XQStduio Source Code (http://www.qipaile.net/xqstudio)
//
// Copyright (c) 1998-2008, DONG Shiwei (董世伟 or 过河象)
// All rights reserved.
// 
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions
// are met:
// 
//    1) Redistributions of source code must retain the above copyright
//       notice, this list of conditions and the following disclaimer.
//    2) Redistributions in binary form must reproduce the above copyright
//       notice, this list of conditions and the following disclaimer
//       in the documentation and/or other materials provided with the
//       distribution.
//    3) Neither the name of the XQStudio nor the names of its contributors
//       may be used to endorse or promote products derived from this
//       software without specific prior written permission.
// 
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
// TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
///////////////////////////////////////////////////////////////////////////////
//
// Note: Some characters of this file are Simplified Chinese characters 
//       encoded with GB2312/GB18030 standard
//

unit XQWizard;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ExtCtrls, ComCtrls, Clipbrd,
  dDelphiS, XQDataT, XQFileRW, XQSystem, Menus;

type
  TfrmXQWizard = class(TForm)
    pnlTop: TPanel;
    pnlBottom: TPanel;
    btnPrior: TButton;
    btnNext: TButton;
    btnCancel: TButton;
    pgcSetup: TPageControl;
    tstStep1: TTabSheet;
    tstStep2: TTabSheet;
    pnlXQBoard: TPanel;
    imgXQBoard: TImage;
    imgQZ21: TImage;
    imgQZ22: TImage;
    imgQZ20: TImage;
    imgQZ23: TImage;
    imgQZ19: TImage;
    imgQZ24: TImage;
    imgQZ18: TImage;
    imgQZ25: TImage;
    imgQZ17: TImage;
    imgQZ27: TImage;
    imgQZ26: TImage;
    imgQZ32: TImage;
    imgQZ30: TImage;
    imgQZ29: TImage;
    imgQZ31: TImage;
    imgQZ28: TImage;
    imgQZ05: TImage;
    imgQZ06: TImage;
    imgQZ04: TImage;
    imgQZ07: TImage;
    imgQZ03: TImage;
    imgQZ08: TImage;
    imgQZ02: TImage;
    imgQZ09: TImage;
    imgQZ01: TImage;
    imgQZ11: TImage;
    imgQZ10: TImage;
    imgQZ12: TImage;
    imgQZ14: TImage;
    imgQZ13: TImage;
    imgQZ16: TImage;
    imgQZ15: TImage;
    imgQZMove: TImage;
    imgClient: TImage;
    pnlStep1: TPanel;
    pnlStep12: TPanel;
    Label6: TLabel;
    edtTitle: TEdit;
    pnlStep13: TPanel;
    pnlStep11: TPanel;
    pnlStep14: TPanel;
    RadioGroup1: TRadioGroup;
    rbtPlayType0: TRadioButton;
    rbtPlayType3: TRadioButton;
    GroupBox1: TGroupBox;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    edtMatchName: TEdit;
    edtMatchTime: TEdit;
    edtMatchAddr: TEdit;
    edtRedPlayer: TEdit;
    edtBlkPlayer: TEdit;
    Label7: TLabel;
    edtRMKWriter: TEdit;
    Label8: TLabel;
    edtAuthor: TEdit;
    btnFinish: TButton;
    pnlStep2RightMargin: TPanel;
    pnlStep2Right: TPanel;
    pnlStep21: TPanel;
    pnlStep22: TPanel;
    pnlStep23: TPanel;
    RadioGroup2: TRadioGroup;
    RadioGroup3: TRadioGroup;
    rbtWhoPlay0: TRadioButton;
    rbtWhoPlay1: TRadioButton;
    rbtRst1: TRadioButton;
    rbtRst2: TRadioButton;
    rbtRst3: TRadioButton;
    rbtRst0: TRadioButton;
    Label9: TLabel;
    Label10: TLabel;
    lblResult: TLabel;
    rbtResult0: TRadioButton;
    rbtResult1: TRadioButton;
    rbtResult2: TRadioButton;
    rbtResult3: TRadioButton;
    rbtPlayType1: TRadioButton;
    rbtPlayType2: TRadioButton;
    ppmBoard: TPopupMenu;
    ppmCopy: TMenuItem;
    ppmSaveAsBmp: TMenuItem;
    dlgSaveDialog: TSaveDialog;
    ppmLine1: TMenuItem;
    ppmPastePosition: TMenuItem;
    Label11: TLabel;
    edtTimeRule: TEdit;
    Label12: TLabel;
    edtRedTime: TEdit;
    Label13: TLabel;
    edtBlkTime: TEdit;
    N1: TMenuItem;
    ppm32Qizi: TMenuItem;
    ppm1Ma: TMenuItem;
    ppm2M: TMenuItem;
    imgQiziRed: TImage;
    procedure imgXQBoardDragOver(Sender, Source: TObject; X, Y: Integer;
      State: TDragState; var Accept: Boolean);
    procedure XQZStartDrag(Sender: TObject;
      var DragObject: TDragObject);
    procedure XQZEndDrag(Sender, Target: TObject; X, Y: Integer);
    procedure FormCreate(Sender: TObject);
    procedure pnlXQBoardResize(Sender: TObject);
    procedure btnNextClick(Sender: TObject);
    procedure btnPriorClick(Sender: TObject);
    procedure rbtPlayTypeClick(Sender: TObject);
    procedure pnlBottomResize(Sender: TObject);
    procedure btnFinishClick(Sender: TObject);
    procedure ppmCopyClick(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure ppmSaveAsBmpClick(Sender: TObject);

    procedure dSaveBoardToFile(sFilename: String);
    procedure dRefreshQiziPosition;
    procedure ppmPastePositionClick(Sender: TObject);
    procedure ppmBoardPopup(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure ppm32QiziClick(Sender: TObject);
    procedure ppm1MaClick(Sender: TObject);
    procedure ppm2MClick(Sender: TObject);
  private
    StartMoveLeft, StartMoveTop : dTInt32;
    QiziXYRect                  : array [0..8, 0..9] of TRect;
    pntQizi                     : array [1..32] of TPoint;
    FIsEditPosition: Boolean;      // 棋盘外的位置
  public
    imgQizi                     : array [1..32] of TImage;
    QiziXY                      : dTXQZXY;
    XQFHead                     : dTXQFHead;
    IsPasteQituOk               : Boolean;
    imgQituImage                : TImage;
    procedure QiziXYtoImage(qzXY: dTXQZXY; img: TImage);
    function  isStringListToQiziXYOK(sl:TStringList;
               var qzXY:dTXQZXY): dTBoolean;
    procedure dEditPosition;

    { Public declarations }
  end;

var
  frmXQWizard: TfrmXQWizard;

implementation

uses XQMain;

{$R *.DFM}

procedure TfrmXQWizard.imgXQBoardDragOver(Sender, Source: TObject; X,
  Y: Integer; State: TDragState; var Accept: Boolean);
var
  iLeft, iTop: dTInt32;
begin
  with Sender as TImage do
  begin
    iLeft := Left;
    iTop  := Top;
  end;
  imgQZMove.Left := X + iLeft - 9;
  imgQZMove.Top  := Y + iTop  - 9;
end;

procedure TfrmXQWizard.XQZStartDrag(Sender: TObject;
  var DragObject: TDragObject);
begin
  with Sender as TImage do
  begin
    StartMoveLeft     := Left;
    StartMoveTop      := Top;
    Visible           := False;
    imgQZMove.Picture := Picture;
    imgQZMove.Left    := Left;
    imgQZMove.Top     := Top;
    imgQZMove.Visible := True;
  end;
end;

procedure TfrmXQWizard.XQZEndDrag(Sender, Target: TObject; X,
  Y: Integer);
var
  Cx, Cy: dTInt32;
function isPointInQiziXY(var Px, Py: dTInt32): dTBoolean;
var
  i, j: dTInt32;
begin
  for i:=0 to 8 do for j:=0 to 9 do
  begin
    with QiziXYRect[i,j] do
    begin
      if ((Px>Left) and (Px<Right) and (Py>Top) and (Py<Bottom)) then
      begin
        isPointInQiziXY := True;
        Px := i;  Py := j;
        Exit;
      end;
    end;
  end;
  isPointInQiziXY := False;
end;

function iQiziIdxAtXY(XYx, XYy: dTInt32): dTInt32;
var
  i: dTInt32;
begin
  for i:=1 to 32 do if (QiziXY[i]=(XYx*10+XYy)) then
  begin
    iQiziIdxAtXY := i;
    Exit;
  end;
  iQiziIdxAtXY := 0;
end;
begin
  imgQZMove.Visible := False;
  with Sender as TImage do
  begin
    Visible := True;
    Cx   := imgQZMove.Left + (Width  div 2);
    Cy   := imgQZMove.Top  + (Height div 2);
    if not isPointInQiziXY(Cx, Cy) then
    begin
      if ((Tag=05) or (Tag=21)) then Exit;      // 帅、将不可以移出宫外 
      if (Cx > (imgXQBoard.Left + imgXQBoard.Width - 50)) then
      begin
        QiziXY[Tag] := $FF;
        Left := pntQizi[tag].X;
        Top  := pntQizi[tag].Y;
      end;
      Exit;
    end;
    if (iQiziIdxAtXY(Cx, Cy)>0) then Exit;
    if not isQiziCanAtXY(tag, Cx, Cy) then Exit;
    QiziXY[Tag] := Cx*10 + Cy;
    Left := QiziXYRect[Cx, Cy].Left;
    Top  := QiziXYRect[Cx, Cy].Top;
  end;;
end;


var
  dCQiziLT: array [1..64] of dTInt32 =
           (215,156, 239,156, 263,156, 287,180, 215,228, 287,156, 263,180,
            239,180, 215,180, 215,204, 239,204, 239,228, 263,228, 287,228,
            263,204, 287,204, 216,122, 240, 98, 264, 98, 288, 98, 216, 50,
            288,122, 264,122, 240,122, 216, 98, 240, 74, 216, 74, 263, 50,
            239, 50, 288, 50, 263, 74, 288, 74);
procedure TfrmXQWizard.FormCreate(Sender: TObject);
var
  i, j: dTInt32;
begin
  FIsEditPosition := False;
  
  // 给32个棋子图片赋值
  imgQizi[01]:=imgQZ01; imgQizi[17]:=imgQZ17;
  imgQizi[02]:=imgQZ02; imgQizi[18]:=imgQZ18;
  imgQizi[03]:=imgQZ03; imgQizi[19]:=imgQZ19;
  imgQizi[04]:=imgQZ04; imgQizi[20]:=imgQZ20;
  imgQizi[05]:=imgQZ05; imgQizi[21]:=imgQZ21;
  imgQizi[06]:=imgQZ06; imgQizi[22]:=imgQZ22;
  imgQizi[07]:=imgQZ07; imgQizi[23]:=imgQZ23;
  imgQizi[08]:=imgQZ08; imgQizi[24]:=imgQZ24;
  imgQizi[09]:=imgQZ09; imgQizi[25]:=imgQZ25;
  imgQizi[10]:=imgQZ10; imgQizi[26]:=imgQZ26;
  imgQizi[11]:=imgQZ11; imgQizi[27]:=imgQZ27;
  imgQizi[12]:=imgQZ12; imgQizi[28]:=imgQZ28;
  imgQizi[13]:=imgQZ13; imgQizi[29]:=imgQZ29;
  imgQizi[14]:=imgQZ14; imgQizi[30]:=imgQZ30;
  imgQizi[15]:=imgQZ15; imgQizi[31]:=imgQZ31;
  imgQizi[16]:=imgQZ16; imgQizi[32]:=imgQZ32;

  // 设置棋盘上的兵站
  for i:=0 to 8 do for j:=0 to 9 do
  begin
    with QiziXYRect[i, j] do
    begin
      Left   := imgXQBoard.Left +   9 + i*22;
      Top    := imgXQBoard.Top  + 236 - j*22;
      Right  := Left + 18;
      Bottom := Top  + 18;
    end;
  end;

  // 棋子移动的'替身'
  imgQZMove.Width:=18; imgQZMove.Height:=18; imgQZMove.Visible:=False;

  // 设置盘外棋子的静态位置
  for i:=1 to 32 do
  begin
    imgQizi[i].Width  := 18;
    imgQizi[i].Height := 18;
    imgQizi[i].Left   := dCQiziLT[(i-1)*2+1];
    imgQizi[i].Top    := dCQiziLT[(i-1)*2+2];
    pntQizi[i].X      := imgQizi[i].Left;
    pntQizi[i].Y      := imgQizi[i].Top;
  end;

  // 全部的棋子不在盘上
  for i:=1 to 32 do QiziXY[i] := $FF;

  // 将'红帅'放在盘上
  QiziXY[05]       :=40;
  imgQizi[05].Left := QiziXYRect[4,0].Left;
  imgQizi[05].Top  := QiziXYRect[4,0].Top;

  // 将'黑将'放在盘上
  QiziXY[21]       :=49;
  imgQizi[21].Left := QiziXYRect[4,9].Left;
  imgQizi[21].Top  := QiziXYRect[4,9].Top;
end;

procedure TfrmXQWizard.pnlXQBoardResize(Sender: TObject);
begin
  with Sender as TPanel do Width:=321;
end;

procedure TfrmXQWizard.btnNextClick(Sender: TObject);
begin
  tstStep1.TabVisible := False;
  tstStep2.TabVisible := True;
  btnPrior.Visible    := True;
  btnNext.Visible     := False;
  btnFinish.Enabled   := True;
end;

procedure TfrmXQWizard.btnPriorClick(Sender: TObject);
begin
  tstStep1.TabVisible := True;
  tstStep2.TabVisible := False;
  btnPrior.Visible    := False;
  btnNext.Visible     := True;
  btnFinish.Enabled   := False;
end;

procedure TfrmXQWizard.rbtPlayTypeClick(Sender: TObject);
//var
//  isResultVisible: dTBoolean;
begin
  tstStep2.TabVisible := False;
  btnPrior.Visible    := False;
  btnNext.Visible     := rbtPlayType2.Checked or rbtPlayType3.Checked;
  btnFinish.Enabled   := rbtPlayType0.Checked or rbtPlayType1.Checked;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -