我想创建一个程序(学习Delphi),该程序需要3个不同的列表(来自TEdit
)
采用3个TEdit
并将文本转换为TStringList
并分开(到目前为止,我对此还可以)。
我要输出第一个或第二个列表中都不存在的第一个列表的名字(或项目)
procedure TForm1.Button1Click(Sender: TObject);
var
i, j ,k : integer;
begin
list := TStringList.Create;
ignoreListFirst := TStringList.Create;
ignoreListSecond := TStringList.Create;
list.Delimiter := ',';
ignoreListFirst.Delimiter := ',';
ignoreListSecond.Delimiter := ',';
list.DelimitedText := EditList.Text;
ignoreListFirst.DelimitedText := EditIgnoreList1.Text;
ignoreListSecond.DelimitedText := EditIgnoreList2.Text;
for k := 0 to list.Count - 1 do
begin
for i := 0 to ignoreListFirst.Count - 1 do
begin
for j := 0 to ignoreListSecond.Count - 1 do
begin
if (list[k] <> ignoreListFirst[i]) and (list[k] <> ignoreListSecond[k]) then
EditResult.Text := list[k];
break;
end;
end;
end;
list.Free;
ignoreListFirst.Free;
ignoreListSecond.Free;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
EditList.Text := 'Katy,Mary,John,Maggie,Carl';
EditIgnoreList1.Text := 'Katy,Mary,John';
EditIgnoreList2.Text := 'John,Carl';
end;
尝试交换循环顺序以查看是否可以查明问题所在。
最后一个循环中的第一个列表没有给我任何错误,并产生了名称“ Katy”,是,是列表中的第一个,但被忽略了。
将第一个列表交换为第一个循环。产生了“玛丽”,我想我会忽略(我想要)凯蒂,但据我所见,不会。”
在此示例中(该示例不起作用),我希望它产生不在两个忽略列表中的“ Maggie”。
非常抱歉,如果我解释错了。学习Delphi。 找出任何错误。
答案 0 :(得分:0)
在搞弄调试器并遵循给出的建议时,我来到了下面的答案。
procedure TForm1.Button1Click(Sender: TObject);
var
iList, iListFirst ,iListSecond : integer;
found : boolean;
begin
list := TStringList.Create;
ignoreListFirst := TStringList.Create;
ignoreListSecond := TStringList.Create;
list.Delimiter := ',';
ignoreListFirst.Delimiter := ',';
ignoreListSecond.Delimiter := ',';
list.DelimitedText := EditList.Text;
ignoreListFirst.DelimitedText := EditIgnoreList1.Text;
ignoreListSecond.DelimitedText := EditIgnoreList2.Text;
for iList := 0 to list.Count - 1 do
begin
for iListFirst := 0 to ignoreListFirst.Count - 1 do
begin
found := false;
if list[iList] = ignoreListFirst[iListFirst] then
begin
found := true;
break
end;
end;
if not found then
begin
for iListSecond := 0 to ignoreListSecond.Count - 1 do
begin
if list[iList] = ignoreListSecond[iListSecond] then
begin
found := true;
break
end;
end;
end;
if not found then
begin
EditResult.Text := list[iList];
break
end;
end;
list.Free;
ignoreListFirst.Free;
ignoreListSecond.Free;
end;
答案 1 :(得分:0)
基本上,您缺少开头/结尾。
for k := 0 to list.Count - 1 do
begin
for i := 0 to ignoreListFirst.Count - 1 do
begin
for j := 0 to ignoreListSecond.Count - 1 do
begin
if (list[k] <> ignoreListFirst[i]) and (list[k] <> ignoreListSecond[k]) then
Begin // here
EditResult.Text := list[k];
break;
End; // here
end;
end;
end;
在旧代码中,循环将始终中断。 当不使用开始/结束时,仅if后面的第一行代码将取决于if条件。 第二行将始终执行。
第二个:中断,仅在最内部的循环处中断。因此,另外两个循环将继续,因此可能会显示另一个名称...
但是,除了使用两个额外的内部循环之外,您还可以检查第一个循环的当前字符串是否存在于其他循环中(请参见TstringList.IndexOf
)
答案 2 :(得分:0)
我将使用TStrings.IndexOf
函数执行以下操作。
注意:请记住,请在try-finally block中释放列表,否则迟早会生成memory leaks。
var
List : TStrings;
IgnoreListFirst : TStrings;
IgnoreListSecond : TStrings;
i : integer;
begin
List := TStringList.Create;
IgnoreListFirst := TStringList.Create;
IgnoreListSecond := TStringList.Create;
try
List.Delimiter := ',';
IgnoreListFirst.Delimiter := ',';
IgnoreListSecond.Delimiter := ',';
List.DelimitedText := EditList.Text;
IgnoreListFirst.DelimitedText := EditIgnoreList1.Text;
IgnoreListSecond.DelimitedText := EditIgnoreList2.Text;
for i := 0 to List.Count do
begin
if(IgnoreListFirst.IndexOf(List[i]) = -1) and (IgnoreListSecond.IndexOf(List[i]) = -1) then
begin
EditResult.Text := List[i];
Exit;
end;
end;
finally
IgnoreListSecond.Free;
IgnoreListFirst.Free;
List.Free;
end;
end;