On-line: Dr. Oldwarez, PSP, tnsr2, гостей 1. Всего: 4 [подробнее..]
АвторСообщение





Пост 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" то буква "Н" не пропадает.
Это так и задумано было или вкралась ошибка?


Спасибо: 0 
Профиль
Ответов - 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 )


Спасибо: 0 
Профиль
постоянный участник


Пост 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() меняется.


Спасибо: 0 
Профиль
постоянный участник


Пост N: 173
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 28.06.06 12:10. Заголовок: Re:


Владимир пишет:

 цитата:
Если изменить условие с "8D" на "0D" то буква "Н" не пропадает.
Это так и задумано было или вкралась ошибка?



Буква "Н" не пропадет, но зато будут появляться лишнии буквы "Н", если в исходной строке присутствовали символы "мягкого перевода каретки"!
Попробуйте исправить код так, как я выше в предыдушем сообщении указал.

Спасибо: 0 
Профиль
Администратор




Пост N: 220
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 29.06.06 08:51. Заголовок: Re:


Я уже поправил на CVS

Спасибо: 0 
Профиль
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 169
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет