【问题标题】:Delphi 2010: unable to find resource - EResNotFoundDelphi 2010:无法找到资源 - EResNotFound
【发布时间】:2011-01-11 22:21:15
【问题描述】:

基于hereherehere 等示例,我正在尝试在项目中包含 SVN 修订信息。 svn info 调用的结果存储在rev.txt(它是一个普通的 ansi 文件)。我的revinfo.rc 看起来像这样:

REV_TEXT    TEXT    rev.txt

我的项目如下所示:

unit rev;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
type
  TForm2 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  end;
var
  Form2: TForm2;
implementation
{$R *.dfm}
{$R revinfo.res}
procedure TForm2.Button1Click(Sender: TObject);
var
  RS : TResourceStream;
  MyStr : AnsiString;
begin
  RS := TResourceStream.Create(hInstance, 'REV_TEXT', RT_RCDATA);
  SetLength(MyStr, RS.Size);
  RS.Read(MyStr[1], RS.Size);
  RS.Free;
  Memo1.Text := MyStr;
end;
end.

项目编译,换句话说,资源文件本身由编译器定位(或者说它是链接器?)。反正;当执行TResourceStream.Create(hInstance, 'REV_TEXT', RT_RCDATA); 语句时,我得到一个EResNotFound 异常,抱怨它找不到资源REV_TEXT。我可以确认资源文件编译满意,包含rev.txt 文本文件的内容。有没有人能够重现我的麻烦?

顺便说一句:我也尝试过使用索引版本的 TResourceStream 构造函数,但我不知道要使用哪个索引(尝试了 0、1 和 2 无济于事)。

非常感谢您的帮助! :)

【问题讨论】:

    标签: delphi resources


    【解决方案1】:

    您的代码中的问题在于:

     TResourceStream.Create(hInstance, 'REV_TEXT', RT_RCDATA);
    

    您必须使用与资源TEXT 相同类型的资源调用TResourceStream.Create

    以下代码应该可以工作:

    var
      RS : TResourceStream;
      MyStr : AnsiString;
    begin
      RS := TResourceStream.Create(hInstance, 'REV_TEXT', 'TEXT');
      try
       SetLength(MyStr, RS.Size);
       RS.Read(MyStr[1], RS.Size);
      finally
        RS.Free;
      end;
    end;
    

    【讨论】:

    • 非常感谢!奇迹般有效。 (虽然文字是中文的……哦,好吧。至少更进一步。):)
    • 想通了。字符串类型显然必须是 AnsiString,如 RRUZ 答案所示(如前所述,该文件是 Ansi 编码文件)。我已经更改了原始问题中的 MyStr 以防止人们误入歧途。
    猜你喜欢
    • 2017-02-22
    • 2011-12-27
    • 1970-01-01
    • 2017-11-29
    • 2020-01-17
    • 2018-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多