C++Builder五子棋程序

目的:想要做到点击标签事件就能使标签后面的图片加载黑白棋子。
问题:在已知Top和Left的情况下不知道如何将标签和其对应的图片联系起来。
代码如下:

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "棋盘界面.h"
#include "启动界面.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"


TForm4 *Form4;
TShape *Ml[19];//竖线
TShape *Nl[19];//横线
TLabel *Jl[20][20];//棋子Label
TImage *Pl[20][20];//棋子图片
int p=1;//执棋者的身份,黑1,白2
int i;
int j;
//int record=0;//对棋子Name的编号
//---------------------------------------------------------------------------
__fastcall TForm4::TForm4(TComponent* Owner)
    : TForm(Owner)
{

}
//---------------------------------------------------------------------------
void __fastcall TForm4::Button1Click(TObject *Sender)
{
    for(int i=0;i<19;i++)
    {
      delete Ml[i];
      delete Nl[i];
    }//收回棋盘划线
    for(int i=0;i<20;i++)
    {
    for(int j=0;j<20;j++)
    {
     delete Jl[i][j];
     delete Pl[20][20];
     }

     }//收回棋子



    Form1->Show();
    Form4->Hide();

}
//---------------------------------------------------------------------------



void __fastcall TForm4::FormCreate(TObject *Sender)
{
  for(int i=0;i<19;i++)//竖线
  {
      Ml[i]=new TShape(this->Shape1);
      Ml[i]->Left=32+32*(i+1); //竖线的横坐标
      Ml[i]->Top=24; //竖线的纵坐标
      Ml[i]->Width=1;
      Ml[i]->Height=608;
      Ml[i]->Parent=Panel1;
      Ml[i]->Visible=true;

  }
    for(int i=0;i<19;i++)//横线
  {
      Nl[i]=new TShape(this->Shape3);
      Nl[i]->Left=32;
      Nl[i]->Top=24+32*(i+1);
      Nl[i]->Width=608;
      Nl[i]->Height=1;
      Nl[i]->Parent=Panel1;
      Nl[i]->Visible=true;

  }

  for(int i=0;i<20;i++)//管理棋子行的循环
  {
  for(int j=0;j<20;j++)//管理棋子列的循环
  {

      Pl[i][j]=new TImage(this);
      Pl[i][j]->Parent=Panel1;
      Pl[i][j]->AutoSize=false;
      Pl[i][j]->Visible=true;
      Pl[i][j]->Transparent=false;
      Pl[i][j]->Height=22;
      Pl[i][j]->Width=22;
      Pl[i][j]->Left=21+32*j;//标签的左坐标
      Pl[i][j]->Top=13+32*i;//标签的纵坐标
      Pl[i][j]->Tag=21+32*j;//记录标签的左坐标
      Pl[i][j]->Hint=IntToStr(13+32*i);//记录标签的纵坐标
      //Pl[i][j]->Name="Image'+IntToStr(record+1)'";



  }

  }
  for(int i=0;i<20;i++)//管理行标签的循环
  {
  for(int j=0;j<20;j++)//管理列标签的循环
  {
      Jl[i][j]=new TLabel(this->Label2);
      Jl[i][j]->Parent=Panel1;
      Jl[i][j]->AutoSize=false;
      Jl[i][j]->Visible=true;
      Jl[i][j]->Transparent=false;
      Jl[i][j]->Height=22;
      Jl[i][j]->Width=22;
      Jl[i][j]->Caption="";
      Jl[i][j]->Color=clMaroon;
      Jl[i][j]->Cursor=crHandPoint;
      Jl[i][j]->Left=21+32*j;//标签的左坐标
      Jl[i][j]->Top=13+32*i;//标签的纵坐标
      Jl[i][j]->Tag=21+32*j;//记录标签的左坐标
      Jl[i][j]->Hint=IntToStr(13+32*i);//记录标签的纵坐标
      Jl[i][j]->OnClick=MyEvent;//创建一个关于点击动态标签后的事件

  }

  }












}
void __fastcall TForm4::MyEvent(TObject *Sender)//解决点击标签然后出现棋子图片的事件
{

}

//---------------------------------------------------------------------------











void __fastcall TForm4::FormClose(TObject *Sender, TCloseAction &Action)
{
  Form1->Close();
}
//---------------------------------------------------------------------------

void __fastcall TForm4::FormResize(TObject *Sender)
{

}
//---------------------------------------------------------------------------

目前的效果图是这样的:

img

可以利用标签的Tag属性来记录该标签对应的图片的位置。在创建图片时,可以将其Tag属性设置为与标签相同,这样就可以通过标签的Tag属性来得到对应的图片控件。在点击标签时,可以根据标签的坐标(Top和Left)和其Tag属性来定位相应的图片控件,并将其加载上黑白棋子的图片即可。

具体实现代码可以参考下面的示例:

void __fastcall TForm4::MyEvent(TObject *Sender)//解决点击标签然后出现棋子图片的事件
{
    TLabel *label = dynamic_cast<TLabel*>(Sender); // 获取被点击的标签控件

    if (label != NULL)
    {
        int left = label->Tag; // 获取标签对应的图片控件的Left坐标
        int top = StrToInt(label->Hint); // 获取标签对应的图片控件的Top坐标

        TImage *image = dynamic_cast<TImage*>(Panel1->ControlAtPos(TPoint(left, top), true)); // 查找标签对应的图片控件
        if (image != NULL)
        {
            // 根据棋手的不同,设置棋子图片并显示
            if (p == 1)
                image->Picture->LoadFromFile("black.bmp");
            else
                image->Picture->LoadFromFile("white.bmp");

            image->Visible = true;
        }
    }
}