在运行时从表单中删除TFrame

时间:2012-02-06 16:40:49

标签: c++ runtime c++builder tframe

我正在使用C ++ Builder创建一个VCL表单应用程序。现在我有一个包含一堆组件的TFrame,它看起来像这样......

enter image description here

我也有一个按钮叫“添加”。基本上每当我按下表单上的“添加”按钮时,会在其上添加一个新的TFrame,并在前一个下方创建一个看起来像表的东西。并且为了添加重复项,我必须在每次创建之前重命名TFrame。

    int __fastcall TForm1::AddMapCells(void)
    {
        Num++;
        TFrame1 * MyFrame = new TFrame1(Form1);
        MyFrame->Parent=Form1;
        MyFrame->Name = "TFrame" + IntToStr(Num);
        MyFrame->Top = 23*Num;
        return Num;
    }

那么TFrame的命名就是TFrame1,TFrame2,TFrame3等。

现在的问题是我想这样做然后每次按下TFrame的'X'按钮时,它会删除那个TFrame,我不太清楚如何做到这一点。我想也许每次我创建一个TFrame我也可以重命名'X'按钮,然后它就像Button1,Button2,Button3等。然后删除程序只会将ButtonX与TFrameX匹配,以识别要删除的TFrame。例如,如果我按下按钮4,它应该与TFrame4匹配并删除TFrame4。

我不知道如何实现这个想法。或者有更简单的方法吗?

1 个答案:

答案 0 :(得分:4)

一个简单的解决方案是让TFrame实例为您自由释放。将一个OnClick事件处理程序分配给X按钮,并让它通过TFrame将排队的消息发布到其父PostMessage()窗口,然后为TFrame类提供一个释放的消息处理程序处理该消息时的TFrame实例(这是TForm::Release()方法的工作方式),例如:

void __fastcall TFrame1::CloseButtonClick(TObject *Sender)
{
    // CM_RELEASE is defined in Controls.hpp
    PostMessage(Handle, CM_RELEASE, 0, 0);
} 

void __fastcall TFrame1::WndProc(TMessage &Message)
{
    if (Message.Msg == CM_RELEASE)
    {
        delete this;
        return;
    }

    TFrame::WndProc(Message);
}

如果您需要通知您的父TForm已关闭TFrame(例如,重新定位较低TFrame个实例),您可以公开自定义TNotifyEvent TFrame类中的事件,并让TForm为其分配事件处理程序,例如:

class TFrame1 : public TFrame
{
private:
    TNotifyEvent FOnClose;
    ...
public:
    ...
    __property TNotifyEvent OnClose = {read=FOnClose, write=FOnClose};
};

void __fastcall TFrame1::CloseButtonClick(TObject *Sender)
{
    if (FOnClose != NULL) FOnClose(this);
    PostMessage(Handle, CM_RELEASE, 0, 0);
} 

void __fastcall TFrame1::WndProc(TMessage &Message)
{
    if (Message.Msg == CM_RELEASE)
    {
        delete this;
        return;
    }

    TFrame::WndProc(Message);
}

int __fastcall TForm1::AddMapCells(void) 
{ 
    Num++; 
    TFrame1 * MyFrame = new TFrame1(this); 
    MyFrame->Parent = this; 
    MyFrame->Name = "TFrame" + IntToStr(Num); 
    MyFrame->Top = 23*Num; 
    MyFrame->OnClose = &FrameClosed;
    return Num; 
} 

void __fastcall TForm1::FrameClosed(TObject *Sender)
{
    // Sender is the TFrame1 instance whose X button was clicked.
    // It will auto-free itself after this method exits...
}
相关问题