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


Автор: Балбес 17.1.2005, 21:54
Здравствуйте, ув. господа программисты. smile
Подскажите мне пожста с такой штукой:
есть некая строка символов в Memo, например:
123*456*789 и соответственно три поля Edit.
Как разбить эту строку на три части до звездочек или др.разделителей и поместить это все в разные эдиты?
Выручите примером, плиз smile

Автор: Pakshin A. S. 17.1.2005, 22:05
Код

const
rzd = '*';

...

var
s:string;
i:integer;
begin
s:=Memo1.Lines.Text;
i:=1;
while s <> '' do
 begin
  case i of
    1: Edit1.Text:=Copy(s, 1, Pos(Rzd, s)-1);
    2: Edit2.Text:=Copy(s, 1, Pos(Rzd, s)-1);
    ...
  end;
  Delete(s, 1, Pos(Rzd, s));
  inc(i);
 end;
end;

Автор: Alex 17.1.2005, 22:22
http://vingrad.ru/VF-DLP-000210

Автор: Stadler 18.1.2005, 06:03
Как обычно рекламирую мой модуль mystr http://slaur.narod.ru/delphi/mystr.rar
Говорю единственный раз :
Это не просто модуль это метод подхода к строке как к полям разделенными символами этим методом должен владеть каждый программист Сложное становится простым!
И я буду рекламировать свой модуль.
Немного истории
Сначала я изучил язык программирования AWK (мне нужно было работать со строками) там был именно такой подход к строке.Это был Си подобный язык .Со стороками можно было делать ВСЕ.
Потом я перешел на Паскаль и мне стало не хватать этого метода я сделал модуль mysys.tpu потом перешел на delphi и переделал немного этот модуль.Над этим модулем нужно работать ВСЕМ.Так что пишите письма.
Код

var st1:string;

Edit1.text:=cNFi(1,St1,'*');
Edit2.text:=cNFi(2,St1,'*');
Edit3.Text:=cNFi(3,St1,'*');



Вот и все дела.Удачи.

Автор: SlaUr 18.1.2005, 06:06
Блин прозевал предыдущее сообщение писал я а Stadler это мой первый в жизни ученик по delphi.Модулю кстати лет 10.
Может администратор поменяет имя предыдущего сообщения и удалит это сообщение?

Автор: Vit 18.1.2005, 06:43
Цитата(SlaUr @ 17.1.2005, 21:06)
Может администратор поменяет имя предыдущего сообщения и удалит это сообщение?


нет

Автор: Балбес 18.1.2005, 10:14
Всем пасиба за ответы. smile
Сейчас доработаю код Pakshin A. S. а то он у меня не пашет... Зато принцип понятен.

Автор: Балбес 18.1.2005, 21:18
В общем, я сделал так:
Код

begin
s:=Memo1.Lines.Strings[n];
Memo2.Text:=Copy(s, 1, Pos(Rzd, s)-1);
Delete(s, 1, Pos(Rzd, s));
Memo3.Text:=Copy(s, 1, Pos(Rzd, s)-1);
Delete(s, 1, Pos(Rzd, s));
Memo3.Text:=s;
end;

А если делать в цикле, чтобы не одна строка в меомо бралась а все по очереди, тогда все виснет или не работает...
Поможите еще раз smile
А еще подскажите как удалять какую-либо строку в мемо, плиз... smile

Автор: Zero 19.1.2005, 01:09
Цитата
Сейчас доработаю код Pakshin A. S. а то он у меня не пашет... Зато принцип понятен.
А все коды Pakshin A. S. ни у кого никогда не пашут с первого раза, потомучто он их перед отправкой ни когда не проверяет, а мне как всегда тут приходится всё доробатывать за ним, блин. smile
В данном случае он не учёл, что при 2-перезаписи из мемо в едит, удаляется символ "разделитель" и за счёт этого процедурой Delete строка S никогда полностью не удалится, т.е. бесконечный цикл (зависание). Вобщем надо добавить такую строку:
Код

if s[length(s)]<>rzd then s:=s+rzd;
сразу после S:=....
Код

procedure TForm1.Button1Click(Sender: TObject);
begin
 s:=Memo1.Lines.Text;
 if s[length(s)]<>rzd then s:=s+rzd;
 i:=1;
 while s <> '' do
 begin
  case i of
    1: Edit1.Text:=Copy(s, 1, Pos(Rzd, s)-1);
    2: Edit2.Text:=Copy(s, 1, Pos(Rzd, s)-1);
    3: Edit3.Text:=Copy(s, 1, Pos(Rzd, s)-1);
  end;
  Delete(s, 1, Pos(Rzd, s));
  inc(i);
 end;
