|
@@ -21,13 +21,13 @@ interface
|
|
|
|
|
|
uses
|
|
uses
|
|
Classes, SysUtils, resource;
|
|
Classes, SysUtils, resource;
|
|
-
|
|
|
|
|
|
+
|
|
type
|
|
type
|
|
EStringTableResourceException = class(EResourceException);
|
|
EStringTableResourceException = class(EResourceException);
|
|
EStringTableNameNotAllowedException = class(EStringTableResourceException);
|
|
EStringTableNameNotAllowedException = class(EStringTableResourceException);
|
|
EStringTableIndexOutOfBoundsException = class(EStringTableResourceException);
|
|
EStringTableIndexOutOfBoundsException = class(EStringTableResourceException);
|
|
|
|
|
|
-
|
|
|
|
|
|
+
|
|
resourcestring
|
|
resourcestring
|
|
SNameNotAllowed = 'Resource ID must be an ordinal in the range 1-4096';
|
|
SNameNotAllowed = 'Resource ID must be an ordinal in the range 1-4096';
|
|
SIndexOutOfBounds = 'String ID out of bounds: %d';
|
|
SIndexOutOfBounds = 'String ID out of bounds: %d';
|
|
@@ -42,7 +42,7 @@ type
|
|
fName : TResourceDesc;
|
|
fName : TResourceDesc;
|
|
fFirstID : word;
|
|
fFirstID : word;
|
|
fCount : integer;
|
|
fCount : integer;
|
|
- fList : TStringList;
|
|
|
|
|
|
+ fList : array of UnicodeString;
|
|
fCanChangeDesc : boolean;
|
|
fCanChangeDesc : boolean;
|
|
function IDtoIndex(const aId : word) : integer;
|
|
function IDtoIndex(const aId : word) : integer;
|
|
procedure CheckListLoaded;
|
|
procedure CheckListLoaded;
|
|
@@ -85,54 +85,47 @@ end;
|
|
procedure TStringTableResource.CheckListLoaded;
|
|
procedure TStringTableResource.CheckListLoaded;
|
|
var i : integer;
|
|
var i : integer;
|
|
begin
|
|
begin
|
|
- if fList<>nil then exit;
|
|
|
|
- fList:=TStringList.Create;
|
|
|
|
- fList.Capacity:=16;
|
|
|
|
|
|
+ if Length(fList) <> 0 then exit;
|
|
|
|
+ SetLength(fList, fCount);
|
|
|
|
+ for i:=0 to high(fList) do
|
|
|
|
+ fList[i]:= '';
|
|
if RawData.Size=0 then exit;
|
|
if RawData.Size=0 then exit;
|
|
RawData.Position:=0;
|
|
RawData.Position:=0;
|
|
- for i:=0 to 15 do
|
|
|
|
- fList.Add(ReadWideString);
|
|
|
|
|
|
+ for i:=0 to high(fList) do
|
|
|
|
+ fList[i]:= ReadWideString;
|
|
end;
|
|
end;
|
|
|
|
|
|
function TStringTableResource.ReadWideString: string;
|
|
function TStringTableResource.ReadWideString: string;
|
|
-var ws : widestring;
|
|
|
|
|
|
+var ws : unicodestring;
|
|
w : word;
|
|
w : word;
|
|
i : integer;
|
|
i : integer;
|
|
begin
|
|
begin
|
|
RawData.ReadBuffer(w,2);
|
|
RawData.ReadBuffer(w,2);
|
|
- {$IFDEF ENDIAN_BIG}
|
|
|
|
- w:=SwapEndian(w);
|
|
|
|
- {$ENDIF}
|
|
|
|
|
|
+ w:= LEtoN(w);
|
|
setlength(ws,w);
|
|
setlength(ws,w);
|
|
|
|
|
|
for i:=1 to length(ws) do
|
|
for i:=1 to length(ws) do
|
|
begin
|
|
begin
|
|
RawData.ReadBuffer(w,2);
|
|
RawData.ReadBuffer(w,2);
|
|
- {$IFDEF ENDIAN_BIG}
|
|
|
|
- w:=SwapEndian(w);
|
|
|
|
- {$ENDIF}
|
|
|
|
|
|
+ w:= LEtoN(w);
|
|
ws[i]:=widechar(w);
|
|
ws[i]:=widechar(w);
|
|
end;
|
|
end;
|
|
Result:=ws;
|
|
Result:=ws;
|
|
end;
|
|
end;
|
|
|
|
|
|
procedure TStringTableResource.WriteWideString(const aString: string);
|
|
procedure TStringTableResource.WriteWideString(const aString: string);
|
|
-var ws : widestring;
|
|
|
|
|
|
+var ws : unicodestring;
|
|
w : word;
|
|
w : word;
|
|
i : integer;
|
|
i : integer;
|
|
begin
|
|
begin
|
|
w:=length(aString);
|
|
w:=length(aString);
|
|
- {$IFDEF ENDIAN_BIG}
|
|
|
|
- w:=SwapEndian(w);
|
|
|
|
- {$ENDIF}
|
|
|
|
|
|
+ w:= NtoLE(w);
|
|
RawData.WriteBuffer(w,2);
|
|
RawData.WriteBuffer(w,2);
|
|
ws:=aString;
|
|
ws:=aString;
|
|
for i:=1 to length(ws) do
|
|
for i:=1 to length(ws) do
|
|
begin
|
|
begin
|
|
w:=word(ws[i]);
|
|
w:=word(ws[i]);
|
|
- {$IFDEF ENDIAN_BIG}
|
|
|
|
- w:=SwapEndian(w);
|
|
|
|
- {$ENDIF}
|
|
|
|
|
|
+ w:= NtoLE(w);
|
|
RawData.WriteBuffer(w,2);
|
|
RawData.WriteBuffer(w,2);
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
@@ -157,8 +150,8 @@ begin
|
|
CheckIndex(id);
|
|
CheckIndex(id);
|
|
CheckListLoaded;
|
|
CheckListLoaded;
|
|
idx:=IDtoIndex(id);
|
|
idx:=IDtoIndex(id);
|
|
- if idx>=fList.Count then Result:=''
|
|
|
|
- else Result:=fList[idx];
|
|
|
|
|
|
+ if idx>high(fList) then Result:= ''
|
|
|
|
+ else Result:= fList[idx];
|
|
end;
|
|
end;
|
|
|
|
|
|
procedure TStringTableResource.SetString(id: word; aString: string);
|
|
procedure TStringTableResource.SetString(id: word; aString: string);
|
|
@@ -167,13 +160,7 @@ begin
|
|
CheckIndex(id);
|
|
CheckIndex(id);
|
|
CheckListLoaded;
|
|
CheckListLoaded;
|
|
idx:=IDtoIndex(id);
|
|
idx:=IDtoIndex(id);
|
|
- if idx<fList.Count then fList[idx]:=aString
|
|
|
|
- else if idx>=fList.Count then
|
|
|
|
- begin
|
|
|
|
- for i:=fList.Count to idx-1 do
|
|
|
|
- fList.Add('');
|
|
|
|
- fList.Add(aString);
|
|
|
|
- end;
|
|
|
|
|
|
+ fList[idx]:= aString;
|
|
end;
|
|
end;
|
|
|
|
|
|
procedure TStringTableResource.UpdateRawData;
|
|
procedure TStringTableResource.UpdateRawData;
|
|
@@ -184,7 +171,7 @@ begin
|
|
RawData.Position:=0;
|
|
RawData.Position:=0;
|
|
for i:=FirstID to LastID do
|
|
for i:=FirstID to LastID do
|
|
WriteWideString(Strings[i]);
|
|
WriteWideString(Strings[i]);
|
|
- FreeAndNil(fList);
|
|
|
|
|
|
+ fList:= nil;
|
|
end;
|
|
end;
|
|
|
|
|
|
function TStringTableResource.GetType: TResourceDesc;
|
|
function TStringTableResource.GetType: TResourceDesc;
|
|
@@ -223,7 +210,7 @@ constructor TStringTableResource.Create;
|
|
begin
|
|
begin
|
|
inherited Create;
|
|
inherited Create;
|
|
fCanChangeDesc:=false;
|
|
fCanChangeDesc:=false;
|
|
- fList:=nil;
|
|
|
|
|
|
+ fList:= nil;
|
|
fType:=TResourceDesc.Create(RT_STRING);
|
|
fType:=TResourceDesc.Create(RT_STRING);
|
|
fName:=TResourceDesc.Create(1);
|
|
fName:=TResourceDesc.Create(1);
|
|
fCount:=16;
|
|
fCount:=16;
|
|
@@ -248,8 +235,7 @@ destructor TStringTableResource.Destroy;
|
|
begin
|
|
begin
|
|
fType.Free;
|
|
fType.Free;
|
|
fName.Free;
|
|
fName.Free;
|
|
- if fList<>nil then
|
|
|
|
- fList.Free;
|
|
|
|
|
|
+ SetLength(fList, 0);
|
|
inherited Destroy;
|
|
inherited Destroy;
|
|
end;
|
|
end;
|
|
|
|
|