gpt4 book ai didi

c++ - 在运行时从表单中删除 TFrame

转载 作者:搜寻专家 更新时间:2023-10-31 01:16:21 27 4
gpt4 key购买 nike

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

enter image description here

我还有一个名为“添加”的按钮。基本上每次我按下窗体上的那个添加按钮,一个新的 TFrame 就会被添加到它上面,并且在前一个 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。

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

最佳答案

一个简单的解决方案是让 TFrame 实例为您释放它们自己。为 X 按钮分配一个 OnClick 事件处理程序,并让它通过 PostMessage() 将排队的消息发布到其父 TFrame 窗口,然后将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 实例),您可以在 TFrame 类中公开自定义 TNotifyEvent 事件,并让您的 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...
}

关于c++ - 在运行时从表单中删除 TFrame,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9163664/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com