2012-12-01 58 views
0

使用Lazarus 1.1和Freepascal 2.7.1,我有兩個StringGrid - StringGrid1和StringGrid2。搜索StringGrid1的列以查看它在StringGrid2中顯示的行 - Lazarus&Freepascal

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

StringGrid2也有三列,其中第三列也包含相同的唯一值,但它們是從另一個來源繪製的,它們的順序不同,有些可能會丟失。

我需要查看Grid1的Col3並查找Grid2中哪個(哪一行)對應的唯一值出現。所以我需要解析StringGrid1 Col3的所有行,並說「對於找到的每個值,找到StringGrid2的Column3的對應行,它也包含該值,並返回它,如果找到,或者告訴我它缺少,如果找不到,直到所有已經搜索了SG1 Col3的行「。

任何想法,我怎麼做?希望有一件事情在我看來比實際上更復雜,但希望有人能夠幫助(我確實發現了這一點,但我不認爲這是我所需要的:Delphi Pages Entry?我也發現了這一點,牛逼相當講解如何應用它,我做什麼,我不認爲wiki entry

+0

更簡單: Grid1,Column3,有1000行。 Grid2,Column3有1000行。 對於G1,Col3各行中的值,查找對應的值在ofr G2,Col3中的行號。 –

回答

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')): 
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; 

這只是書面直入箱..但應該給你的解決方案的一些想法。