Автор | Сообщение |
|
| |
Пост N: 93
Зарегистрирован: 08.11.05
|
|
Отправлено: 26.06.06 16:43. Заголовок: Про MemoLine
Стал переводить с Clipper'а под xHarbour приложение и столкнулся с такой занятной вещью: стала пропадать из текстовых строк русская буква "Н". Стал смотреть реализацию данной функции в \RTL\TxtLine.c. Оказалось, что там где идет формирование выходного массива строк стоит удаление символа "8D" : for( lPos = 0; lPos <= lEnd; lPos++ ) { if( pszString[ ulStartOffset + lPos ] == HB_CHAR_HT ) { lSpAdded += uiTabLen - ( (lPos+lSpAdded) % uiTabLen ) - 1; } //26.06.2006 //else if ( pszString[ ulStartOffset + lPos ] == '\x8D' || pszString[ ulStartOffset + lPos ] =HB_CHAR_LF ) else if ( pszString[ ulStartOffset + lPos ] == '\x0D' || pszString[ ulStartOffset + lPos ] == HB_CHAR_LF ) { lSpAdded--; } else { * ( szRet + lPos + lSpAdded ) = * ( pszString + ulStartOffset + lPos ); } } Если изменить условие с "8D" на "0D" то буква "Н" не пропадает. Это так и задумано было или вкралась ошибка?
|
|
|
Ответов - 4
[только новые]
|
|
|
| Администратор
|
Пост N: 219
Зарегистрирован: 23.05.05
|
|
Отправлено: 27.06.06 13:06. Заголовок: Re:
Конечно же это ляпсус Я не знаю как используется этот мягкий перенос строк и зачем он нужен, наверное стоит эту строку переписать так: else if ( ( lPos < lEnd && pszString[ ulStartOffset + lPos ] == HB_CHAR_SOFT1 && pszString[ ulStartOffset + lPos + 1 ] == HB_CHAR_SOFT2 ) || pszString[ ulStartOffset + lPos ] == HB_CHAR_LF )
|
|
|
|
| постоянный участник
|
Пост N: 172
Зарегистрирован: 17.05.05
|
|
Отправлено: 28.06.06 12:06. Заголовок: Re:
Владимир пишет: цитата: | //26.06.2006 //else if ( pszString[ ulStartOffset + lPos ] == '\x8D' || pszString[ ulStartOffset + lPos ] =HB_CHAR_LF ) |
| На мой взгляд, исходя из приведенного куска кода, ошибка кроется в неправильно составленном выражении в условии. То есть нужно проверять, что символ в позиции lPos должен быть символом "мягкого вовзрата каретки" '\x8D', а следующим за ним должен идти символ перевода строки HB_CHAR_LF. То есть комбинация символов '\x8D' + HB_CHAR_LF должна игнорироваться при выделении строки функцией MEMOLINE(). То есть должно быть else if ( ( pszString[ ulStartOffset + lPos ] == '\x8D' && pszString[ ulStartOffset + lPos + 1 ] == HB_CHAR_LF ) || ( pszString[ ulStartOffset + lPos ] == HB_CHAR_LF ) ) lSpAdded--; То есть надо уменьшать lSpAdded на единицу не просто, когда встретится символ '\x8D', а когда встретится комбинация символов '\x8D' + HB_CHAR_LF. В этом случае lSpAdded будет уменьшаться на единицу для '\x8D' и еще раз на единицу для HB_CHAR_LF. Pasha пишет: цитата: | Я не знаю как используется этот мягкий перенос строк и зачем он нужен |
| Мягкий перевод строки используется для форматирования текста, когда размер окна, задаваемого функцией MEMOEDIT() меняется.
|
|
|
|
| постоянный участник
|
Пост N: 173
Зарегистрирован: 17.05.05
|
|
Отправлено: 28.06.06 12:10. Заголовок: Re:
Владимир пишет: цитата: | Если изменить условие с "8D" на "0D" то буква "Н" не пропадает. Это так и задумано было или вкралась ошибка? |
| Буква "Н" не пропадет, но зато будут появляться лишнии буквы "Н", если в исходной строке присутствовали символы "мягкого перевода каретки"! Попробуйте исправить код так, как я выше в предыдушем сообщении указал.
|
|
|
|
| Администратор
|
Пост N: 220
Зарегистрирован: 23.05.05
|
|
Отправлено: 29.06.06 08:51. Заголовок: Re:
Я уже поправил на CVS
|
|
|
|