我正在努力扩展
the code from this
从使用一个三角到使用多个可以在运行时添加的矩形。在该示例中,单击并拖动的代码仅适用于这一个三角形
Rectangle1
.我需要让它更通用,这样它就可以在我添加到表单中的任何重角上工作(矩形在设计时不会出现)。我发现
this code to create a custom class
创建新的矩形效果很好。我可以指定在单击时运行的方法,但我认为这是一条错误的路径,因为它与
TForm1
...我需要让代码工作的许多数据点都来自
TForm1
(职位等)。
简而言之,我希望能够在运行时添加树角,并在正常事件(当单击矩形、鼠标等)上为该特定矩形运行代码。
不知道从哪里开始。。。但首先我想我需要知道如何制作一系列可以访问的控件,比如:
rectangles[i]->Position->X = ...
然后,当点击矩形时触发的事件可以作用于第i个矩形:
void __fastcall TForm1::rectsMouseDown(TObject *Sender, TMouseButton Button,
TShiftState Shift, float X, float Y){
rectangles[i]->Position->X = ....
rectangles[i]->Position->Y = .....
}
更新1
:我能够创建一个三角矢量,并通过该矢量对其进行操作。现在,我如何访问他们的事件来运行代码(例如OnClick)?以下是我目前掌握的情况:
#include <vector> // in my cpp file
std::vector<TRectangle*> myRects; // in my cpp file outside of any function so it is global
void __fastcall TForm1::Button3Click(TObject *Sender)
{
TRectangle *R = new TRectangle(this);
R->Parent = this;
R->Position->X = 20 + 5*myRects.size(); // slightly offset them in space
R->Position->Y = 20;
R->Tag = myRects.size()+1; // i think this is how i will tell them apart
myRects.push_back(R);
}
我可以像这样移动一个矩形:
void __fastcall TForm1::Button4Click(TObject *Sender)
{
myRects[1]->Position->X = 50; // this moves rectangle number 2.
myRects[1]->Position->Y = 50;
}
更新2
:在雷米的指导下,我现在开始工作了!我补充道
R->OnClick = &myRectOnClick;
对我的
Button3Click
方法就在
push_back
.然后我在TForm1中添加了以下方法。
void __fastcall TForm1::myRectOnClick(TObject *Sender)
{
if (TRectangle *Re = dynamic_cast<TRectangle *>(Sender)) { // make sure result of cast is not null
ShowMessage("Rectangle " + IntToStr(Re->Tag)); // Tag is how i know which rectangle i'm dealing with
}
}
更新3
:不确定这是否是一个新问题。。。但我加了一个
PopupMenu1
我想通过右键点击矩形来调用它。我把它和
R->PopupMenu = PopupMenu1
在
按钮3点击
密码这个
MenueItem1Click
这件事只会起作用
ShowMessage
显示矩形编号(
currentR
).嗯,全球int
电流
因为当我右键点击一个矩形时,矩形不会被设置。我必须先左键点击,然后右键点击
电流
设置为这个矩形标签。下面是我为矩形上的鼠标按下事件编写的代码——似乎应该一直设置它
电流
无论单击鼠标左键或右键,都会显示当前矩形。
void __fastcall TForm1::myRectOnMouseDown(TObject *Sender, TMouseButton Button,
TShiftState Shift, float X, float Y)
{
if (TRectangle *Re = dynamic_cast<TRectangle *>(Sender)) { // make sure result of cast is not null
currentR = Re->Tag; // which rectangle
if (Button == 0) { // left mb
fMouseIsDown = true;
fMouseInRectAtClick.X = X;
fMouseInRectAtClick.Y = Y;
}
}
}
为了清楚起见,这里是我最新版本的
按钮3点击
在窗体上放置新矩形的代码:
void __fastcall TForm1::Button3Click(TObject *Sender)
{
TRectangle *R = new TRectangle(this);
R->Parent = this;
R->Position->X = 20 + 5*myRects.size();
R->Position->Y = 20;
R->Tag = myRects.size()+1;
R->OnMouseDown = &myRectOnMouseDown;
R->OnMouseUp = &myRectOnMouseUp;
R->OnMouseMove = &myRectOnMouseMove;
R->PopupMenu = PopupMenu1; // to get a popup menu
myRects.push_back(R);
}