Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Проблемма с POS


Автор: JusTTaIReX 12.5.2013, 16:09
Проблема  вот в чем, написал цикл for, для заполнения многомерного массива. Нужно чтобы с блокнота он копировал строку и делил их на 4 части.
Пример:
слово;слово;слово;слово;

Всего строк 180.
Так вот при заполнении, функция Pos почему-то игнорирует 2,3 разделитель.

Код

procedure TSDIAppForm.Button5Click(Sender: TObject);
var
  I,J,L,pos1,pos2,r: Integer;
  k:string;
begin
setlength(verbs,strtoint(a),4);
L:=0;
for i := 1 to 1  do
begin
pos1:=0;
pos2:=0;
for j := 1 to 5 -1 do
begin
pos1:=pos1+L;
K:=(copy(words.Lines[1],pos1,ansipos(';',words.Lines[i])));
L:=length(K);
button2.Caption:=button2.Caption+inttostr(L)+' ';
verbs[i,j]:=copy(words.lines[i],pos1+1,L-1);
end;
end;

end;


Если что массив объявлен глобальным.

Автор: Beltar 12.5.2013, 18:34
У TStrings есть свойсто DelimitedText разбивающее строку по символу Delimeter.

Автор: JusTTaIReX 12.5.2013, 18:58
Beltar, а как мне его использовать?

Автор: Beltar 12.5.2013, 19:04
Присваиваешь ему входную строку, указав разделитель, у тебя, как я понял, ";", забираешь из TStrings готовые подстроки.

Автор: northener 12.5.2013, 19:13
Цитата(Beltar @  12.5.2013,  18:34 Найти цитируемый пост)
У TStrings есть свойсто DelimitedText

Только не TStrings, а TStringList

Автор: JusTTaIReX 12.5.2013, 19:19
Beltar,  northener,  такая проблема весь текст лежит в мемо. 

Автор: Beltar 12.5.2013, 19:22
И лекция по абстрактным классам в нагрузку.

Добавлено через 12 минут и 5 секунд
У Мемо есть свойство Lines.

Автор: Данкинг 12.5.2013, 20:14
Поиск по форуму "getwordcount"...

Автор: northener 13.5.2013, 02:08
Цитата(Beltar @  12.5.2013,  19:22 Найти цитируемый пост)
И лекция по абстрактным классам в нагрузку.

Кстати. Абстрактных классов в Дельфи не так уж и много. smile

Автор: JusTTaIReX 13.5.2013, 05:35
Может кто нибудь на моем коде показать  свойсто DelimitedText? а то я умудрился по буквам поделить х)

Автор: northener 13.5.2013, 13:29
Код

var
  StL : TStringList;
  I : Integer;
...
  StL:=TStringList.Create;
  try
    StL.Delimiter:=';';
    StL.DelimitedText:=Memo1.Lines[0];
    for I:=0 to StL.Count-1 do ShowMessage(StL[I]);
  finally
    StL.Free;
  end;

Автор: Poseidon 13.5.2013, 13:39
Код

procedure TForm1.FormCreate(Sender: TObject);
begin
  Memo1.Text:= 'слово;слово;слово;слово;';
end;


procedure TForm1.Button1Click(Sender: TObject);
var
  verbs: array of array of string;
  i,j: Integer;
  str: TStringList;
begin
  str:= TStringList.Create;
  try
    SetLength(verbs, Memo1.Lines.Count, 4);

    for i:= 0 to Memo1.Lines.Count-1 do
      begin
        str.Delimiter:= ';';
        str.DelimitedText:= Memo1.Lines[i];

        for j:= 0 to 3 do
          verbs[i,j]:= str[j];
      end;
  finally
    str.Free;
  end;
end;


Добавлено через 55 секунд
northener опередил smile

Автор: JusTTaIReX 14.5.2013, 09:19
Poseidon, northener,  спасибо) работает) а можно сделать чтобы он строку делил на подстроки только если встретит ';'? а то если натыкается на пробел то делит ее.

Автор: DarkProg 14.5.2013, 11:15
Цитата

   только что значит List index out of bounds (4)?
   

Это значит что происходит попытка обращения к элементу 4, который в списке не существует.


Этот ответ добавлен с нового Винграда - http://ru.vingrad.com//object-id518f952b6ccc19c811000002#findElement_E7045_5191f2976ccc19da71000ec9_0

Автор: northener 14.5.2013, 13:04
Цитата(JusTTaIReX @  14.5.2013,  09:19 Найти цитируемый пост)
 можно сделать чтобы он строку делил на подстроки только если встретит ';'? а то если натыкается на пробел то делит ее.

Если в тексте могут встречаться пробелы, значит исходная строка должна выглядеть например так:
слово;"второе слово";слово;"четвертое слово";
И обратите внимание на свойство TStringList.QuoteChar.

Автор: Poseidon 14.5.2013, 15:02
А что на счет регулярок? Что-нибудь типо 
Код

(.*?);


Добавлено через 12 минут и 1 секунду
Вот накидал тут на скору руку

Код

uses RegExpr;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Memo1.Text:= 'слово;второе слово;третье слово;четвертое слово;';
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  RegExpr: TRegExpr;
  verbs: array of array of string;
  i,j: Integer;
begin
  RegExpr:= TRegExpr.Create;
  try
    RegExpr.Expression:= '(.*?);';
    SetLength(verbs, Memo1.Lines.Count, 4);

    for i:= 0 to Memo1.Lines.Count-1 do
      if RegExpr.Exec(Memo1.Lines[i]) then
        for j:= 0 to 3 do
          begin
            verbs[i,j]:= RegExpr.Match[1];
            RegExpr.ExecNext
          end;
  finally
    RegExpr.Free;
  end;
end;


Добавлено через 14 минут и 5 секунд
Есть конечно узкие места, вроди тех, если входная строка не будет удовлетворять шаблону, но уже не стал обрабатывать подобные нюансы.

Автор: morpheyushka 22.5.2013, 14:42
а такой вариант?
Код

procedure TForm1.Button1Click(Sender: TObject);
var
  str : String;
  SL: TStringList;
  i: Integer;
begin
  str := 'слово;второе слово;третье слово;четвертое слово;';
  SL := TStringList.Create;
  try
    SL.Text := StringReplace(str, ';', #13#10, [rfReplaceAll]);

    for i := 0 to SL.Count - 1 do
      ShowMessage(SL[i]);
  finally
    SL.Free;
  end;
end;

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)