Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.85/40: Рейтинг темы: голосов - 40, средняя оценка - 4.85
0 / 0 / 0
Регистрация: 22.09.2013
Сообщений: 19

Memo. Как удалить символ переноса

19.10.2013, 14:19. Показов 8161. Ответов 39
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Можно ли сделать так, чтобы по таймеру программа проверяла содержимое memo снизу и удаляла все символы переноса до первого значащего символа, а затем этот символ писала в переменную? Заранее спасибо.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
19.10.2013, 14:19
Ответы с готовыми решениями:

Как в Memo удалить определенный символ
Можно ли в Memo удалить определенный символ?

Как удалить один символ из memo?
Паршу вот такую ссылку...

Удалить из строки символ переноса по словам ?
:cry: В ячейке ввели строку при помощи Alt + Enter (переносить по словам). Средствами VBA ну никак не могу избавиться от символа переноса...

39
 Аватар для Kulgar
511 / 196 / 26
Регистрация: 07.08.2013
Сообщений: 814
24.10.2013, 09:43
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Worn Посмотреть сообщение
не всегда одно на строчку. Иногда бывает, что символ переноса оставляет 2 числа, точку, и еще одно число на одной строке, а последнее число переносит на другую строчку. Или оставляет первое число, а все остальное переносит. или оставляет два числа, а точку и числа переносит. Я лишь решил, что считывать пять последних значимых символов с конца, исключая переносы, будет проще. Возможно, был неправ.
Что мешает сделать "простой" парсер?
На сколько я понял между числами есть конкретный разделитель. Брать символы от 1го разделителя до 2го второго разделителя (хоть с конца хоть с начала), пропуская нетерминальные символы, и записывать в строковую переменную. После просто преобразование.

Ещё вопрос по характеру "возникновения" этих данных в мемо. Нельзя ли на входе нормально компоновать число? без нетерминальных символов между цифрами?
0
0 / 0 / 0
Регистрация: 22.09.2013
Сообщений: 19
27.10.2013, 19:50  [ТС]
Цитата Сообщение от Kulgar Посмотреть сообщение
Что мешает сделать "простой" парсер?
На сколько я понял между числами есть конкретный разделитель. Брать символы от 1го разделителя до 2го второго разделителя (хоть с конца хоть с начала), пропуская нетерминальные символы, и записывать в строковую переменную. После просто преобразование.

Ещё вопрос по характеру "возникновения" этих данных в мемо. Нельзя ли на входе нормально компоновать число? без нетерминальных символов между цифрами?
На вход идут данные с контроллера. Не знаю почему, но данные идут именно такими "рывками"
Насчет парсера. Как парсить текст в мемо, да еще и с конца? И как программа будет отличать один разделитель от другого, если разделители одинаковые?

P.S: Прикрутил еще один таймер, который каждые 10 мс убирает символы переноса:
C++
1
2
3
4
void __fastcall TForm1::Timer2Timer(TObject *Sender)
{
    Memo1->Text = StringReplace( Memo1->Text, "\r\n", "", TReplaceFlags( ) << rfReplaceAll );
}
В итоге в Мемо получаются нормальные числа вида 21.19(разделитель)21.20(разделитель) и т.д.
Пытаюсь забить это дело в мемо:
C++
1
y=Memo1->Text.SubString(Memo1->Text.Length()-5,5).ToDouble();
Y типа Double. Но при запуске программы появляется ошибка:
' ' is not a valid floating point value.

