代码之家  ›  专栏  ›  技术社区  ›  relayman357

FMX中的三角阵列

  •  0
  • relayman357  · 技术社区  · 7 年前

    我正在努力扩展 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);
    }
    
    0 回复  |  直到 7 年前