0

使用 Lazarus 1.1 和 Freepascal 2.7.1,我有两个 StringGrids - StringGrid1 和 StringGrid2。

StringGrid1 包含三列;其中第三列包含唯一值。

StringGrid2 也有三列,其中第三列也包含相同的唯一值,但它们是从另一个来源绘制的,它们的顺序不同,有些可能会丢失。

我需要查看 Grid1 的 Col3 并查找对应的唯一值出现在 Grid2 中的位置(哪一行)。所以我需要解析 StringGrid1 Col3 的所有行并说“对于找到的每个值,找到 StringGrid2 的 Column3 的相应行,它也包含该值并返回它,如果找到,或者告诉我它丢失如果没有找到,直到所有SG1 Col3 的行已被搜索”。

关于我如何做到这一点的任何想法?希望它是在我看来比实际更复杂的事情之一,但希望有人可以提供帮助(我确实找到了这个,但我认为这不是我所需要的?:Delphi Pages Entry?我也找到了这个,但它没有完全解释如何应用它我在做什么,我不认为维基条目

4

2 回答 2

1

我的解决方案:

      VAR
        List_Found_Values,
        List_Not_Found        : TSTRINGLIST;
        i, I_Found            : INTEGER;
    BEGIN
      List_Found_Values   := TSTringList.Create;
      List_Not_Found      := TStringList.Create;

      FOR i := 0 TO StringGrid1.Count - 1 DO
      BEGIN
        I_Found := StringGrid2.Cols[2].IndexOf (StringGrid1.Cells[2, i]);
        IF I_Found > -1 THEN
          List_Found_Values.Add (StringGrid2.Cells[0, I_Found]+' + StringGrid2.Cells[1, I_Found]+' '+StringGrid2.Cells[2, I_Found])
        else
          List_Not_Founds.Add (StringGrid1.Cells[2, I_Found]);
      END;
      {use the tstringlist items List_Found and List_Not_Found etc. count to deside what to do }
    END;  

这只是直接写在盒子里..但应该给你一些解决方案的想法。

于 2012-12-07T13:04:35.417 回答
0

发现了两种方法:

for count1 := 0 to StringGrid1.RowCount - 1 do
  for count2 := 0 to StringGrid2.RowCount - 1 do
  begin
    if StringGrid1.Cells[3, count1] = StringGrid2.Cells[3, count2] then
    begin
      ShowMessage(StringGrid1.Cells[3, count1] + ' Found In Row ' + IntToStr(count2));
      Break;
    end;
  end;

另一种效率较低但仍然有用的方法使用:

for i := 0 to SL.Count - 1 do 
begin
  ShowMessage(SG.IndexOf(SL.Strings[i])): 
  // (SG being the StringGrid and SL being a StringList)
end;

或者

ShowMessage(SG.IndexOf('Text To Search For')): 
于 2012-12-03T10:40:33.727 回答