3

Innosetup は私を殺しています。RUNTIME 'Type Mismatch' エラーが表示されますが、これは私にとってまったく予想外のことです。Inno-setup 5.5.3 (u) を使用しています (「u」は Unicode バージョンを意味します)

2 次元配列をメソッドに渡そうとしています。

これが私の完全な例です。

[Setup]
AppName=EmptyProgram
AppVerName=EmptyProgram 1
UsePreviousAppDir=false
DefaultDirName={pf}\EmptyProgram
Uninstallable=false
OutputBaseFilename=HelloWorld
PrivilegesRequired=none

[Messages]
SetupAppTitle=My Title

[Code]
var
    langMap : array[0..3] of array[0..1] of String;


function getMapVal(map : array of array[0..1] of String; key: String ) : String;
begin
    Result:='not testing the body of the method';
end;

function InitializeSetup(): Boolean;
begin
    MsgBox('Hello world.', mbInformation, MB_OK);

    getMapVal(langMap, 'hello');    // this line here fails with type mismatch! Why?

    Result := FALSE;
end;

この例は実行されますが、メソッドの呼び出しについては次のとおりです。

getMapVal(langMap, 'こんにちは');

コンパイルされるため、宣言に満足しています。しかし、呼び出し時に不一致エラー。私は何を間違っていますか?

4

1 に答える 1

3

まず、ハッシュ マップを作成するのではなく、純粋なキー値リストを作成します。現時点では、InnoSetup で実際のジェネリック ハッシュ マップを作成する方法はありません。とにかく、現在のコードには完全なリファクタリングが必要です。私はむしろこのように書きたい:

[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program

[Code]
type
  TKey = string;
  TValue = string;
  TKeyValue = record
    Key: TKey;
    Value: TValue;
  end;
  TKeyValueList = array of TKeyValue;

function TryGetValue(const KeyValueList: TKeyValueList; const Key: TKey; 
  var Value: TValue): Boolean;
var
  I: Integer;
begin
  Result := False;
  for I := 0 to GetArrayLength(KeyValueList) - 1 do
    if KeyValueList[I].Key = Key then
    begin
      Result := True;
      Value := KeyValueList[I].Value;
      Exit;
    end;
end;

procedure InitializeWizard;
var 
  I: Integer;
  Value: TValue;
  KeyValueList: TKeyValueList;
begin
  SetArrayLength(KeyValueList, 3);
  for I := 0 to 2 do
  begin
    KeyValueList[I].Key := 'Key' + IntToStr(I);
    KeyValueList[I].Value := 'Value' + IntToStr(I);
  end;

  if TryGetValue(KeyValueList, 'Key2', Value) then
    MsgBox('Value: ' + Value, mbInformation, MB_OK);
end;
于 2013-08-29T10:34:10.057 に答える