Пытался в y забивать последние 5 значимых символов и так:
C++
1
2
for (i = Memo1->Text->Length()-1; i >= Memo1->Text->Length()-6; i--){
y+= Memo1->Text[Memo1->Text->Length() -1-(i-(i-Memo1->Text->Length()-6))];
Но появлялась ошибка: [C++ Error] Unit1.cpp(494): E2288 Pointer to structure required on left side of -> or ->*
0
 Аватар для Kulgar
511 / 196 / 26
Регистрация: 07.08.2013
Сообщений: 814
28.10.2013, 10:01
Цитата Сообщение от Worn Посмотреть сообщение
На вход идут данные с контроллера.
Дык если данные идут с внешнего устройства, то обязательно на физическом уровне должен присутствовать разделитель между сообщениями. Смотрите спецификации оборудования.

Цитата Сообщение от Worn Посмотреть сообщение
Не знаю почему, но данные идут именно такими "рывками"
На фрагментацию сообщений влияет скорость работы порта. Можно попробовать подобрать подходящую скорость методом тыка. Однако, гарантии работы устройства без сброса настроек сложно добиться. Посему логичнее писать обработчик на всевозможные ситуации с упором на дефолт.

Цитата Сообщение от Worn Посмотреть сообщение
Как парсить текст в мемо, да еще и с конца?
Вот тут у меня самый большой вопрос: зачем мемо?! Данные, скорее всего, идут побайтно. Не проще ли сделать буфер вроде?
C++
1
queue <unsigned char> InputBuffer;
Цитата Сообщение от Worn Посмотреть сообщение
Прикрутил еще один таймер, который каждые 10 мс убирает символы переноса
И всё же я предлагаю парсить данные сразу при получении.

Мемо использовать только для визуализации.
1
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
28.10.2013, 10:57
Хорошие вопросы. Полагаю, они прольют свет на то, откуда переносы вообще берутся.

Цитата Сообщение от Worn Посмотреть сообщение
Пытаюсь забить это дело в мемо:
C++
1
y=Memo1->Text.SubString(Memo1->Text.Length()-5,5).ToDouble();
Y типа Double. Но при запуске программы появляется ошибка:
' ' is not a valid floating point value.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    String s( "" );
    try
    {
        int length( Memo1->Text.Length( ) );
        if( length > 5 )
        {
            s = Memo1->Text.SubString( length - 5, 5 );
            y = s.ToDouble( );
        }
    }
    catch ( EConvertError & e )
    {
        ShowMessage( "Строка " + s + " не конвертируется в число.\n\nОшибка:\n" + e.Message );
    }
Цитата Сообщение от Worn Посмотреть сообщение
Пытался в y забивать последние 5 значимых символов и так:
C++
1
2
for (i = Memo1->Text->Length()-1; i >= Memo1->Text->Length()-6; i--){
y+= Memo1->Text[Memo1->Text->Length() -1-(i-(i-Memo1->Text->Length()-6))];
Но появлялась ошибка: [C++ Error] Unit1.cpp(494): E2288 Pointer to structure required on left side of -> or ->*
Корень ошибки здесь: Memo1->Text.Length()
Но в целом код - нонсенс. Что ты пытаешься приплюсовывать к переменной типа double? И, главно, зачем...
0
0 / 0 / 0
Регистрация: 22.09.2013
Сообщений: 19
29.10.2013, 20:53  [ТС]
Цитата Сообщение от BRcr Посмотреть сообщение
Корень ошибки здесь: Memo1->Text.Length()
А с точкой вот такая ошибка:
Access violation at address 40009720 in module 'rtl60.bpl'. Read of address 99D42603

Добавлено через 12 минут
Цитата Сообщение от Kulgar Посмотреть сообщение

На фрагментацию сообщений влияет скорость работы порта. Можно попробовать подобрать подходящую скорость методом тыка. Однако, гарантии работы устройства без сброса настроек сложно добиться. Посему логичнее писать обработчик на всевозможные ситуации с упором на дефолт.
Скорость ТОЧНО 9600. Такая же стоит и в настройках программы.
0
 Аватар для Kulgar
511 / 196 / 26
Регистрация: 07.08.2013
Сообщений: 814
30.10.2013, 09:55
Цитата Сообщение от Worn Посмотреть сообщение
Скорость ТОЧНО 9600. Такая же стоит и в настройках программы.
Про скорость я говорил как возможный фактор.
У Вас должна быть какая-нить функция DataReceived, где принимаются данные с контроллера. Выложите её.
0
0 / 0 / 0
Регистрация: 22.09.2013
Сообщений: 19
30.10.2013, 15:18  [ТС]
C++
1
2
3
#define BUFSIZE 255     
 
unsigned char bufrd[BUFSIZE], bufwr[BUFSIZE];
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
void __fastcall ReadThread::Execute()
{
 COMSTAT comstat;       
 DWORD btr, temp, mask, signal; 
 
 overlapped.hEvent = CreateEvent(NULL, true, true, NULL);   
 SetCommMask(COMport, EV_RXCHAR);                               
 while(!Terminated)                     
  {
   WaitCommEvent(COMport, &mask, &overlapped);                  
   signal = WaitForSingleObject(overlapped.hEvent, INFINITE);   
   if(signal == WAIT_OBJECT_0)                      
    {
     if(GetOverlappedResult(COMport, &overlapped, &temp, true)) 
      if((mask & EV_RXCHAR)!=0)                 
       {
        ClearCommError(COMport, &temp, &comstat);       
        btr = comstat.cbInQue;                              
        if(btr)                                     
        {
         ReadFile(COMport, bufrd, btr, &temp, &overlapped);   
         counter+=btr;                                          
         Synchronize(Printing);                             
        }
       }
    }
  }
 CloseHandle(overlapped.hEvent);        
}
Оно?
0
 Аватар для Kulgar
511 / 196 / 26
Регистрация: 07.08.2013
Сообщений: 814
30.10.2013, 15:51
Цитата Сообщение от Worn Посмотреть сообщение
ReadFile(COMport, bufrd, btr, &temp, &overlapped);
Так Вы же из файла читаете.
Откуда туда данные попадают?
0
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
30.10.2013, 16:39
Kulgar, это не из файла; вернее файл в данном случае - ком-порт, а данные туда попадают с периферии, естественно... .
0
0 / 0 / 0
Регистрация: 22.09.2013
Сообщений: 19
10.11.2013, 19:10  [ТС]
Косяк был в том, что вместо запятой разделителем точка была.
Но все равно, когда программа берет температуру 525,5, это ненормально, ибо датчик лежит в комнате.
Можно ли добавить проверку символа? То есть если последние с конца символы не цифра-цифра-запятая-цифра-цифра, то не брать значение, а отложить на, например, 100 мс?
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
10.11.2013, 19:32
Можно. Берем эти пять символов и анализируем их посимвольно или с помощью regex на соответствие формату. Если проходит, то обрабатываем их, если нет - ничего не делаем.
0
0 / 0 / 0
Регистрация: 22.09.2013
Сообщений: 19
10.11.2013, 20:19  [ТС]
А как именно проводить этот посимвольный анализ?
0
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
10.11.2013, 22:00
AnsiString STROKA = Memo1->Lines->Strings[2]; // 0-1-2 3-я строка списка Memo
char SYMBOL = STROKA[1]; // начальный символ строки (отсчет с 1, а не с 0)
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
11.11.2013, 11:09
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    String s( "" ); 
    int length( Memo1->Text.Length( ) );
    
    if( length > 5 )
    {
        s = Memo1->Text.SubString( length - 5, 5 );
        
        using namespace std;
        if( ( ! isdigit( s[1] ) ) || 
            ( ! isdigit( s[2] ) ) || 
            ( s[3] != ',' ) ||
            ( ! isdigit( s[4] ) ) || 
            ( ! isdigit( s[5] ) ) ) 
        {
            return;
        }
        y = s.ToDouble( );
    }
1
0 / 0 / 0
Регистрация: 22.09.2013
Сообщений: 19
11.11.2013, 19:31  [ТС]
Без Return'а он чаще берет ту температуру, которая нужна.
А просто забивать в переменную по таймеру последние пять символов, средним (третьим то бишь) из которых является "," можно?

Добавлено через 8 минут
Хотя нет, вру, без return'а он печатает те же 500+ градусов.

Добавлено через 56 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
if( length > 5 )
    {
        s = Memo1->Text.SubString( length - 5, 5 );
 
        using namespace std;
        if( ( ! isdigit( s[1] ) ) ||
            ( ! isdigit( s[2] ) ) ||
            ( s[3] != ',' ) ||
            ( ! isdigit( s[4] ) ) ||
            ( ! isdigit( s[5] ) ) )
             s = Memo1->Text.SubString( length - 6, 5 );
          if( ( ! isdigit( s[1] ) ) ||
            ( ! isdigit( s[2] ) ) ||
            ( s[3] != ',' ) ||
            ( ! isdigit( s[4] ) ) ||
            ( ! isdigit( s[5] ) ) )
            s = Memo1->Text.SubString( length - 7, 5 );
          if( ( ! isdigit( s[1] ) ) ||
            ( ! isdigit( s[2] ) ) ||
            ( s[3] != ',' ) ||
            ( ! isdigit( s[4] ) ) ||
            ( ! isdigit( s[5] ) ) )
            s = Memo1->Text.SubString( length - 8, 5 );
       y = s.ToDouble( );
    }
Решил сделать такой цикл. То есть, если третьим символом в S является не запятая, то идет сдвиг на +1 с конца. Но в y теперь почему-то пишется переменная, у которой запятая- не третий знак, а второй.
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
11.11.2013, 19:56
Гм... если формат незыблем, есть смысл просто искать запятую и брать число, как два знака перед и после нее.
0
0 / 0 / 0
Регистрация: 22.09.2013
Сообщений: 19
12.11.2013, 17:41  [ТС]
Цитата Сообщение от BRcr Посмотреть сообщение
брать число, как два знака перед и после нее.
А как это сделать?
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
12.11.2013, 18:02
Пункт раз. Искать в мемо с конца запятую.
Пункт два-с. Зная индекс запятой, взять пять знаков - два перед запятой, ее саму и два после запятой.
Пункт три-с. Сконвертировать строку в число.
Пункт четыре-с. Радоваться содеянному.
0
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
13.11.2013, 12:39
Цитата Сообщение от BRcr Посмотреть сообщение
Пункт раз. Искать в мемо с конца запятую.
Пункт два-с. Зная индекс запятой, взять пять знаков - два перед запятой, ее саму и два после запятой.
Пункт три-с. Сконвертировать строку в число.
Пункт четыре-с. Радоваться содеянному.
C++
1
2
3
4
5
6
7
8
9
10
void __fastcall TForm1::Button1Click(TObject *Sender)
{
char zpt = ',';
float temp;
for( int i=0; i<Memo1->Lines->Count; i++ )
  for( int pos=Memo1->Lines->Strings[i].Length(); pos>0 ; pos-- )
    if( Memo1->Lines->Strings[i].IsDelimiter( zpt, pos ) )
      if( TryStrToFloat( Memo1->Lines->Strings[i].SubString( pos-2, pos+2 ), temp ) )
        Memo2->Lines->Add( temp );
}
Изображения
 
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
13.11.2013, 19:21
И где последний пункт, спрашивается?!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
13.11.2013, 19:21

Символ переноса в Excel (Как заменить символ на перенос строки)
Решил подсобить всем кто будет гуглить: Как заменить символ на перенос строки в Excel (ALT+Enter). Проблема в том, что когда речь заходит...

Как в переменную добавить символ переноса строки?
Здравствуйте. Подскажите, пожалуйста, как сделать так, чтобы в переменную str1 добавлялись значения %%a и перенос строки? Сейчас делаю...

Символ переноса на другую строчку или символ enter
Здравствуйте. Имеем: Текстовый документ, в нем строчки, в каждой строчке по одному слову. Цель: Сделать так что бы слова были...

Символ переноса строки появляется как пробел. Как обойти?
Между пунктами меню появляется пробел. Но если написать всё в одну строку то всё становится нормально. Как это обойти? Код: ...

Как писать символ переноса строки в зависимости от OS сервера?
Как я понимаю, на сервере с разными ОС - и разные символы переноса строки. Под виндой - \r\n, под линуксом - просто \n, где-то ещё - просто...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Особенности gif сгенерированных в Си
russiannick 21.10.2026
Рассмотрим генерацию gif файлов, которые в Си имеют свои особенности. Gif представляет собой графический формат популярный в интернете. Посмотрим на палитру. Gif файл сгенерированный в си отличается. . .
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/ TL DR Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru