1214 / 708 / 335
Регистрация: 22.02.2018
Сообщений: 2,085
Записей в блоге: 2
1

Ошибка печати

06.09.2024, 02:09. Показов 1169. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток! Есть такой код, который должен печатать картинку
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
void __fastcall TfMap::tbPrintClick(TObject *Sender)
{
    TGraphic *gSS   = new Graphics::TBitmap;
 
     TPrinter *prt = Printer();
     TRect destRect;
 
     prt->Orientation = poLandscape;  //данная строка вызывает непонятное поведение
 
      gSS = wMap->ScreenShot(itBitmap); //получаем картинку в Bitmap
 
          destRect = Rect(0, 0, prt->PageWidth, prt->PageHeight); //подстройка под альбомную печать
 
          prt->BeginDoc();
 
           prt->Canvas->StretchDraw(destRect, gSS);
 
          prt->EndDoc();
 
    delete gSS;
 
    prt->Free();
}
Если убрать
C++
1
 prt->Orientation = poLandscape;
, то картинка выводится на принтер, но в книжной ориентации. При установке данной строки печать не происходит, в очереди печати пусто, но при повторном вызове вылетает ошибка "Printing in progress". В чем может быть дело? Среда RAD 10.3, Windows 10.

Добавлено через 22 минуты
При замене
C++
1
prt->Canvas->StretchDraw(destRect, gSS);
на
C++
1
prt->Canvas->Draw(0, 0, gSS);
картинка выводится в обоих ориентациях страницы, но не растягивается на страницу.

Добавлено через 11 минут
Попробовал вот такой костыль
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
void __fastcall TfMap::tbPrintClick(TObject *Sender)
{
    TGraphic *gSS   = new Graphics::TBitmap;
    TPicture *gST   = new TPicture;
 
     TPrinter *prt = Printer();
     TRect destRect;
 
     prt->Orientation = poLandscape;
 
      gSS = wMap->ScreenShot(itBitmap);
 
          destRect = Rect(0, 0, prt->PageWidth, prt->PageHeight);  //gSS->Height, gSS->Width);
 
       gST->Bitmap->Height = prt->PageWidth;
       gST->Bitmap->Width  = prt->PageHeight;
 
        gST->Bitmap->Canvas->StretchDraw(destRect, gSS);
 
          prt->BeginDoc();
 
           //prt->Canvas->StretchDraw(destRect, gSS);
           prt->Canvas->Draw(0, 0, gST->Bitmap);
 
          prt->EndDoc();
 
    delete gST;
    delete gSS;
 
   //   prt->Free();
}

Поставил бряки на prt->BeginDoc()/EndDoc() - документ ставится в очередь печати, даже размер похож, но сама печать не происходит.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.09.2024, 02:09
Ответы с готовыми решениями:

При печати выходит ошибка печати принтера, помогает только перезапуск диспетчера печати
Win 11 оригинальный образ Canon i-SENSYS MF3010, часто при печати выходит ошибка печати принтера,...

Обрезание текста и отключение границ при печати(ошибка во время печати)
Есть несколько excel документов с заголовками и таблицей. Есть 2 проблемы, при переходе в режим...

МФУ Canon mf4730, при печати - ошибка печати
Купили новый принтер, в связи с этим некоторый переезд принтеров произошел. Со всеми порядок, кроме...

Диспетчер печати Windows 7 (Ошибка печати)
Доброго времени всем. Ищу помощи. Проблема заключается в том, пк отказывается печатать на любой...

4
1214 / 708 / 335
Регистрация: 22.02.2018
Сообщений: 2,085
Записей в блоге: 2
11.09.2024, 06:00  [ТС] 2
Попробовал натянуть сову на глобус другой стороной
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
void __fastcall TfMap::tbPrintClick(TObject *Sender)
{
      TPicture *gSS = new TPicture();
 
     TPrinter *prt = Printer();
     TRect destRect;
 
          prt->Title = "Map";
          prt->Orientation = poLandscape;
 
          gSS->Bitmap->Height = prt->PageHeight;
          gSS->Bitmap->Width  = prt->PageWidth;
 
          destRect = Rect(0, 0, prt->PageWidth, prt->PageHeight);
          gSS->Bitmap->Canvas->StretchDraw(destRect, wMap->ScreenShot(itBitmap));
 
          prt->BeginDoc();
            prt->Canvas->Draw(0, 0, gSS->Bitmap);
          prt->EndDoc();
 
    delete prt;
    delete gSS;
}

