在 Inno Setup 中检查字符串列表中的所有字符串是否相同

Check if all Strings in a String List are the Same in Inno Setup

我找到了以下 link,但它适用于 C#: c# Check if all Strings in a String List are the Same.

我写了一个工作代码,它可以很好地完成剩下的工作,但它只能与排序的字符串列表一起正常工作。

此致,

function StringListStrCheck(const S: String; StringList: TStringList): Boolean;
var
  CurrentString: Integer;
begin
if StringList = nil then
  RaiseException('The StringList specified does not exist');
if StringList.Count = 0 then
  RaiseException('The specified StringList is empty');
if StringList.Count = 1 then
  RaiseException('The specified StringList does not contain multiple Strings');
Result := False;
CurrentString := 1;
Repeat
if (CompareStr( S, StringList.Strings[CurrentString]) = -1) then begin
Result := False;
end;
if (CompareStr( S, StringList.Strings[CurrentString]) = 0) then begin
Result := True;
end;
CurrentString := CurrentString + 1;
Until CurrentString > (StringList.Count - 1 );
end;

如果指定字符串与指定字符串列表中的所有其他字符串相同,则此 returns 为真。

否则,returns错误。

但是,问题在于,只有在给定的字符串列表已排序或其字符串没有空格时,它才能正确执行检查。如果给定字符串列表中的任何字符串或所有字符串都有空格,则必须对其进行排序。否则这个 returns True 即使有像 Your AplicationYour ApplicationX.

这样的不相等的字符串

示例

此 StringList 在其任何字符串中都没有任何空格:

var
   TestingList1: TStringList;

TestingList1 := TStringList.Create;
TestingList1.Add('CheckNow');
TestingList1.Add('DontCheckIt');
if StringListStrCheck('CheckNow', TestingList1) = True
then
    Log('All Strings are the same');
else
    Log('All Strings are not the same.'); 

它 returns 正确并且可以在日志中的输出消息中看到。

此 StringList 的字符串中有空格:

var
   TestingList2: TStringList;

TestingList2 := TStringList.Create;
TestingList2.Add('Check Now');
TestingList2.Add('Check Tomorrow');
TestingList2.Add('Dont Check It');
if StringListStrCheck('Check Now', TestingList1) = True
then
    Log('All Strings are the same');
else
    Log('All Strings are not the same.'); 

但是,这里 returns 即使那些字符串也不相同。

但是,在我像下面这样排序之后,该函数正常工作并且returns如预期的那样错误。

TestingList2.Sorted := True;
TestingList2.Duplicates := dupAccept;

我想知道如果给定的 StringList 的字符串有空格或给定的 StringList 未排序,为什么这个函数会失败,我还想知道如果给定的 StringList 我怎样才能使这个函数不失败有空格和/或给定的 StringList 未排序。

在此先感谢您的帮助。

只需在循环前将Result设置为True即可。

并在循环中将其设置为 False 一旦任何字符串不匹配。

Result := True;
CurrentString := 1;
Repeat
  if (CompareStr( S, StringList.Strings[CurrentString]) <> 0) then begin
    Result := False;
    Break;
  end;

  CurrentString := CurrentString + 1;
Until CurrentString > (StringList.Count - 1 );

如果您想忽略前导空格和尾随空格,请使用 Trim

您可以尝试使用要检查的字符串,例如“"INSIDE DOUBLE QUOTATION MARKS"”。