end;
Цитата
Как разбить эту строку на три части до звездочек или др.разделителей и поместить это все в разные эдиты?
А вот ещё вариант с использованием одновременно любых разделителей (разделителем является не цифра, а любая другая литера)
Код

procedure TForm1.Button1Click(Sender: TObject);
var
 s:string;
 i,j:integer;
begin
 s:=memo1.Text;
 j:=1;
 for i:=1 to 3 do
   begin
     repeat
       if s[j] in ['0'..'9'] then
       begin
         if i=1 then edit1.Text:=edit1.Text+s[j];
         if i=2 then edit2.Text:=edit2.Text+s[j];
         if i=3 then edit3.Text:=edit3.Text+s[j];
         j:=j+1;
       end;
     until not(s[j] in ['0'..'9']);
     j:=j+1;
   end;
end;

Автор: Гость_unregistered 19.1.2005, 02:44
Цитата
есть некая строка символов в Memo, например:
123*456*789 и соответственно три поля Edit.
Как разбить эту строку на три части до звездочек или др.разделителей и поместить это все в разные эдиты?


Можно воспользоваться свойствами Delimiter и DelimitedText класса TStringList.
Код


var lst:TStringList;
begin
  lst:=TStringList.Create;
  lst.delimiter:='*';
  lst.DelimitedText:=memo1.text;

 //дальше оперируем строками этого листа
end;



Автор: Alex 19.1.2005, 02:52
Гость_unregistered вы не хотите зарегистрироваться у нас. Нам нужны знающие люди.

Автор: Marriage 19.1.2005, 17:45
Цитата

Код


var lst:TStringList;
begin
  lst:=TStringList.Create;
  lst.delimiter:='*';
  lst.DelimitedText:=memo1.text;

  //дальше оперируем строками этого листа
end;



В 5-й Дельфе не работает ...
:-(

Автор: Pakshin A. S. 19.1.2005, 20:32
Zero У меня дельфей под рукой нету... smile

Автор: Балбес 19.1.2005, 21:04
Спасибо всем за ответы smile
Буду пробовать smile

Автор: mvdr 19.1.2005, 21:05
Цитата(Zero @ 19.1.2005, 01:09)
А все коды Pakshin A. S. ни у кого никогда не пашут с первого раза, потомучто он их перед отправкой ни когда не проверяет, а мне как всегда тут приходится всё доробатывать за ним, блин.

а зачем давать 100% правильный код?! Пусть человек сам додумывает, так же интереснее, чем когда тебе дают сразу работающий код.
И еще: не надо показывать, что ты "круче" кого-то в программировании. случиться момент, когда код, данный тобой, будет не правильным и уже кому-то другому придется его исправлять.

Автор: Zero 20.1.2005, 00:06
Цитата(Femida @ 19.1.2005, 21:05)
не надо показывать, что ты "круче" кого-то в программировании.
smile smile smile smile smile smile smile smile smile smile smile smile smile smile smile smile smile smile smile

Автор: RA 20.1.2005, 07:10
Ну лично я предпочёлбы парсинг.

Код


function Parse( var S : String; const Separators : String ) : String;
function IndexOfCharsMin( const S, Chars : String ) : Integer;
function IndexOfChar( const S : String; Chr : Char ) : Integer;
var P, F : PChar;
begin
  P := PChar( S );
  F := StrScan( P, Chr );
  Result := -1;
  if F = nil then Exit;
  Result := Integer( F ) - Integer( P ) + 1;
end;
var I, J : Integer;
begin
 Result := -1;
 for I := 1 to Length( Chars ) do
 begin
   J := IndexOfChar( S, Chars[ I ] );
   if J > 0 then
   begin
     if (Result < 0) or (J < Result) then
        Result := J;
   end;
 end;
end;

var Pos : Integer;
begin
 Pos := IndexOfCharsMin( S, Separators );
 if Pos <= 0 then
    Pos := Length( S ) + 1;
 Result := S;
 S := Copy( Result, Pos + 1, MaxInt );
 Result := Copy( Result, 1, Pos - 1 );
end;



procedure TForm1.Button1Click(Sender: TObject);
var S,V:string;
begin
 s:= Edit1.Text;
while s <> '' do
begin
v:= parse(s, '*' );
memo1.Lines.add(v);
end;



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