Delphi - 从给定数据中获取行索引和数据索引

Lit*_*per -6 delphi tstringlist delphi-7

所以我有可能包含不同章程的数据列表:

1dAAbt54
agFlE9dA
1295RTdd
Run Code Online (Sandbox Code Playgroud)

第一行数据包含:1d,AA,bt,54.我需要的只是给出给定索引数据的函数.示例:索引6的数据为Fl(行-2,行中的索引为2).每行长度为8,数据长度为2;

我怎样才能在Delphi中实现这样的功能?

结果函数应该是这样的:

procedure (DataList: TStringList; DataIndex: Integer; var LineIndex: Integer; var PosInLine: Integer);
begin
//do the algorithm    
end;
Run Code Online (Sandbox Code Playgroud)

对不起,我的英语不好...

And*_*and 7

回答问题的第一个版本

以下是您的问题的第一个版本的答案(在您编辑它之前):

function GetIndexOfInteger(DataList: TStringList; DataIndex: Integer;
  out LineIndex: Integer; out PosInLine: Integer): boolean;
var
  x, y: Integer;
  InNum: boolean;
  NumStart: integer;
  ValIndex: integer;
begin
  result := false;
  for y := 0 to DataList.Count - 1 do
  begin
    InNum := false;
    ValIndex := 0;
    for x := 1 to Length(DataList[y]) do
    begin
      if (DataList[y][x] <> chr(32)) and not InNum then
      begin
        NumStart := x;
        InNum := true;
        inc(ValIndex);
      end;
      if InNum and ((DataList[y][x] = chr(32)) or
        (x = Length(DataList[y]))) then
      begin
        if StrToInt(Copy(DataList[y], NumStart, x - NumStart +
          IfThen(x = Length(DataList[y]), 1))) = DataIndex then
        begin
          LineIndex := y + 1;
          PosInLine := ValIndex;
          result := true;  // Roberts is on D7.
          Exit;            //
        end;
        InNum := false;
        Continue;
      end;
    end;
  end;
end;
Run Code Online (Sandbox Code Playgroud)

试试吧:

procedure TForm4.FormCreate(Sender: TObject);
var
  SR: TStringList;
  line, col: integer;
begin
  SR := TStringList.Create;
  SR.Add('1  2  3');
  SR.Add('4  5    6');
  SR.Add('7 8  9');
  SR.Add('10   11   12  13');

  if GetIndexOfInteger(SR, 13, line, col) then
    ShowMessage(Format('%d, %d', [line,col]));
end;
Run Code Online (Sandbox Code Playgroud)

回答你问题的第二个版本

(这很容易,你可以自己完成!:)

function GetIndexOfItemInListOfPairs(DataList: TStringList; Data: String; out LineIndex: Integer; out PosInLine: Integer): boolean;
var
  x, y: Integer;
begin
  result := false;
  for y := 0 to DataList.Count - 1 do
    for x := 0 to Length(DataList[y]) div 2 - 1 do
      if Copy(DataList[y], 2*x + 1, 2) = Data then
      begin
        LineIndex := y + 1;
        PosInLine := x + 1;
        Exit(true);
      end;
end;

procedure TForm4.FormCreate(Sender: TObject);
var
  SR: TStringList;
  line,col:integer;
begin
  SR := TStringList.Create;
  SR.Add('1dAAbt54');
  SR.Add('agFlE9dA');
  SR.Add('1295RTdd');

  if GetIndexOfItemInListOfPairs(SR, 'RT', line, col) then
    ShowMessage(Format('%d, %d', [line,col]));

end;
Run Code Online (Sandbox Code Playgroud)

回答问题的第三个版本

procedure TForm4.FormCreate(Sender: TObject);
var
  RowIndex, ColIndex: Word;
begin

  DivMod(6 {index} - 1, 4 {items per row}, RowIndex, ColIndex);
  inc(RowIndex);
  inc(ColIndex);

  ShowMessageFmt('%d, %d', [RowIndex, ColIndex]);
end;
Run Code Online (Sandbox Code Playgroud)

  • +1在移动目标职位时坚持不懈 (6认同)