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

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

05.11.2014, 08:40. Показов 2356. Ответов 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
33404 / 21514 / 8236
Регистрация: 22.10.2011
Сообщений: 36,914
Записей в блоге: 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
33404 / 21514 / 8236
Регистрация: 22.10.2011
Сообщений: 36,914
Записей в блоге: 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
33404 / 21514 / 8236
Регистрация: 22.10.2011
Сообщений: 36,914
Записей в блоге: 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
8488 / 6155 / 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
Ответ Создать тему
Новые блоги и статьи
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита "ПричинаСписания". . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Программное заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru