首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在运行时从窗体中删除TFrame

在运行时从窗体中删除TFrame
EN

Stack Overflow用户
提问于 2012-02-07 00:40:49
回答 1查看 2.3K关注 0票数 2

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

我还有一个叫"Add“的按钮。基本上,每当我按下表单上的Add按钮时,就会有一个新的TFrame添加到它上面,并且位于前一个的下面,使它看起来像一个表格。为了添加重复项,我必须在每次创建TFrame之前对其进行重命名。

代码语言:javascript
运行
复制
    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。

我不知道如何实现这个想法。或者会有一种更简单的方法来做这件事?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-02-07 07:47:33

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

代码语言:javascript
运行
复制
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实例),您可以在TFrame类中公开一个自定义TNotifyEvent事件,并让TForm为其分配一个事件处理程序,例如:

代码语言:javascript
运行
复制
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);
}

代码语言:javascript
运行
复制
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...
}
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9163664

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档