=从资源获取数据是这样的:
function GetMyRes(resname:string):string;
var
rStream: TResourceStream;
s:string;
begin
rStream := TResourceStream.Create(hInstance, resname, RT_RCDATA);
...
...
result:=s;
End;
>
=使用DATA
Procedure GetReses;
var
myres1:string;
myres2:string;
begin
myres1:=GetMyRes("MYSTRING1");
myres2:=GetMyRes("MYSTRING2");
end;
>
=将DATA放到资源中是这样的:
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,'MYSTRING1',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,'MYSTRING2',0,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,'MYSTRING3',0,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,'MYSTRING4',0,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,'MYSTRING5',0,PChar(s),cbData);
EndUpdateResource(hDestRes,FALSE)
end;
end;
&GT;
这里的问题,如果我像这样输出资源会怎样:(零增加)
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;
如何让“MYSTRINGS_ALL”在0到4范围内?
&GT;
这不起作用,因为当我把ZER0s放在我逐个命名的所有内容时它才会获得。
function GetMyRes(resname:string):string;
var
rStream: TResourceStream;
s:string;
begin
rStream := TResourceStream.Create(hInstance, resname, RT_RCDATA);
...
result:=s;
End;
什么是正确的函数或从0到4个字符串获取所有范围的方法?
&GT; 我认为这是正确的,我想是的!如果代码中有任何错误,请更正。
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;
感谢Rob Kennedy
答案 0 :(得分:1)
使用TResourceStream
,您无法获得存储的所有值。 TResourceStream
使用FindResource
,但您需要使用FindResourceEx
,因为您要更改的数字是语言ID ,而FindResource
不会提供该参数。
相反,您可以自己致电FindResourceEx
。这将返回一个资源句柄,供您传递给LoadResource
。返回一个内存句柄;使用LockResource
获取指向实际数据的指针。查看TResourceStream.Initialize
中的 Classes.pas ,看看它是如何完成的。
一旦您能够指定资源的语言ID,就可以单独加载它们并将它们排列成您想要的任何数据结构,包括数组。