Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Синтаксис
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 11.12.2012, 15:18
bambooshoot bambooshoot вне форума
Прохожий
 
Регистрация: 20.03.2011
Сообщения: 30
Репутация: 10
По умолчанию Разделение строки на отдельные символы

Всем привет!
Вопрос для повышения квалификации Делаю следующее:
Дана строка в Edit1:"Сталь20; круг Ш50x250 - 2 заг."
Перегоняю ее в StringGrid следующей процедурой
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  T, T1: TStringList;
  I,a, j: Integer;
  k, b:string;
begin
  T :=TStringList.Create;
  T1:=TStringList.Create;
  try
    T.Delimiter := ' ';
    T.DelimitedText := Edit1.Text;
    for I := 0 to T.Count - 1 do
          StringGrid1.Cells[0,0]:= T[0];
        StringGrid1.Cells[1,0]:= T[1];
         StringGrid1.Cells[2,0]:=T[2];
          StringGrid1.Cells[4,0]:= T[4];
           k:=StringGrid1.Cells[2,0];
           a:=Length(k);
            for a:=1 to a do
            begin
               b:= #$00D8;
               j:=pos(b,k);
                Delete(k,j,1);
                 StringGrid1.Cells[2,0]:=k;
            end;
         T1.Delimiter := 'x';
    T1.DelimitedText :=StringGrid1.Cells[2,0] ;
    for I := 0 to T1.Count - 1 do
          StringGrid1.Cells[2,0]:= T1[0];
        StringGrid1.Cells[3,0]:= T1[1];

  finally
    T.Free;
    T1.Free;
  end;
end;
Как мне кажется два StringList - перебор. Профессионалы подскажите новичку, как сделать лучше или проще. Заранее благодарен.
Ответить с цитированием
  #2  
Старый 11.12.2012, 15:31
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от bambooshoot
Дана строка в Edit1:"Сталь20; круг Ш50x250 - 2 заг."
Перегоняю ее в StringGrid следующей процедурой
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  T, T1: TStringList;
  I,a, j: Integer;
  k, b:string;
begin
  T :=TStringList.Create;
  T1:=TStringList.Create;
  try
    T.Delimiter := ' ';
    T.DelimitedText := Edit1.Text;
    for I := 0 to T.Count - 1 do
          StringGrid1.Cells[0,0]:= T[0];
        StringGrid1.Cells[1,0]:= T[1];
         StringGrid1.Cells[2,0]:=T[2];
          StringGrid1.Cells[4,0]:= T[4];
           k:=StringGrid1.Cells[2,0];
           a:=Length(k);
            for a:=1 to a do
            begin
               b:= #$00D8;
               j:=pos(b,k);
                Delete(k,j,1);
                 StringGrid1.Cells[2,0]:=k;
            end;
         T1.Delimiter := 'x';
    T1.DelimitedText :=StringGrid1.Cells[2,0] ;
    for I := 0 to T1.Count - 1 do
          StringGrid1.Cells[2,0]:= T1[0];
        StringGrid1.Cells[3,0]:= T1[1];

  finally
.....
Как мне кажется два StringList - перебор.
Правильно кажется. Я тоже не пойму зачем нужен T1 если можно обойтись единственным T.
А ещё я не пойму зачем тут вообще нужны циклы? Они же здесь не делают никакой полезной работы.
Ответить с цитированием
Этот пользователь сказал Спасибо poli-smen за это полезное сообщение:
bambooshoot (11.12.2012)
  #3  
Старый 11.12.2012, 21:11
bambooshoot bambooshoot вне форума
Прохожий
 
Регистрация: 20.03.2011
Сообщения: 30
Репутация: 10
По умолчанию

Цитата:
Сообщение от poli-smen
Правильно кажется. Я тоже не пойму зачем нужен T1 если можно обойтись единственным T.
А ещё я не пойму зачем тут вообще нужны циклы? Они же здесь не делают никакой полезной работы.
Спасибо. Действительно наворотил лишнего. Упростил и переписал, получился следующий рабочий код:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  T: TStringList;
  i, j: Integer;
  k, b:string;
