0

=Resource からの DATA の取得は次のようになります。

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

>

=データの使用

Procedure GetReses;
var
myres1:string;
myres2:string;
begin
myres1:=GetMyRes("MYSTRING1");
myres2:=GetMyRes("MYSTRING2");
end;

>

= DATA を Resource に入れると、次のようになります。

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;

>

ここでの問題、次のようにリソースを PUT するとどうなりますか: (ゼロがインクリメントされます)

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 の範囲で取得するには?

>

名前を付けたすべてに ZER0 を 1 つずつ入れたときにのみ GET するため、これは機能しません。

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;

ありがとうロブ・ケネディ

4

1 に答える 1