Forum in READ ONLY mode! All questions and discussions on Discord official server, invite link: https://discord.gg/VxsGzJ7

Разбиватель строк

тут можно задать вопрос по скриптингу
Post Reply
ParadoX
Apprentice
Apprentice
Posts: 256
Joined: 17.03.2005 16:06

Разбиватель строк

Post by ParadoX »

помница была такая вещь, как strbreakApart.. разбивать строку на строки.. очень надо.. кто та скиньте плз..
Miralex
Developer
Developer
Posts: 656
Joined: 11.03.2005 19:12
Contact:

Post by Miralex »

Code: Select all

procedure StrBreakApart(const S, Delimeter : string; Parts : TStrings);
var
  CurPos: integer;
  CurStr: string;
begin
  Parts.clear;
  Parts.BeginUpdate();
  try
    CurStr:= S;
    repeat
      CurPos:= Pos(Delimeter, CurStr);
      if (CurPos>0) then 
      begin
        Parts.Add(Copy(CurStr, 1, Pred(CurPos)));
        CurStr:= Copy(CurStr, CurPos+Length(Delimeter),
                    Length(CurStr)-CurPos-Length(Delimeter)+1);
      end else
        Parts.Add(CurStr);
    until CurPos=0;
  finally
    Parts.EndUpdate();
  end;
end;

Пример использования:

Code: Select all

program test;
var 
  Tmp : TStringList; 
  i : Integer;


procedure StrBreakApart(const S, Delimeter : string; Parts : TStrings); 
var 
  CurPos: integer; 
  CurStr: string; 
begin 
  Parts.clear; 
  Parts.BeginUpdate(); 
  try 
    CurStr:= S; 
    repeat 
      CurPos:= Pos(Delimeter, CurStr); 
      if (CurPos>0) then 
      begin 
        Parts.Add(Copy(CurStr, 1, Pred(CurPos))); 
        CurStr:= Copy(CurStr, CurPos+Length(Delimeter), 
                    Length(CurStr)-CurPos-Length(Delimeter)+1); 
      end else 
        Parts.Add(CurStr); 
    until CurPos=0; 
  finally 
    Parts.EndUpdate(); 
  end; 
end;


Begin
  Tmp := TStringList.Create(); 
  StrBreakApart('Text1<BR>Text2<BR>Text3<BR>Text4','<BR>',Tmp); 
// После вызова Tmp содержит 
// Text1 
// Text2 
// Text3 
// Text4 
//  ... 

for i := 0 to (Tmp.Count - 1) do AddToSystemJournal(Tmp.Strings[i]);

  Tmp.Free; 

End.

Хочу обратить внимание на:
1. Строки в списке индексируються с 0 а не с еденицы!
(Индекс первой строки - 0, индекс последней - (Count - 1))!

2. После использования списка строк надо незабыть вызвать метод Free!
Acronym
Novice
Novice
Posts: 114
Joined: 10.05.2005 18:42
Location: Odessa, NDW
Contact:

Post by Acronym »

Пытался сделать следующее:
после

Code: Select all

ClickOnObject(FindTypeEx($FFFF,$FFFFFFFF,backpack,false));
из строки журнала

Code: Select all

System: tinker tool
выводить для дальнейшего пользования только результат, без System:
Хотел спросить это вообще можно сделать?
или как еще можно получить название предмета?
L'inconnu
Novice
Novice
Posts: 73
Joined: 03.02.2006 8:46
Contact:

Post by L'inconnu »

Code: Select all

var SL : TStringList;
...
   ClickOnObject(finditem)
   if WaitJournalLine(Now, ': ', 3000) then
      begin
      SL := TStringList.Create;
      StrBreakApart(LastJournalMessage, ': ', SL);
      if SL.Count > 0 then AddToSystemJournal('В контейнере осталось '+IntToStr(FindFullQuantity)+' '+SL.Strings[0])
      SL.Free;
      end
CFA
Developer
Developer
Posts: 492
Joined: 20.04.2006 6:03
Contact:

Post by CFA »

Acronym wrote:...
или как еще можно получить название предмета?
а getName(...) - не подходит?

Code: Select all

clickOnObject(finditem);
wait(200); //или checkLag
itemName := getName(finditem);
Acronym
Novice
Novice
Posts: 114
Joined: 10.05.2005 18:42
Location: Odessa, NDW
Contact:

Post by Acronym »

CFA wrote:
Acronym wrote:...
или как еще можно получить название предмета?
а getName(...) - не подходит?

Code: Select all

clickOnObject(finditem);
wait(200); //или checkLag
itemName := getName(finditem);
Оно же вроде не работает?

L'inconnu, спасибо за подсказку, попробую.
Post Reply