С Новым годом! Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/11: Рейтинг темы: голосов - 11, средняя оценка - 5.00
13 / 13 / 0
Регистрация: 17.08.2011
Сообщений: 172

Вывод на канву длинного текстового списка в несколько строк

05.11.2014, 08:40. Показов 2327. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день. Пишу вывод на принтер, изображение формирую на канве TImage. С табличными данными и с простыми строками проблем нет, но вот столкнулся с проблемкой - нужно вывести список (несколько десятков фамилий). Ведь когда строка не будет влезать по ширине листа, нужно следующий элемент списка выводить уже с новой строки.

Пока ничего лучшего придумать не могу, чем выводить построчно (с помощью TextOutW), при этом, при добавлении нового элемента строки, измерять длину строки и сравнивать, влезает ли она по ширине страницы. Прежде, чем писать такую функцию, хочу спросить, нет ли более удобных методов (или готовых функций) для вывода текста в несколько строк?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
05.11.2014, 08:40
Ответы с готовыми решениями:

Перенос длинного текста на несколько строк
здравствуйте:) хочу вывести на дивах блоки вида: слева картинка, справа от неё пара блоков текста. Проблема в том, что когда текст не...

Вывод текстового файла в несколько TextBox
есть текстовый файл скажем с 10 строчками текста, и на форме 10 textbox'ов. необходимо вывести каждую строчку в свой текстбокс. 1-ую...

Обработка строк: определиния упорядоченности слов лексикографически, замена букв, поиск и вывод самого длинного слова.
Помогите, пожалуйста решить задачу на C: Дан текст. 1) Определить, упорядочены ли лексикографически слова данного предложения...

10
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33371 / 21497 / 8234
Регистрация: 22.10.2011
Сообщений: 36,893
Записей в блоге: 12
05.11.2014, 10:39
Выводи текст на канву TStaticText (он прекрасно поддерживает переносы слов на новую строку, выставь ему AutoSize в False просто), и потом перерисуй его на TImage:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
    std::auto_ptr<TBitmap>bm(new TBitmap);
    bm->Canvas->Lock();
    __try
    {
        bm->Height = StaticText1->Height;
        bm->Width = StaticText1->Width;
        StaticText1->PaintTo(bm->Canvas->Handle, 0, 0);
    }
    __finally
    {
        bm->Canvas->Unlock();
    }
    Image1->Picture->Assign(bm.get());
2
13 / 13 / 0
Регистрация: 17.08.2011
Сообщений: 172
06.11.2014, 08:14  [ТС]
Текст-то разместил на TStaticText, но никак не могу разобраться как перенести изображение из TStaticText в TImage. Пробовал, например, так:
C++
1
NPForm->StaticText1->PaintTo(NPForm->Image1->Canvas->Handle,10,20);
- только белый прямоугольник рисуется на TImage.
Пробовал использовать пример, предложенный UI, но, сорри, с auto_ptr я не работал, компилятор спотыкается на auto_ptr, а, так же, не понимает bm.get.

Добавлено через 7 минут
Вот, для примера, создал новый проект, разместил на форме TStaticText и TImage, пишу:
C++
1
2
3
4
void __fastcall TForm1::FormCreate(TObject *Sender)
{
    StaticText1->PaintTo(Image1->Canvas,0,0);
}
- рисуется только прямоугольник с фоном TStaticText.
Пробую Image1->Canvas->Handle - вообще ничего не происходит.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33371 / 21497 / 8234
Регистрация: 22.10.2011
Сообщений: 36,893
Записей в блоге: 12
06.11.2014, 09:52
Для того, чтобы компилятор не спотыкался - надо подключить
C++
1
#include <memory>
, или удалять битмап вручную:
C++
1
2
3
TBitmap *bm = new TBitmap;
// тут приведенный выше код безо всяких get()
delete bm;
, просто так отрисовать (без использования доп. битмапа) не получится, действительно будет нарисован только фон...
0
13 / 13 / 0
Регистрация: 17.08.2011
Сообщений: 172
06.11.2014, 10:56  [ТС]
Да, кстати, пробовал тоже создавать и удалять битмап вручную с твоим кодом - никакого эффекта. Вот, смотри, в чистом проекте на форму помещены TStaticText и TImage (TStaticText уже имеет caption по умолчанию). Подключаю
#include <memory>, пишу:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void __fastcall TForm1::FormCreate(TObject *Sender)
{
        std::auto_ptr<TBitmap>bm(new TBitmap);
        bm->Canvas->Lock();
        __try
        {
            bm->Height = StaticText1->Height;
                bm->Width = StaticText1->Width;
                StaticText1->PaintTo(bm->Canvas->Handle, 0, 0);
        }
        __finally
        {
            bm->Canvas->Unlock();
        }
        Image1->Picture->Assign(bm.get());
}
Запускаем, на TImage остаётся чистым.