на PDF принтер картинку выводит, все ОК, на физический - ставит очередь печати, потом очередь очищается и все! Кто-нибудь сталкивался с таким поведением?
0
Практикантроп
4838 / 2724 / 532
Регистрация: 23.09.2011
Сообщений: 5,789
11.09.2024, 12:50 3
Я сталкивался, но причина была чисто механическая (на материнке был выпаян реалтековский чип сети), и в диспетчере устройств висел принтер с "отсутствующими драйверами", хотя "Устройства и принтеры" показывали его как рабочий. Так что это явно не ваш случай...
0
1214 / 708 / 335
Регистрация: 22.02.2018
Сообщений: 2,085
Записей в блоге: 2
12.09.2024, 13:59  [ТС] 4
Короче, плюнул на танцы с бубном, используя работу с классом TPrinter (как ни странно, дома работает, как часы - конфиг ОС и принтеры те же), заморочился с OLE для формирования картинки в Word-е через ClipBoard (у заказчика сроки поджимают), допилю до нормального эстетического состояния (пока заказчика и черновая работа вывода на печать устраивает) и выложу. Может кому и пригодится.

Не по теме:

Плюнул тогда Кащей ядовитой слюной. Он поймал кенгуру, на жопе фломастером написал "Заиц", сунул ей в сумку утку и засунул в сундук. "Стероиды, иопть!" - ухмыльнулся старик и пошел спать.

0
1214 / 708 / 335
Регистрация: 22.02.2018
Сообщений: 2,085
Записей в блоге: 2
13.09.2024, 01:24  [ТС] 5
Получилось нечто такое, мож кому полезно будет
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
void __fastcall TfMap::tbPrintClick(TObject *Sender)
{
    TGraphic *gSS   = new Graphics::TBitmap;
    unsigned int DataHandle;
    HPALETTE APalette;
    unsigned short MyFormat;
 
     gSS = wMap->ScreenShot(itBitmap);
     gSS->SaveToClipboardFormat(MyFormat, DataHandle, APalette);
         Clipboard()->SetAsHandle(MyFormat,DataHandle);
 
        vVarApp=CreateOleObject("Word.Application");
 
   vVarDocs=vVarApp.OlePropertyGet("Documents");
   vVarDocs.OleProcedure("Add");
   vVarDoc=vVarDocs.OleFunction("Item", 1);
 
   vVarDoc.OleProcedure("Activate");
 
   vVarParagraphs=vVarDoc.OlePropertyGet("Paragraphs");
   vVarDoc.OleProcedure("Activate");
   vVarParagraphs.OleProcedure("Add");
   vVarParagraph=vVarParagraphs.OleFunction("Item", 1);
 
   vVarDoc.OlePropertyGet("PageSetup").OlePropertySet("Orientation",1);
 
   Variant v = vVarApp.OlePropertyGet("Selection");
 
   v.OleProcedure("Paste");
 
   vVarApp.OlePropertySet("Visible", true);
    delete gSS;
}
В инклюды добавляем
C++
1
2
#include <Clipbrd.hpp>
#include <ComObj.hpp>
и объявляем
C++
1
Variant vVarApp, vVarDocs, vVarDoc, vVarParagraphs, vVarParagraph;
2
13.09.2024, 01:24
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.09.2024, 01:24
Помогаю со студенческими работами здесь

Ошибка печати
Есть сервер под управлением Windows 2008 server r2. Работа с ним ведется удаленно, RDP внутри VPN....

Ошибка печати
Есть код: procedure TForm1.Button1Click(Sender: TObject); begin try Form1.Print; except ...

ошибка печати
напечатать факультет где больше всего студентов по заданной форме обучения. выдает на печать первый...

Ошибка печати!
Друзья! Принтер что-то перестал отвечать! В очереди печати выскакивает такое сообщение! Принтер...

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

Ошибка печати
Печатаю на весь лист, а при печати содержимое выводится не на весь лист и размерами меньше, а...

Сериализация настроек печати и ошибка "InvalidOperationException (ошибка создания xml)"
Здравствуйте, никак не могу разобраться с сериализацией. Чтобы я не делал, возникает одна из 3...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru