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)
?
|
|