begin
  T :=TStringList.Create;
  try
    T.Delimiter := ' ';
    T.DelimitedText := Edit1.Text;
          StringGrid1.Cells[0,0]:= T[0];
        StringGrid1.Cells[1,0]:= T[1];
         StringGrid1.Cells[2,0]:=T[2];
          StringGrid1.Cells[4,0]:= T[4];
           k:=StringGrid1.Cells[2,0];
           i:=Length(k);
            for i:=1 to i do
            begin
               b:= #$00D8;
               j:=pos(b,k);
                Delete(k,j,1);
                 StringGrid1.Cells[2,0]:=k;
            end;
         T.Delimiter := 'x';
    T.DelimitedText :=StringGrid1.Cells[2,0] ;
          StringGrid1.Cells[2,0]:= T[0];
        StringGrid1.Cells[3,0]:= T[1];
  finally
    T.Free;
  end;
end;
Может быть есть еще варианты по упрощению и сокращению. Хорошо, когда есть кто-то, кто посмотрит со стороны "свежим" взглядом
Ответить с цитированием
  #4  
Старый 12.12.2012, 07:16
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Этот кусок кода с единственно оставшимся циклом (и единственным который выполнял полезную работу ):
Цитата:
Сообщение от bambooshoot
Код:
           k:=StringGrid1.Cells[2,0];
           i:=Length(k);
            for i:=1 to i do
            begin
               b:= #$00D8;
               j:=pos(b,k);
                Delete(k,j,1); // Если pos не найдёт подстроку, то j будет равно 0. Зачем пытаться удалять несуществующий символ?
                 StringGrid1.Cells[2,0]:=k; // Это присвоение выполнится столько раз, сколько символов в исходной строке. Зачем?
            end;
Лучше переделать примерно так:
Код:
k := StringGrid1.Cells[2, 0];
for i := Length(k) downto 1 do
begin
  if k[i] = #$D8 then Delete(k, i, 1);
end;
StringGrid1.Cells[2, 0] := k;
p.s. begin и end в этом коде приведены только для лучшей читабельности и в общем то здесь не нужны.
Ответить с цитированием
Этот пользователь сказал Спасибо poli-smen за это полезное сообщение:
bambooshoot (12.12.2012)
  #5  
Старый 12.12.2012, 11:11
bambooshoot bambooshoot вне форума
Прохожий
 
Регистрация: 20.03.2011
Сообщения: 30
Репутация: 10
По умолчанию

Красота! Я наверное вас не удивлю, если скажу, что и работает код на отлично Спасибо! Приятно было пообщаться и выслушать совет. Вот то, что мы имеем на выходе:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  T: TStringList;
  i, j: Integer;
  k, b:string;
begin
  T :=TStringList.Create;
  try
    T.Delimiter := ' ';
    T.DelimitedText := Edit1.Text;
          StringGrid1.Cells[0,0]:= T[0];
        StringGrid1.Cells[1,0]:= T[1];
         StringGrid1.Cells[2,0]:=T[2];
          StringGrid1.Cells[4,0]:= T[4];
           k:=StringGrid1.Cells[2,0];
          for i := Length(k) downto 1 do
              if k[i] = #$00D8 then Delete(k, i, 1);
                 StringGrid1.Cells[2,0]:=k;
            end;
         T.Delimiter := 'x';
    T.DelimitedText :=StringGrid1.Cells[2,0] ;
          StringGrid1.Cells[2,0]:= T[0];
        StringGrid1.Cells[3,0]:= T[1];
  finally
    T.Free;
  end;
end;
Удачи всем!
Ответить с цитированием
Этот пользователь сказал Спасибо bambooshoot за это полезное сообщение:
Speech (14.12.2012)
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 12:48.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter