Alternative ohne Verwendung eines externen Files zur Runtime
(in Anlehung an Julian M.Bucknall, 2001, "Tomes of Delphi: Algorithms and Data Structures"):
File ResStrings.inc:
Code:
CONST
cResStrBase = $5444;
maxResCount = 12;
AA_10_10 = cResStrBase + 0;
AA_10_11 = cResStrBase + 1;
AA_10_12 = cResStrBase + 2;
AA_10_13 = cResStrBase + 3;
AA_11_10 = cResStrBase + 4;
AA_11_11 = cResStrBase + 5;
AA_11_12 = cResStrBase + 6;
AA_11_13 = cResStrBase + 7;
AA_12_10 = cResStrBase + 8;
AA_12_11 = cResStrBase + 9;
AA_12_12 = cResStrBase + 10;
AA_12_13 = cResStrBase + 11;
{..usw..}
Resourcefile:
Code:
#include "ResStrings.inc"
STRINGTABLE
BEGIN
AA_10_10, "Dies ist ein Text zu (10_10)"
AA_10_11, "Dies ist ein Text zu (10_11)"
AA_10_12, "Dies ist ein Text zu (10_12)"
AA_10_13, "Dies ist ein Text zu (10_13)"
AA_11_10 "Dies ist ein Text zu (11_10)"
AA_11_11 "Dies ist ein Text zu (11_11)"
AA_11_12 "Dies ist ein Text zu (11_12)"
AA_11_13 "Dies ist ein Text zu (11_13)"
AA_12_10 "Dies ist ein Text zu (12_10)"
AA_12_11 "Dies ist ein Text zu (12_11)"
AA_12_12 "Dies ist ein Text zu (12_12)"
AA_12_13 "Dies ist ein Text zu (12_13)"
{..usw..}
END
Compile Resource:
Projektfile:
Code:
{...}
implementation
{$R *.dfm}
{$R ResStrings.res}
{$I ResStrings.inc}
type
tArrResStr = array of string;
var
ArrResStr: tArrResStr;
// an die Logik der Bezeichnung der Elemente des Arrays anpassen !
// hier zum konkreten Beispiel der verwendeten Stringtable
procedure PrepareArray(var Arr: tArrResStr);
var
i, j, z, basis: integer;
begin
setlength(Arr, maxResCount);
basis := 10;
z := basis;
j := 0;
for i := Low(Arr) to High(Arr) do
begin
case i of
0: ;
4:
begin
inc(z, 1);
j := 0;
end;
8:
begin
inc(z, 1);
j := 0;
end;
{...}
else inc(j);
end;
Arr[i] := format('AA_%2.d_%2.d', [z, basis + j]);
end;
end;
procedure ClearArray(var Arr: tArrResStr);
begin
setlength(Arr, 0);
end;
function IndexOf(Arr: tArrResStr; const item: string): Integer;
var
i: Integer;
begin
Result := -1;
for i := Low(Arr) to High(Arr) do
begin
if AnsiSameText(item, Arr[i]) then
begin
Result := i;
Break;
end;
end;
end;
function constantentext(ResConst: word): string; overload;
begin
setlength(result, 255);
LoadString(hinstance, ResConst, pchar(result), 255);
end;
function constantentext(ResConstName: string): string; overload;
var
ResConst: Word;
begin
ResConst := IndexOf(ArrResStr, ResConstName);
result := pchar(constantentext(cResStrBase + ResConst));
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
PrepareArray(ArrResStr);
// Beispiel der Übergabe per Indexkonstante als String
Label1.caption := constantentext('AA_10_10');
Label2.caption := constantentext('AA_11_13');
// Beispiel der Übergabe unmittelbar als Indexkonstante
Label3.caption := constantentext(AA_12_12);
ClearArray(ArrResStr);
end;
Da zur Compiletime die Logik der in der Stringtable vergebenen Indexkonstanten feststeht, muss allein die Zuordung der Namen dieser Indexkonstanten zu den Strings des entspr. Arrays mit Hilfe einer Funktion PrepareArray() ausgearbeitet werden.
Dies ist die eigentliche Aufgabe der Anpassung an das konkrete Projekt. Jedoch dürfte die Ausarbeitung dieser Funktion wohl keine ernsthaften Probleme machen, wenn die Namen der Indexkonstanten nach einem logischen Prinzip vergeben werden, welches dann wiederum in dieser Funktion umgesetzt wird.