我正在尝试根据本文档阅读C ++中的环境变量。我的代码如下所示:
char * val;
val = getenv( "smartDir" );
ShowMessage( val );
delete val;
Run Code Online (Sandbox Code Playgroud)
我的问题是,val总是以NULL结尾,就像环境变量不存在一样。但是,我清楚地定义了变量,如下所示:
我在这里做错了什么?
到目前为止,在我的应用程序中,它已经确定在运行时创建的所有其他表单应该是模态的.因此,在创建新表单时,我使用类似以下代码块的东西:
void __fastcall ShowForm( TComponent * Owner )
{
TForm1 * form = new TForm1( Owner );
form->ShowModal();
delete form;
}
Run Code Online (Sandbox Code Playgroud)
使用这种方法,表单的内存在用户关闭后很容易删除.
但是,在尝试弄清楚如何处理非模态对话框的内存管理时,我遇到了一个问题.显然,我不能简单地在ShowForm方法结束时调用delete,因为表单会在创建后立即删除.所以我留下这样的东西:
void __fastcall ShowForm( TComponent * Owner )
{
TForm1 * form = new TForm1( Owner );
form->Show();
}
Run Code Online (Sandbox Code Playgroud)
基于此文档和我编写的测试应用程序,我知道form指针将在其所有者关闭后被删除.但是,这仍然让我有以下情况:
假设我有FormA一个按钮,它创建并显示FormB使用代码的实例,就像上面的方法一样.我现在单击按钮创建一个FormB然后关闭FormB,三次.直到FormA关闭,三个实例FormB仍留在内存中.
如何管理表单创建的内存,以便在表单关闭后删除为表单分配的内存?是否有标准的最佳实践,或者我缺少的内置功能?
我正在使用Embarcadero的C++ Builder XE8.我有一个ListView,并动态添加其项目列.我需要一个图像列表,因为我想将图像添加到第二列,也就是使用(ListItem-> SubItemImages [0] = i;)
似乎通过添加此图像列表,默认情况下C++ Builder认为主列还需要一个图像,因此它默认将图像列表的第0个元素附加到该列中的所有项目.我不希望这种情况发生.而是在"ID"列下,我只想要ID而不是任何图像.我怎样才能做到这一点?
我的代码:
void __fastcall TForm1::FormCreate(TObject *Sender)
{
const string firstName[] = {"Snowball", "Scavies", "Tinkerbell", "Fido", "Garfield", "Kobe"};
const string lastName[] = {"M", "E", "O", "W", "W", "W"};
TListColumn *NewColumn;
TListItem *ListItem;
TListView *ListView = ListView1;
ListView->SmallImages = ImageList1;
ListView->ViewStyle = vsReport;
NewColumn = ListView->Columns->Add();
NewColumn->Caption = "ID";
NewColumn = ListView->Columns->Add();
NewColumn->Caption = "Node";
NewColumn = ListView->Columns->Add();
NewColumn->Caption = "First";
for (int i = 0; i < sizeof( firstName ) / sizeof( firstName[0] …Run Code Online (Sandbox Code Playgroud) 编辑:现在我对发生的事情有了更好的了解,我想我可以更好地说出这个问题,因此它更有用.
我试图在C++中复制以下delphi代码
TThread.Queue(nil,
procedure
begin
LogMessage("test");
end
);
Run Code Online (Sandbox Code Playgroud)
代码的目的是调用一个TMemo以线程安全的方式更新表单的方法.这是我试图调用的方法的C++版本Thread.Queue
void __fastcall TClientForm::LogMessage( String message )
{
MemoLog->Lines->Add( message );
}
Run Code Online (Sandbox Code Playgroud)
因为我使用的是没有CLANG增强功能的BCC32编译器,所以不能使用Lambda.相反,根据这个文档,我需要创建一个继承TThreadProcedure的Invoke()方法来覆盖方法来完成我需要完成的工作.然后我可以将该类的实例传递给TThread::Queue.
我创建了以下继承TThreadProcuedure并包含invoke方法的类.
class TMyThreadProcedure : TThreadProcedure
{
void __fastcall Invoke( String message );
};
Run Code Online (Sandbox Code Playgroud)
但是,由于TThreadProcedure是一个抽象类,我不能简单地创建它的实例来传递TThread::Queue.TThreadProcedure当我将类的实例传递到其中时,继承和定义要调用的函数的正确方法是什么TThread::Queue?