Добавлено через 42 минуты
Если убрать прозрачность у StaticText и назначить фон, то видно, что
C++
1
Image1->Picture->Assign(bm.get());
копирует только фон.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33371 / 21497 / 8234
Регистрация: 22.10.2011
Сообщений: 36,893
Записей в блоге: 12
06.11.2014, 12:57
Ха. Естественно, если ты это делаешь в FormCreate - ничего не выйдет. Как минимум в OnActivate формы, я вообще проверял по клику на кнопке...
1
13 / 13 / 0
Регистрация: 17.08.2011
Сообщений: 172
06.11.2014, 15:03  [ТС]
Спасибо, по клику работает

Добавлено через 24 минуты
Кстати, если по клику кнопки, то работает и такой вариант, вместо всего этого кода:
C++
1
StaticText1->PaintTo(Image1->Canvas,0,0);
Добавлено через 18 минут
Вот почему у меня в программе не получается, видимо, по той же причине, почему в этом примере не работало в Create, сейчас пытаюсь разобраться. А в своей программе делаю так: есть дополнительный юнит, подключенный к основному юниту, в нём есть функция Nar_Print, которая вызывается по клику кнопки "Печать" основного юнита. В том дополнительном юните есть булевая переменная PrintingDebugging (для того, чтобы при тестировании печати видеть результат на экране). На форме дополнительного юнита есть TImage. И вот функция Nar_Print рисует на TImage, когда надо напечатать очередную страницу я пишу:
C++
1
if (PrintingDebugging) NPForm->ShowModal(); else pImageToPrinter('p');
pImageToPrinter('p') - моя функция. При этом при PrintingDebugging==true отправляется на принтер - работает, проверено, а при PrintingDebugging==false появляется форма, где мы можем видеть TImage (и StaticText) и кнопку "Close", которая закрывает форму
C++
1
NPForm->Close();
Но функция Nar_Print продолжает рисовать очередную страницу. Потом опять
C++
1
if (PrintingDebugging) NPForm->ShowModal(); else pImageToPrinter('p');
И мы видим другую страницу. Но вот когда в этой функции я рисую на канве с помощью данного метода PaintTo почему-то на Image ничего не отображается

Добавлено через 17 минут
Может, этот метод не работает когда компоненты невидимы?
0
74 / 54 / 17
Регистрация: 10.07.2014
Сообщений: 329
06.11.2014, 15:50
Цитата Сообщение от Obert Посмотреть сообщение
В том дополнительном юните есть булевая переменная PrintingDebugging (для того, чтобы при тестировании печати видеть результат на экране)
А если поставить принтер по умолчанию типа "печать в файл" ?
Какой нить "Microsoft XPS Document Writer" ?
И печатать в него... может так проще?
0
13 / 13 / 0
Регистрация: 17.08.2011
Сообщений: 172
06.11.2014, 15:56  [ТС]
Вот оно что. Итак, в том примерчике
C++
1
2
3
4
void __fastcall TForm1::Button1Click(TObject *Sender)
{
        StaticText1->PaintTo(Image1->Canvas,0,0);
}
Работает, даже не нужен предложенный тобой код. Но
C++
1
2
3
4
5
6
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    StaticText1->Visible=false;Image1->Visible=false;
        StaticText1->PaintTo(Image1->Canvas,0,0);
        Image1->Visible=true;
}
Уже не работает - копируется только фон. Попробовал твой код вместо
C++
1
StaticText1->PaintTo(Image1->Canvas,0,0);
- то же самое - с невидимыми компонентами не работает... Выходит, жаль, но не годится этот способ для печати?

Добавлено через 4 минуты
krv, может, и проще в вопросе написания кода, но не намного, но тут нагляднее - сразу видишь результат.
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
06.11.2014, 16:41
Лучший ответ Сообщение было отмечено Obert как решение

Решение

Через Canvas->DrawText() c подбором флагов.
1
13 / 13 / 0
Регистрация: 17.08.2011
Сообщений: 172
06.11.2014, 19:42  [ТС]
Avazart, спасибо, функция DrawText() - то, что нужно.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
06.11.2014, 19:42
Помогаю со студенческими работами здесь

Вывод текста на канву
Как вывести несколько предложений на форму n раз и каждый раз увеличивать шрифт на еденицу?

Написать программу, выводящую на экран несколько строк заданного текстового файла
Задание: Написать программу, выводящую на экран строки с 205 по 215 файла text.txt. Делать нужно сортировкой, по примеру. ...

Из текстового файла, содержащего несколько строк, удалить слова максимальной длины и лишние пробелы
Может кто подскажет как делать, ибо понятие как работать со строками и условиями нету. &quot;Из текстового файла, содержащего...

Вывод строк из текстового файлы
Недавно начал изучать php, пытаюсь вывести строки их файла, через цикл. Почему-то не выводить... Знаю, что есть print_r() и foreach(), с...

Рандомный вывод 4 строк из текстового документа
необходимо рандомно выводить 4 записи из *.txt документа так чтоб эти строки не повторялись, пока вот все что есть. &lt;?php //...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru