【问题标题】:Delphi - Get line index and data index from given dataDelphi - 从给定数据中获取行索引和数据索引
【发布时间】:2012-08-03 12:23:34
【问题描述】:

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

1dAAbt54
agFlE9dA
1295RTdd

第一行数据包含:1dAAbt54。我所需要的只是给我给定索引数据的函数。示例:索引 6 的数据为Fl(第 - 2 行,行内索引为 2)。每行长度为8,数据长度为2;

如何在 Delphi 中实现这样的功能?

结果函数应该是这样的:

procedure (DataList: TStringList; DataIndex: Integer; var LineIndex: Integer; var PosInLine: Integer);
begin
//do the algorithm    
end;

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

【问题讨论】:

  • 需要指定输入数据的格式。
  • 随着您的编辑,问题变得完全不同。另外,bt 肯定不是整数吗?
  • 如果我明白了什么,你的结果函数看起来像一个函数,而不是一个返回给定索引处数据的过程。
  • @SertacAkyuz:不,它应该返回给定数据第一次出现的行和列。更新:哎呀,Q又改了……
  • 我不得不给一个-1,因为问题的范围已经从原来的格式改变了。当有人回答一个问题时,问题就会变成其他问题,那个答案不再与问题匹配,因此它会使回答的人看起来很糟糕。请务必在发布之前彻底解决您的问题。

标签: delphi delphi-7 tstringlist


【解决方案1】:

回答您的问题的第一个版本

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

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;

试试看:

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;

回答您的问题的第二个版本

(而且这很容易,您可以自己完成!:)

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;

回答第三版问题

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;

【讨论】:

    【解决方案2】:

    怎么样...

    procedure Search( DataList: TStringList; DataIndex: Integer; var LineIndex: Integer; var PosInLine: Integer);
    var
      j, LineLen: integer;
      Line: string;
    begin
    LineIndex := 0;
    PosInLine := 0;
    for j := 0 to DataList.Count - 1 do
      begin
      Line := DataList[j];
      Inc( LineIndex);
      LineLen := Length( Line) div 2;
      if DataIndex >= LineLen then
        begin
        Dec( DataIndex, LineLen);
        continue
        end;
      PosInLine := LineLen;
      break
      end;    
    if PosInLine = 0 then // No find
      LineIndex := 0
    end;
    

    【讨论】:

      【解决方案3】:

      哎呀。问题已经完全改变了。这是问题v 1.0的过程:)

      procedure FindIndex(Data:TStringList; Index:integer;var LineIndex,PosInLine:Integer);
      var i:integer;
          CurrentStr:String;
          StrToFind:String;
      begin
          LineIndex:=0;
          PosInLine:=0;
          StrToFind:=intToStr(Index)+' ';
          for i:=0 to Data.Count-1 do
          begin
            CurrentStr:=' '+Data.Strings[i]+' ';
            IF POS(' '+StrToFind,CurrentStr)>0 then
            begin
              LineIndex:=i+1;
              //now we need to find PosInLine
              PosInLine:=1;
              repeat
                CurrentStr:=Trim(CurrentStr)+' ';
                IF Pos(StrToFind,CurrentStr)=1 then exit; //we found it
      
                CurrentStr:=copy(CurrentStr,POS(' ',CurrentStr),length(CurrentStr));
                inc(PosInLine);
      
              until (CurrentStr='');
              exit;
            end;
          end;
      end;
      

      用这段代码测试过

      var T:TStringList;
          Li,Pi:integer;
          i:integer;
      begin
          T:=TStringList.Create();
          T.Add('1 2   3');
          T.Add('  4 5    6');
          T.Add('7 8 9');
          T.Add('10 11 12  ');
          for i:=0 to 13 do
          begin
            FindIndex(T,i,Li,Pi);
            Memo1.Lines.Add(IntToStr(i)+':'+IntToStr(Li)+'-'+IntToStr(Pi))
          end;
      end;
      

      【讨论】:

        猜你喜欢
        • 2020-08-03
        • 2019-01-02
        • 2021-10-08
        • 2021-01-20
        • 2019-08-12
        • 1970-01-01
        • 2017-01-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多