Поиск:

Ответ в темуСоздание новой темы Создание опроса
> печать из Memo 
:(
    Опции темы
artsb
Дата 30.12.2007, 00:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



Пытаюсь распечатать текст из Memo. Пишу так:
Код

   TPrinter* Printer  =  Printers::Printer();
   int height=Memo1->Font->Size;
   Printer->BeginDoc();
   for(int i=0;i<Memo1->Lines->Count;i++)
   {
   Printer->Canvas->TextOutA(10,height*i+5,Memo1->Lines->Strings[i]);
   }
   Printer->EndDoc();

Нажимаю кнопку, принтер оживает, но печатает только первую строку.
Подскажите как правильно распечатать.

И ещё вопрос: как подогнать текст по ширине листа, чтобы не вылазил за поля.


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
artsb
Дата 30.12.2007, 12:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



Сделал так:
Код

   TPrinter* Printer  =  Printers::Printer();
   Printer->Canvas->Font=Memo1->Font;
   int height=Printer->Canvas->TextHeight(Memo1->Lines->Strings[0]);   //высота текста в пикселах
   int top=10;        //текущая позиция по вертикали
   Printer->BeginDoc();
   for(int i=0;i<Memo1->Lines->Count;i++)
   {
   Printer->Canvas->TextOutA(10,top,Memo1->Lines->Strings[i]);
   top+=height;  //вычисляем следующую позицию по вертикали
   }
   Printer->EndDoc();

Всё печатается нормально. И все-таки прошу посмотреть. Может, есть вариант получше, или поприще.

И остаются вопросы:
Как сделать чтобы текст переносился на следующую строку, если не влазиит по ширине?
Если страница закончилась, будет ли текст перенесён на следующую автоматически?


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
artsb
Дата 30.12.2007, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



Цитата(artsb @  30.12.2007,  12:16 Найти цитируемый пост)
Если страница закончилась, будет ли текст перенесён на следующую автоматически? 

Не переносится.
Проблему решил:
Код

   TPrinter* Printer  =  Printers::Printer();
   Printer->Canvas->Font=Memo1->Font;
   int height=Printer->Canvas->TextHeight(Memo1->Lines->Strings[0]);
   int top=10;
   Printer->BeginDoc();
   for(int i=0;i<Memo1->Lines->Count;i++)
   {
   Printer->Canvas->TextOutA(10,top,Memo1->Lines->Strings[i]);
   top+=height;
   if(top>=Printer->PageHeight) {top=10; Printer->NewPage();}
   }
   Printer->EndDoc();

Осталось разобраться с шириной.  smile 



--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
artsb
Дата 30.12.2007, 16:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



Сделал!
Код

   TPrinter* Printer  =  Printers::Printer();
   Printer->Canvas->Font=Memo1->Font;
   int height=Printer->Canvas->TextHeight(Memo1->Lines->Strings[0]);
   int top=10;

   TStringList *memo = new TStringList();
   AnsiString buf="",str,temp="";
   for(int i=0;i<Memo1->Lines->Count;i++)
   {
   memo->Add(Memo1->Lines->Strings[i]);
   }
   for(int i=0;i<memo->Count;i++)
   {
   if(Printer->Canvas->TextWidth(memo->Strings[i])>=Printer->PageWidth)
   {
    str=memo->Strings[i];
    for(int j=1;j<=str.Length();j++)
    {
        if(str[j]==' ')
                {
                 if(Printer->Canvas->TextWidth(temp)>=Printer->PageWidth)
                 {
                 memo->Insert(i,buf);
                 j=str.Length();
                 temp=buf="";
                 memo->Strings[i+1]=StringReplace(memo->Strings[i+1],memo->Strings[i]+" ","",TReplaceFlags() << rfReplaceAll);
                }
                else
                {
                buf=temp;
                temp+=str[j];
                }
                }
        else temp+=str[j];
    }
   }
   }


   Printer->BeginDoc();
   for(int i=0;i<memo->Count;i++)
   {
   Printer->Canvas->TextOutA(10,top,memo->Strings[i]);
   top+=height;
   if(top>=Printer->PageHeight) {top=10; Printer->NewPage();}
   }
   Printer->EndDoc();
   delete memo;

Всё работает! (пока  smile )
Если кому не лень и есть время, протестируйте код, плиз. И отпишитесь потом.

Это сообщение отредактировал(а) artsb - 30.12.2007, 17:29


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
artsb
Дата 3.1.2008, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



Возник вопрос: как можно прервать печать?
Метод Abort() работает только между BeginDoc() и EndDoc(), иначе вылетает ошибка.
Печать начинается только после EndDoc().
Мне нужно прервать печать уже во время печати (чушь какя-то получилась  smile).


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0447 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.