C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
RichEdit, Можно ли....
SmAlex
Отправлено: 06.12.2005, 16:52


Станционный диспетчер

Группа: Участник
Сообщений: 91



Можно ли (и как? если можно) в RichEdit ->Lines добавить нужный символ (или строку) — в нужную строку и на нужное место?

Если добавить просто следующую строчку — пишу так:

RichEdit1->Lines->Add(Label2->Caption);

Всё получается как надо. Но: задача стоить добавить ещё в какую-то строчку, скажем с номером N, ещё что-то (скажем Label3->Caption)
причём не просто в строчку — а на нужную позицию ( скажем, отступив 10 символов от окончания стороки ). Как это сделать?
** Harold
Отправлено: 06.12.2005, 18:52


Не зарегистрирован







1. Прочесть строку N в переменную типа AnsiString, например S.
2. Записать в строку N = S+"_10пробелов_"+ВашаДобавляемаяСтрока;
SmAlex
Отправлено: 07.12.2005, 09:28


Станционный диспетчер

Группа: Участник
Сообщений: 91



Есть ещё вопрос (примерно по этой теме) — Как посчитать число символов в строке?

Думаю, что можно так:  — найти с помощью Pos() окончание строки....

Фрагмент кода:

AnsiString S2,S4;
//--------------------------

S4=Label1->Caption; //Нужная строка
S2="\0"; //Признак окончания строки....????
int i=S4.Pos(S2);

Memo4->Lines->Add(AnsiString(i-1));

Но — НЕ ИЩЕТ... Всё перепробовал:

S2="\0"; S2="0"; S2="";

Ничего не помогает... Кто знает — ответьте, пожалуйста...
Guest
Отправлено: 07.12.2005, 10:21


Не зарегистрирован







Если вы работаете с AnsiString то
AnsiString::Length
int __fastcall Length() const;
Length returns the number of bytes in this AnsiString.

если на "чмстом" C++ можно
strlen

PS.
Умение пользоваться Help'ом способствует сокращению времени написания кода и увеличивает объем собственных знаний.
SmAlex
Отправлено: 07.12.2005, 10:30


Станционный диспетчер

Группа: Участник
Сообщений: 91



А через Pos — нельзя никак? просто интересно....
SmAlex
  Отправлено: 07.12.2005, 11:02


Станционный диспетчер

Группа: Участник
Сообщений: 91



Да, действительно, следующий код прекрасно работаtnЖ

int j= AnsiString(S4).Length();

Спасибо за подсказку!

PS: А всё таки интересно — как можно при помощи Pos это сделать...
Guest
Отправлено: 07.12.2005, 12:36


Не зарегистрирован







"Как найти в темной комнате черную кошку, особенно если её там нет". Да ни как.
Pos ищет подстроку внутри строки. А вы задаете для поиска пустую строку.
Если есть желание поработать руками то можете написать, например, цикл типа for (char* cp=str.c_ctr(); *cp; cp++) len++;.
SmAlex
  Отправлено: 07.12.2005, 13:24


Станционный диспетчер

Группа: Участник
Сообщений: 91



Огромное спасибо за умный, а главное — ПОУЧИТЕЛЬНЫЙ ОТВЕТ= ВОТ БЕЗ ПРИМЕРА ПРО ЧЁРНУЮ КОШКУ = я бы вообще нифига не понял...
А так — всё как на ладони= чёрная, млин, кошка — опять же комната вся чёрная...
Guest
Отправлено: 07.12.2005, 14:13


Не зарегистрирован







Да не обижайтесь вы. Вы ведь спрашиваете как найти конец строки внутри строки, а внутри строки символа конца строки быть не может по определению.

>А так — всё как на ладони= чёрная, млин, кошка — опять же комната вся чёрная...
А в главное то, что её там нет.
SmAlex
Отправлено: 07.12.2005, 14:42


Станционный диспетчер

Группа: Участник
Сообщений: 91



Прошу прощения — я СОВЕРШЕННО НЕ ОБИДЕЛСЯ...


Беда то вся в том, что такой код НЕ СЧИТАЕТ ПРОБЕЛЫ между словами в строке:

int j= AnsiString(S4).Length();

И как я понял — значение j равно количеству символов в строке , НЕ СЧИТАЯ ПРОБЕЛОВ МЕЖДУ СЛОВАМИ....

А мне нужно в процессе выполенения программы определить — сколько "
вся строка в длину на листе бумаги" места занимает- чтобы потом справа РОВНЫМ СТОЛБИКОМ приписать некоторые значения напротив каждой строки....
А поскольку строк много и ВСЕ строки разной длины и содержат неодинаковое количество слов (а следовательно ПРОБЕЛОВ!!!) -
я и не могу решить эту задачу

Отредактировано SmAlex — 07/12/2005, 14:43
avc*
Отправлено: 07.12.2005, 15:00


Не зарегистрирован







>Беда то вся в том, что такой код НЕ СЧИТАЕТ ПРОБЕЛЫ между словами в строке:

Вы заблуждаетесь (можете посчитать вручную). Такой код считает число байтов в строке.
А ваша проблема в том, что вы используете не моноширинный шрифт у которого физическая ширина ' ' и например 'W' сильно отличаются. Эта проблема имеет следующие пути решения
1. Использовать моноширинный фонт (например любой Courier)
2. В терминах канвы принтера определять печатную длину строки (например в дюймах) и задавать соответствующее выравнивание.
3. Расставить табулостопы и выравнивать колонки по ним.

С моей точки зрения 1-й вариант предпочтительней так как намного проще реализуем.
SmAlex
Отправлено: 07.12.2005, 15:04


Станционный диспетчер

Группа: Участник
Сообщений: 91



Да, я понял свою ошибку ....

ВСЕМ БОЛЬШОЕ СПАСИБО!!!!
Grigoriy
Отправлено: 07.12.2005, 18:36


Мастер участка

Группа: Участник
Сообщений: 381



QUOTE (avc* @ 07/12/2005, 15:00)
Эта проблема имеет следующие пути решения
1. Использовать моноширинный фонт (например любой Courier)
2. В терминах канвы принтера определять печатную длину строки (например в дюймах) и задавать соответствующее выравнивание.
3. Расставить табулостопы и выравнивать колонки по ним.

С моей точки зрения 1-й вариант предпочтительней так как намного проще реализуем.

А может проще всего и разумнее использовать функцию канвы

int Canvas->TextWidth(AnsiString)

?

Вернуться в Вопросы программирования в C++Builder