Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.10.2016, 09:28   #1
aesoem
Форумчанин
 
Регистрация: 24.12.2007
Сообщений: 288
По умолчанию нужно объединить две строки в tstrings

добрый день, нужна консультация...Что-то вообще догнать не могу...

Есть Tstrings.
Заполняет его clientsocket в связи с этим приходится бороться с разрывами пакетов. При разрыве, чтобы найти это место в блоке ставлю маркер - символы <+>

После завершения передачи, в переменной примерно следующий текст

начало
Цитата:
[next_client]
184.146.149.12:28901996
8
64
NsCpuC
launched...
-o s
<+>tratump x
no_comment
[next_client]
178.127.172.121:16319620
4
64
.......

Нужно удалить символы <+> и объединить строку идущую ДО строки в которой найден маркер разделения:
Цитата:
-o s
и
Цитата:
<+>tratump x

Предположим, нашел я через POS символы <+>,
удаляю от начала 3 символа (полностью <+>) но новый пакет начинается с новой строки.... Как их объединить? Пытался прикрутить Concat, как то не заработало )

Последний раз редактировалось aesoem; 30.10.2016 в 09:30.
aesoem вне форума Ответить с цитированием
Старый 30.10.2016, 09:37   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Перед ними еще два символа нужно удалить #13#10 из Text
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 30.10.2016, 10:28   #3
aesoem
Форумчанин
 
Регистрация: 24.12.2007
Сообщений: 288
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Перед ними еще два символа нужно удалить #13#10 из Text
блин... работает вроде... я же в три часа ночи так уже пытался.. послала меня делфи....спать


спасибо
aesoem вне форума Ответить с цитированием
Старый 30.10.2016, 14:02   #4
aesoem
Форумчанин
 
Регистрация: 24.12.2007
Сообщений: 288
По умолчанию

пришлось еще вводить маркер конца строки "&"

Еще вопрос, как узнать последний символ, предыдущей строки
пробовал так: (вернутся на несколько символов назад)

Код:
       
