Lines->Strings[i] и "\n"
Мне требуется заполнить массив значением первых символов строк RichEdit.
Вопрос в том, как определить позицию первого символа n-й строки.
Привожу свои размышления.
Первый код.
int Pos = 0;
for(int i=0; i<RichEdit->Lines->Count; i++)
{
RichEdit->SelStart = Pos;
MyStruct.Color = RichEdit->SelAttributes->Color;
MyStruct.Alignment = RichEdit->Paragraph->Alignment;
Pos += RichEdit->Lines->Strings.Length();
}
Данный код работает, если текст, загруженный в RichEdit не имеет символов
"n" и "r". А если какая-либо строка заканчивается по Enter (проще говоря),
то к длине, воззвращаемой Length() надо добавлять 2.
Вопрос в том, как узнать был ли перевод строки по "n", или просто строка
не поместилась. Ведь Lines->Strings возвращает строку без "n"!
Пока что решаю проблему так
for(int i=0; i<RichEdit->Lines->Count; i++)
{
RichEdit->SelStart = 1;
CharactText.Color = RichEdit->SelAttributes->Color;
CharactText.Alignment = RichEdit->Paragraph->Alignment;
RichEdit->Lines->Delete(0);
}
Но Delete сильно замедляет скорость, хотя и RichEdit невидимый у меня.
Что посоветуете?
[ Это Сообщение было отредактировано Slon в 2002-10-02 0850 ]
а почему он у тебя невидимый? - может быть тогда проще просто TStringList использовать?
On 2002-10-02 1056, Relax wrote
отключи WordWrap, тогда строки, которые не помещаются не будут переноситься на следующую строку.
Нет. У меня довольно специфическая программа.
В полноэкранном DirectX вывожу текст с крупным шрифтом на экран. Мне нужно отобразить его в том виде, в каком он был при предварит. просмотре. Цвет текста, как и выравнивание одно на каждом абзаце.
Т.е. если строка переходила так ...... Bor
land .....
то и на выводе должно так быть. Цвет и выравнивание должно совпадать.
а почему он у тебя невидимый? - может быть тогда проще просто TStringList использовать?
Я его создаю невидимым и шириной в Screen.
Он мне нужен только для того, чтобы текст, переданный в него принял нужные формы.
И после этого заполняю свой массив данными о строках.
А вообще потом для более быстрого оперирования строками я и использую TStringList.
On 2002-10-02 1303, Relax wrote
что-то я никак в постановку заадчи не въеду . Если я правильно понял - тебе просто нужен крайний левый столбец символов?
Мне нужно знать характеристики (цвет и вырвнивание) всех строк в RichEdit.
Т.к. цвет меняется только от абзаца к абзацу, то в общем-то не обязательно определять исходя из первого символа строки. Подойдет любой символ данной строки. Но я так понимаю, нужно сначала встать в нужную позицию (RichEdit->SelStart = n), а потом определять характеристики того, на чем стою.
Вот мне и нужно получить значение n.
Типа этого
for(int=0; i<RichEdit->Lines->Count; i++)
{
int n = _ПОЗИЦИЯ_ЛЮБОГО_СИМВОЛА_i-той_СТРОКИ_;
RichEdit->SelStart = n;
_ХАРАКТЕРИСТИКА_СТРОКИ_.цвет = RichEdit->SelAttributes->Color;
_ХАРАКТЕРИСТИКА_СТРОКИ_.выравнивание = RichEdit->Paragraph->Alignment;
}
Теперь я не понимаю. А как?
[ Это Сообщение было отредактировано Slon в 2002-10-02 1450 ]
ну я имею ввиду, что если шрифт моноширинный, то при определенной ширине RichEdit в строку входит определенное кол-во символов, например N, тогда если позиция первого символа первой строки = 1, то позиция первого символа второй строки N + 1, третьей строки 2*N + 1 и т.д.
Что это у вас с форумом?
Только ответил и вдруг перестали пускать. Сделал шаг назад. Зашел уже на другой адрес.
А моего сообщения нет. Но вообше то лучше стало.
В общем я писал, что шрифт не моноширинный, и что символов в каждой строке разное кол-во, и что "\n" не имеет ширины.
И что уже нашел способ перейти к i-ой строке RichEdit:
RichEdit->SelStart = RichEdit->Perform(EM_LINEINDEX, i, 0);
:)