标签: c++builder-xe8

使用getenv()读取环境变量将返回NULL C ++

我正在尝试根据本文档阅读C ++中的环境变量。我的代码如下所示:

char * val;
val = getenv( "smartDir" );

ShowMessage( val );

delete val;
Run Code Online (Sandbox Code Playgroud)

我的问题是,val总是以NULL结尾,就像环境变量不存在一样。但是,我清楚地定义了变量,如下所示:

在此处输入图片说明

我在这里做错了什么?

c++ environment-variables c++builder-xe8

2
推荐指数
1
解决办法
1104
查看次数

使用C++ Builder/Firemonkey中的表单创建来管理内存

到目前为止,在我的应用程序中,它已经确定在运行时创建的所有其他表单应该是模态的.因此,在创建新表单时,我使用类似以下代码块的东西:

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仍留在内存中.

如何管理表单创建的内存,以便在表单关闭后删除为表单分配的内存?是否有标准的最佳实践,或者我缺少的内置功能?

c++ forms c++builder firemonkey c++builder-xe8

2
推荐指数
1
解决办法
247
查看次数

TListView自动将图像列表中的图像附加到TListView的第一列.我如何摆脱这种行为?

我正在使用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)

delphi c++builder c++builder-xe8

1
推荐指数
1
解决办法
722
查看次数

Embarcadero TThread:用C++传递TThreadMethod

编辑:现在我对发生的事情有了更好的了解,我想我可以更好地说出这个问题,因此它更有用.

我试图在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.相反,根据这个文档,我需要创建一个继承TThreadProcedureInvoke()方法来覆盖方法来完成我需要完成的工作.然后我可以将该类的实例传递给TThread::Queue.

我创建了以下继承TThreadProcuedure并包含invoke方法的类.

class TMyThreadProcedure : TThreadProcedure
{
    void __fastcall Invoke( String message );
};
Run Code Online (Sandbox Code Playgroud)

但是,由于TThreadProcedure是一个抽象类,我不能简单地创建它的实例来传递TThread::Queue.TThreadProcedure当我将类的实例传递到其中时,继承和定义要调用的函数的正确方法是什么TThread::Queue

c++ delphi c++builder-xe8

-1
推荐指数
1
解决办法
1070
查看次数