if pos('<+>',ReciveText.Text)>0 then //найден маркер соединения пакетов, нужно проверить выше ЕСТЬ ЛИ МАРКЕР КОНЦА СТРОКИ &, ЕСЛИ ЕСТЬ  НЕ ИСПОЛЬЗОВАТЬ #13#10

          if str[pos('<+>',ReciveText.Text)-2]<>'&' then  {В ЭТОИ УСЛОВИИ ПРИЧИНА ОШИБКИ ТУТ НУЖНО УЗНАЬТЬ ПОСЛЕДНИЙ СИМВОЛ ПРЕДЫДУЩЕЙ СТРОКИ}
          begin

           ReciveText.Text:=StringReplace( ReciveText.Text,#13#10+'<+>', '', [rfReplaceAll]) ;
          end
           else
          ReciveText.Text:=StringReplace( ReciveText.Text,'<+>', '', [rfReplaceAll]) ;
в теории -1 символ от <+> это начало новой строки и -2 это и есть конец предыдущей строки....

логика хотя бы верна? Если да, то правильно ли я отнимаю -2

Последний раз редактировалось aesoem; 30.10.2016 в 14:06.
aesoem вне форума Ответить с цитированием
Старый 30.10.2016, 14:50   #5
aesoem
Форумчанин
 
Регистрация: 24.12.2007
Сообщений: 288
По умолчанию

Код:
      for I := 1 to ReciveText.Count-1 do
        begin

          str_minus_one:=Recivetext.Strings[i-1];

          if ((pos('<+>',Recivetext.Strings[i])>0) and (str_minus_one[length(str_minus_one) ]<>'&')) then
              Recivetext.Strings[i]:=StringReplace( Recivetext.Strings[i],#13#10+'<+>', '', [rfReplaceAll]);

          if ((pos('<+>',Recivetext.Strings[i])>0) and (str_minus_one[length(str_minus_one) ]='&')) then
              Recivetext.Strings[i]:=StringReplace( Recivetext.Strings[i],'<+>', '', [rfReplaceAll]);

        end;
построчно работать тоже не получается...
Recivetext.Strings[i]:=StringReplac строку виде не удалит
aesoem вне форума Ответить с цитированием
Старый 30.10.2016, 14:55   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Построчно и не получится, в строках нет символов перевода каретки и строки. Они в Text. Последний символ предыдущей -3
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 30.10.2016 в 14:59.
Аватар вне форума Ответить с цитированием
Старый 30.10.2016, 15:17   #7
aesoem
Форумчанин
 
Регистрация: 24.12.2007
Сообщений: 288
По умолчанию

Код:
if pos('<+>',ReciveText.Text)>0 then //найден маркер соединения пакетов, нужно проверить выше ЕСТЬ ЛИ МАРКЕР КОНЦА СТРОКИ &, ЕСЛИ ЕСТЬ  НЕ ИСПОЛЬЗОВАТЬ #13#10

          if str[pos('<+>',ReciveText.Text)-3]<>'&' then  {В ЭТОИ УСЛОВИИ ПРИЧИНА ОШИБКИ ТУТ НУЖНО УЗНАЬТЬ ПОСЛЕДНИЙ СИМВОЛ ПРЕДЫДУЩЕЙ СТРОКИ}
       

           ReciveText.Text:=StringReplace( ReciveText.Text,#13#10+'<+>', '', [rfReplaceAll]) 
    
           else
          ReciveText.Text:=StringReplace( ReciveText.Text,'<+>', '', [rfReplaceAll]) ;
Как только будет найден первый маркер, действие будет применено одно, на все остальные маркеры получается...
В зависимости от того каков будет первый выбор
Код:
 if str[pos('<+>',ReciveText.Text)-3]<>'&' then


Можно например циклично до конца ReciveText.Text запустить проверку и изменять каждый маркер отдельно?
StringReplace получается не подходит?
у него только два параметра ?
rfReplaceAll : Заменяет все вхождения
rfIgnoreCase : игнорирует регистр при поиске

+
понятно, три.... Без параметра тоже считается, то что нужно )

Последний раз редактировалось aesoem; 30.10.2016 в 16:08.
aesoem вне форума Ответить с цитированием
Старый 30.10.2016, 16:14   #8
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

зачем все сначала собирать в Tstrings, ставить какие-то маркеры, потом разворачивать в строку, удалять маркеры, ...
Не проще ли просто сразу собирать в строку (или массив строк).
получая пакет записывать в соответствующий элемент массива строку данных.
когда все получено, просто собрать строку (r:=r+s[0]; r:=r+s[1]; ... r:=r+s[n]; ) и ... все.
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 30.10.2016 в 16:16.
evg_m на форуме Ответить с цитированием
Старый 30.10.2016, 16:30   #9
aesoem
Форумчанин
 
Регистрация: 24.12.2007
Сообщений: 288
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
зачем все сначала собирать в Tstrings, ставить какие-то маркеры, потом разворачивать в строку, удалять маркеры, ...
Не проще ли просто сразу собирать в строку (или массив строк).
получая пакет записывать в соответствующий элемент массива строку данных.
когда все получено, просто собрать строку (r:=r+s[0]; r:=r+s[1]; ... r:=r+s[n]; ) и ... все.
да, красиво... но поздно... Вроде все заработало, а главное правило - не трож технику если работает )
aesoem вне форума Ответить с цитированием
Старый 31.10.2016, 12:06   #10
aesoem
Форумчанин
 
Регистрация: 24.12.2007
Сообщений: 288
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
зачем все сначала собирать в Tstrings, ставить какие-то маркеры, потом разворачивать в строку, удалять маркеры, ...
Не проще ли просто сразу собирать в строку (или массив строк).
получая пакет записывать в соответствующий элемент массива строку данных.
когда все получено, просто собрать строку (r:=r+s[0]; r:=r+s[1]; ... r:=r+s[n]; ) и ... все.
да слишком много вариантов деления пакетов, все условными операторами не перекроешь..
Можно подробнее о данном способе?

я так понял если в переменную типа
string:=string+resivetext писать полученные данные разрывов не будет?
aesoem вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
объединить две таблицы gtr5 SQL, базы данных 1 22.04.2015 15:39
объединить две задачи в одну Анна Седакова Помощь студентам 2 07.07.2014 06:43
Объединить две процедуры в одну AndreiFQ Помощь студентам 5 24.06.2010 09:26
как объединить две программы? kuzmich Общие вопросы Delphi 3 28.10.2009 19:45
Помогите объединить две программы!!!!!!! leest Помощь студентам 3 23.05.2008 17:20