Delphi 从资源流获取字符串数组

Delphi 从资源流获取字符串数组,delphi,stream,Delphi,Stream,=从资源获取数据如下所示: function GetMyRes(resname:string):string; var rStream: TResourceStream; s:string; begin rStream := TResourceStream.Create(hInstance, resname, RT_RCDATA); ... ... result:=s; End; > =使用数据 > =将数据放入资源如下所示: function GetMyRes(resname:string)

=从资源获取数据如下所示:

function GetMyRes(resname:string):string;
var
rStream: TResourceStream;
s:string;
begin
rStream := TResourceStream.Create(hInstance, resname, RT_RCDATA);
...
...
result:=s;
End;
>

=使用数据

>

=将数据放入资源如下所示:

function GetMyRes(resname:string):string;
var
rStream: TResourceStream;
s:string;
begin
rStream := TResourceStream.Create(hInstance, resname, RT_RCDATA);
...
...
result:=s;
End;
获取0到4个字符串范围的正确函数或方法是什么?

> 我想这是对的,我想是的!,如果代码中有错误,请更正

function GetMySTRResources(id:integer): string;
 var
   hF,hR:THandle;
   s:PChar;
 begin
  hF:=FindResourceEx(HInstance, RT_RCDATA ,'MYSTRINGS_ALL', id);
  if hF<>0 then begin
    hR:=LoadResource(HInstance, hF) ;
    if hR<>0 then begin
      s:=LockResource(hR) ;
      if Not Assigned(s) then s:='';
      UnlockResource(hR) ;
    end;
    FreeResource(hF) ;
  end;
  Result := s;
 end;
函数GetMySTRResources(id:integer):字符串; 变量 hF,hR:THandle; s:PChar; 开始 hF:=FindResourceEx(HInstance,RT_RCDATA,'MYSTRINGS_ALL',id); 如果为hF0,则开始 hR:=负载资源(HInstance,hF); 如果hR0,则开始 s:=锁资源(hR); 如果未分配,则s:=''; 解锁资源(hR); 结束; 免费资源(hF); 结束; 结果:=s; 结束;
感谢Rob Kennedy

使用
TResourceStream
,您无法获得存储的所有值
TResourceStream
使用
FindResource
,但您需要它来使用
findresourcex
,因为您要更改的数字是语言ID,
FindResource
不提供该参数

相反,您可以自己调用
findresourcex
。它返回一个资源句柄,供您传递到
LoadResource
。返回一个内存句柄;使用
LockResource
获取指向实际数据的指针。查看
TResourceStream.Initialize
中的Classes.pas以查看它是如何完成的


一旦您能够指定资源的语言ID,那么您就可以分别加载它们,并将它们排列到您想要的任何数据结构中,包括数组。

资源不是隐式以null结尾的,因此您不能简单地将
s
分配给
结果
。查看VCL如何通过获取资源大小来实现这一点。或者确保在要开始的资源中存储空字符。为什么不缩进示例源代码?
Procedure SaveToResource(Dest:string);
var
s:string;
cbData     : Cardinal;
hDestRes   : THANDLE;
begin
if x=1 then s:='1a' else s:='1b';
cbData := Length(s);
hDestRes := BeginUpdateResource(PChar(Dest), False);
if hDestRes <> 0 then
begin
UpdateResource(hDestRes, RT_RCDATA,'MYSTRINGS_ALL',0,PChar(s),cbData);
EndUpdateResource(hDestRes,FALSE)
end;

if x=2 then s:='2a' else s:='2b';
cbData := Length(s);
hDestRes := BeginUpdateResource(PChar(Dest), False);
if hDestRes <> 0 then
begin
UpdateResource(hDestRes, RT_RCDATA,'MYSTRINGS_ALL',1,PChar(s),cbData);
EndUpdateResource(hDestRes,FALSE)
end;

if x=3 then s:='3a' else s:='3b';
cbData := Length(s);
hDestRes := BeginUpdateResource(PChar(Dest), False);
if hDestRes <> 0 then
begin
UpdateResource(hDestRes, RT_RCDATA,'MYSTRINGS_ALL',2,PChar(s),cbData);
EndUpdateResource(hDestRes,FALSE)
end;

if x=4 then s:='4a' else s:='4b';
cbData := Length(s);
hDestRes := BeginUpdateResource(PChar(Dest), False);
if hDestRes <> 0 then
begin
UpdateResource(hDestRes, RT_RCDATA,'MYSTRINGS_ALL',3,PChar(s),cbData);
EndUpdateResource(hDestRes,FALSE)
end;

if x=5 then s:='5a' else s:='5b';
cbData := Length(s);
hDestRes := BeginUpdateResource(PChar(Dest), False);
if hDestRes <> 0 then
begin
UpdateResource(hDestRes, RT_RCDATA,'MYSTRINGS_ALL',4,PChar(s),cbData);
EndUpdateResource(hDestRes,FALSE)
end;
end;
function GetMyRes(resname:string):string;
var
rStream: TResourceStream;
s:string;
begin
rStream := TResourceStream.Create(hInstance, resname, RT_RCDATA);
...
result:=s;
End;
function GetMySTRResources(id:integer): string;
 var
   hF,hR:THandle;
   s:PChar;
 begin
  hF:=FindResourceEx(HInstance, RT_RCDATA ,'MYSTRINGS_ALL', id);
  if hF<>0 then begin
    hR:=LoadResource(HInstance, hF) ;
    if hR<>0 then begin
      s:=LockResource(hR) ;
      if Not Assigned(s) then s:='';
      UnlockResource(hR) ;
    end;
    FreeResource(hF) ;
  end;
  Result := s;
 end;