文本资源无法编译到我的Delphi exe中

文本资源无法编译到我的Delphi exe中,delphi,delphi-xe3,Delphi,Delphi Xe3,我在我的Delphi程序中使用一个单词列表,直到现在,我都会将该列表放在TMemo的Lines属性中。不过,我不需要可视化组件,而需要一个TStringList,所以现在我想用一个资源文件来完成这项工作,并从资源中加载我的TStringList。我尝试应用来自的信息,但出现错误: [dcc32错误]E2161错误:RLINK32:文件D:\etc\Unit1.rc中不支持的16位资源 为了更好地衡量,我有一个Unit1.rc文件: RC_keywords RCDATA "keywords.txt

我在我的Delphi程序中使用一个单词列表,直到现在,我都会将该列表放在TMemo的Lines属性中。不过,我不需要可视化组件,而需要一个TStringList,所以现在我想用一个资源文件来完成这项工作,并从资源中加载我的TStringList。我尝试应用来自的信息,但出现错误:

[dcc32错误]E2161错误:RLINK32:文件D:\etc\Unit1.rc中不支持的16位资源

为了更好地衡量,我有一个Unit1.rc文件:

RC_keywords RCDATA "keywords.txt"
我在项目中创建了这个→ 资源和图像…,但看起来这与自己编写.rc文件是一样的

在我的计划中,我有以下资源:

{$R *.rc}
在我的程序中

procedure TForm1.FormCreate(Sender: TObject);
var
  SL: TStringList;
  ResStream: TResourceStream;
begin
  SL := TStringList.Create;
  try
    ResStream := TResourceStream.Create(hInstance, 'RC_keywords', RT_RCDATA);
    SL.LoadFromStream(ResStream);
    //
    // do a lot of useful stuff here
    //
  finally
    SL.Free;
  end;

这里出了什么问题?

您没有将资源脚本编译成已编译的资源。您必须将脚本.rc文件编译为已编译资源.res文件。使用资源编译器brcc32执行此操作。然后像这样链接资源

{$R keywords.res}
或者让编译器为您调用资源编译器

{$R keywords.res keywords.rc}

我假设资源脚本名为keywords.rc,这对我来说比Unit1.rc更有意义

正如David所说,编译器不能直接使用.rc脚本,它必须编译成.res文件

我刚刚创建了一个简单的文本文件,keywords.txt。然后,我创建了另一个文本文件,其内容与您的相同,称为keywords.rc,都在DelphiIDE中

保存这两个选项后,我单击了菜单“项目->添加到项目…”。。。并将keywords.rc添加到项目中。在.dpr中,该行

{$R 'keywords.res' 'keywords.rc'}

已添加,并且在编译项目时立即创建了.res文件。

Hmm。在早期的Delphi版本中,在尝试包含RC文件之前,我总是使用brcc32将其编译为res文件。你试过了吗?@MartynA-我不知道这是否必要。{$R*.rc}不应该处理这个问题吗?如何手动编译资源?您提到brcc32,您的意思是这是命令行吗?我在1995年埋下了命令行。您是否已将Unit1.rc添加到项目中?i、 e.项目…添加到项目..@Andy_D-我现在有,但我得到了相同的错误。感谢您的回复,{$R*.res}中的*不只是每个文件名的通配符,它只是代表单元名,也就是说,它只查找具有单元名的文件,但扩展名是.res而不是.dcu。在Delphi XE3中,他可以简单地将资源文件添加到项目中。IDE将处理其余的部分。无需在命令行上使用brcc32。编译器创建了一个.res文件,经检查,该文件包括我的单词列表。就像鲁迪说的,这是自动完成的。你问题中的代码和我的不同。正如我所说,您正在尝试链接脚本。@Rudy我想解释询问者尝试失败的原因。了解流程,甚至资源编译器的存在都很重要。了解脚本和编译资源之间的区别很重要。是的,这也是我所知道的。但是我注意到我的.pas文件中仍然有一个无关的{$R*.rc}。当我删除这个错误时,错误消失了。接受了,因为鲁迪的回答导致了实际错误的发现。请参阅我在{$R*.res}行上的评论。请注意,{$R*.rc}对IDE没有任何意义,所以我想这就是为什么它忽略了它而没有删除它的原因。我不确定这一点。错误消息明确提到unit1.rc,因此看起来该行并没有被忽略。编译器对*.rc行有问题。IDE没有。