Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.61/18: Рейтинг темы: голосов - 18, средняя оценка - 4.61
Shiningemerald
 Аватар для Electroflower
384 / 117 / 22
Регистрация: 05.01.2012
Сообщений: 951
Builder 6

Печать диапазона страниц (компонент PrintDialog1)

19.03.2018, 16:05. Показов 3591. Ответов 19
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Ребята, есть на форме PrintDialog, OleContainer.
С печатью все было ОК(печать всего содержимого Word-документа).
Но стало нужно печатать диапазоном страниц: настройки poPageNums и MaxPage/MinPage выставлены,
но при выборе диапазона так и печатается весь документ.
Что делать, господа?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void __fastcall TFormOle::PrintMenuClick(TObject *Sender)
{
AnsiString FileNameOld, PrinterName;
Variant WordDocument = OleContainer->OleObject;
 
FileNameOld = WordDocument.OlePropertyGet("Application").OlePropertyGet("ActivePrinter");
if (PrintDialog1->Execute())
{
TPrinter *printerdef = Printer();
printerdef->Copies = PrintDialog1->Copies;
 
PrinterName = printerdef->Printers->Strings[printerdef->PrinterIndex];
WordDocument.OlePropertyGet("Application").OlePropertySet("ActivePrinter", PrinterName.c_str());
WordDocument.OleFunction("PrintOut");
}
WordDocument.OlePropertyGet("Application").OlePropertySet("ActivePrinter", FileNameOld.c_str());
WordDocument.Clear();
}
Добавлено через 3 часа 29 минут
хелп сос)

Добавлено через 1 час 43 минуты
up!(
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
19.03.2018, 16:05
Ответы с готовыми решениями:

Печать c компонентом PrintDialog1
Печать с помощью компонента PrintDialog1 Дайте пожалуйста код печати текста с Memo1 И код настройки принтера

C диапазона страниц вытянуть все ссылки
Друзья, надеюсь на вашу помощь Есть Диапазон страниц, www.blabla.com\blablabla\bla\1\ www.blabla.com\blablabla\bla\2\ ...

Печать выделенного диапазона DGV
Добрый день, подскажите как в таблице datagrid напечатать выделенный диапазон, не через отчет.

19
Shiningemerald
 Аватар для Electroflower
384 / 117 / 22
Регистрация: 05.01.2012
Сообщений: 951
23.03.2018, 08:54  [ТС]
Up!
0
 Аватар для TrollHammer
1216 / 709 / 336
Регистрация: 22.02.2018
Сообщений: 2,095
Записей в блоге: 2
23.03.2018, 09:46
Здесь
C++
1
2
3
4
5
6
TPrinter *printerdef = Printer();
printerdef->Copies = PrintDialog1->Copies;
 
PrinterName = printerdef->Printers->Strings[printerdef->PrinterIndex];
WordDocument.OlePropertyGet("Application").OlePropertySet("ActivePrinter", PrinterName.c_str());
WordDocument.OleFunction("PrintOut");
Вы просто сообщаете серверу WordApplication имя принтера, а дальше просто печать, т.е. не передаются настройки (диапазан, ориентация, и т.д.)
1
Shiningemerald
 Аватар для Electroflower
384 / 117 / 22
Регистрация: 05.01.2012
Сообщений: 951
23.03.2018, 14:00  [ТС]
TrollHammer, спасибо!

Может есть какие-то примеры на любом языке? Пока буду смотреть по этому вопросу.
0
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
24.03.2018, 01:13
Вот рабочий пример, который позволяет печатать (в графике) форму Form2 с меткой Label1 вверху страницы_
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void __fastcall TForm1::Button4Click(TObject *Sender)
{             //  #include  <printers.hpp> !
     WORD  na = 1, ko = 9, st;
     TPrinter  *prn = Printer();
     PrintDialog1->Options.Clear();
     PrintDialog1->Options << poPageNums << poPrintToFile << poSelection << poWarning ;
     PrintDialog1->MinPage = na;
     PrintDialog1->MaxPage = ko;
     PrintDialog1->ToPage  = ko; 
     if(!PrintDialog1->Execute()) return;
     st = PrintDialog1->FromPage;
     ko = PrintDialog1->ToPage;
     if (Form2) 
       for(int i=st;i<=ko;i++) {
         prn->Title = "Печать страницы "+IntToStr(i);
         Form2->Label1->Caption = "- "+IntToStr(i)+" -";
         Form2->Print();
       }
}
1
Shiningemerald
 Аватар для Electroflower
384 / 117 / 22
Регистрация: 05.01.2012
Сообщений: 951
02.04.2018, 11:46  [ТС]
TrollHammer, nick42, все равно не выходит печать.
У меня все-таки проблема немного другая. Делаю свойство печати диапазона активным в PrintDialog, нажимаю печать - появляется окно PrintDialog и там активен выбор диапазона, но принтер печатает все.
0
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
02.04.2018, 14:12
В моём примере, если вы заметили, после вызова окна PrintDialog запоминаются установки FromPage, ToPage с этого окна, и дальше они используются в цикле отправки страниц на печать. Если вы после активации PrintDialog ничего в отправке страниц на печать не корректируете, то оно и "жарит" весь документ на печать; 'я так думаю...'.
Просто мне кажется, что в функции PrintDialog не входит разбивка документа на страницы и в связи с этим - выборочная печать. Это для него слишком сложно. Он (диалог) лишь позволяет выбрать в удобной форме некоторые атрибуты печати, и возвращает их значения в место вызова. А дальше всё "сама", "сама"... .
1
Shiningemerald
 Аватар для Electroflower
384 / 117 / 22
Регистрация: 05.01.2012
Сообщений: 951
02.04.2018, 15:46  [ТС]
nick42, В этом-то и дело, что параметры скакой по какую получить можно, а как на печать их вывести-это уже вопрос...
0
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
02.04.2018, 16:05
Я думаю, - проблема в этом...
Цитата Сообщение от Electroflower Посмотреть сообщение
WordDocument.OleFunction("PrintOut");
Нужно вычленить страницы по отдельности, и их отправлять на печать (как - не спрашивайте; ничего подобного ранее не делал, но думаю, что возможно).
1
 Аватар для TrollHammer
1216 / 709 / 336
Регистрация: 22.02.2018
Сообщений: 2,095
Записей в блоге: 2
03.04.2018, 01:50
Electroflower, в Word создайте макрос и запишите последовательность действий отправки на печать диапазона страниц. Потом посмотрите содержимое этого макроса. Так как Вы используете Ole-контейнер, передайте эту последовательность действий через него.

Добавлено через 26 минут
PureBasic
1
2
3
4
5
6
7
8
9
10
11
12
Sub Макрос2()
'
' Макрос2 Макрос
'
'
    ActivePrinter = "Foxit Reader PDF Printer"
    Application.PrintOut FileName:="", Range:=wdPrintRangeOfPages, Item:= _
        wdPrintDocumentWithMarkup, Copies:=1, Pages:="3-5", PageType:= _
        wdPrintAllPages, Collate:=True, Background:=True, PrintToFile:=False, _
        PrintZoomColumn:=0, PrintZoomRow:=0, PrintZoomPaperWidth:=0, _
        PrintZoomPaperHeight:=0
End Sub
Макрос отправки на печать выглядит примерно так.
И я думаю, что отправка на печать диапазона страниц будет выглядеть так
C++
1
2
WideString wPages="3-5";
WordDocument.OlePropertyGet("Application").OlePropertyGet("Printer").OlePropertySet("Pages", wPages);
Ну или что-то в этом роде.
1
Shiningemerald
 Аватар для Electroflower
384 / 117 / 22
Регистрация: 05.01.2012
Сообщений: 951
03.04.2018, 11:32  [ТС]
TrollHammer, спасибо, в голове картина сформировалась к чему надо идти

Добавлено через 6 минут
nick42, а может подскажете еще, в моем приложении Word-документ открывался строго в OleContainer, после каких-то манипуляций в настройках ПК вдруг стало открывать сразу в Word, а в самом OleContainer ярлык документа только.
Какие-то манипуляции:
Предположительно проблема появилась в период когда перестал работать предварительный просмотр в Outlook 2010 и были внесены какие-то изменения в настройки для отображения документов в предварительном просмотре, после этого предварительный просмотр заработал в Outlook 2010 а отображение в OLE упало, так сказать.
(При этом в приложение изменения не вносили!)
0
Shiningemerald
 Аватар для Electroflower
384 / 117 / 22
Регистрация: 05.01.2012
Сообщений: 951
10.04.2018, 16:36  [ТС]
Что-то все бьюсь и не выходит...
0
 Аватар для TrollHammer
1216 / 709 / 336
Регистрация: 22.02.2018
Сообщений: 2,095
Записей в блоге: 2
11.04.2018, 06:35
Лучший ответ Сообщение было отмечено Electroflower как решение

Решение

Попробуйте так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
WideString pages = "3-5";
 
WordDocument.OlePropertyGet("ActiveDocument").OleProcedure("PrintOut",
EmptyParam() /* Background */,
EmptyParam() /* Append */,
Variant(wdPrintRangeOfPages) /* Range */,
EmptyParam() /* OutputFileName */,
EmptyParam() /* From */,
EmptyParam() /* To */,
EmptyParam() /* Item */,
EmptyParam() /* Copies */,
Variant(pages) /* Pages */,
EmptyParam() /* PageType */,
EmptyParam() /* PrintToFile */,
EmptyParam() /* Collate */,
EmptyParam() /* FileName */,
EmptyParam() /* ActivePrinterMacGX */)
Добавлено через 40 секунд
Нашел у себя в закладках, не сочтите за плагиат

Добавлено через 2 минуты
Забыл
C++
1
const int wdPrintRangeOfPages = 4;//диапазон открытых страниц документа, можно менять
1
Shiningemerald
 Аватар для Electroflower
384 / 117 / 22
Регистрация: 05.01.2012
Сообщений: 951
11.04.2018, 08:53  [ТС]
TrollHammer, спасибо, буду пробовать)
Цитата Сообщение от TrollHammer Посмотреть сообщение
Нашел у себя в закладках, не сочтите за плагиат
Это вы так троллите потому что примеров в интернете полно? Или я не так понимаю...
В делфи такой пример был да на просторах...
0
 Аватар для TrollHammer
1216 / 709 / 336
Регистрация: 22.02.2018
Сообщений: 2,095
Записей в блоге: 2
11.04.2018, 09:41
Electroflower, Зачем мне троллить. Покопался в старых заначках, когда работал с Ole и нашел. А так сам зарекся связываться с серверами автоматизации, с привязкой к Office. Лучше пользовать OLE-независимые библиотеки, формирующие документ независимо.
1
Shiningemerald
 Аватар для Electroflower
384 / 117 / 22
Регистрация: 05.01.2012
Сообщений: 951
11.04.2018, 10:00  [ТС]
TrollHammer, аааа

В общем пробую так, все ругается без мессага в среде

C++
1
2
3
4
5
6
7
8
9
10
WordDocument.OleProcedure("PrintOut",
                EmptyParam,
                EmptyParam,
                wdPrintRangeOfPages,
                EmptyParam,
                EmptyParam,
                EmptyParam,
                EmptyParam,
                EmptyParam,
                Pages);
Зато если exe-шник запускать пишет мол неверная переменная....
0
 Аватар для TrollHammer
1216 / 709 / 336
Регистрация: 22.02.2018
Сообщений: 2,095
Записей в блоге: 2
11.04.2018, 10:26
Неправильно вызываете функцию, мало параметров. Вызовите, как у меня в примере

Добавлено через 1 минуту
А переменные в Ole для офиса передаются типом WideString, поэтому "оберните" их в Variant, как у меня
1
Shiningemerald
 Аватар для Electroflower
384 / 117 / 22
Регистрация: 05.01.2012
Сообщений: 951
11.04.2018, 10:46  [ТС]
Цитата Сообщение от TrollHammer Посмотреть сообщение
"оберните" их в Variant
Я их объявила как Variant сразу...наверно тоже неверно.
Цитата Сообщение от TrollHammer Посмотреть сообщение
Неправильно вызываете функцию, мало параметров
Я думала процедура и такое количество обработает, просто там для разного количества параметров есть, если смотреть в sysvari.h:
C++
1
2
3
4
5
6
7
8
9
10
11
12
 template <class P1, class P2, class P3, class P4, class P5,
            class P6, class P7, class P8, class P9>
  void Variant::OleProcedure(const String& name,
    P1 p1, P2 p2, P3 p3, P4 p4, P5 p5,
    P6 p6, P7 p7, P8 p8, P9 p9)
  {
    TAutoArgs<9> args;
    args[1] = p1;  args[2] = p2;  args[3] = p3;
    args[4] = p4;  args[5] = p5;  args[6] = p6;
    args[7] = p7;  args[8] = p8;  args[9] = p9;
    OleProcedure(name, static_cast<TAutoArgsBase*>(&args));
  }
и вот:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
  template <class P1, class P2, class P3, class P4, class P5,
            class P6, class P7, class P8, class P9, class P10,
            class P11, class P12, class P13, class P14, class P15,
            class P16, class P17, class P18, class P19, class P20,
            class P21, class P22, class P23, class P24>
  void Variant::OleProcedure(const String& name,
    P1 p1, P2 p2, P3 p3, P4 p4, P5 p5,
    P6 p6, P7 p7, P8 p8, P9 p9, P10 p10,
    P11 p11, P12 p12, P13 p13, P14 p14, P15 p15,
    P16 p16, P17 p17, P18 p18, P19 p19, P20 p20,
    P21 p21, P22 p22, P23 p23, P24 p24)
  {
    TAutoArgs<24> args;
    args[1] = p1;  args[2] = p2;  args[3] = p3;
    args[4] = p4;  args[5] = p5;  args[6] = p6;
    args[7] = p7;  args[8] = p8;  args[9] = p9;
    args[10] = p10;  args[11] = p11;  args[12] = p12;
    args[13] = p13;  args[14] = p14;  args[15] = p15;
    args[16] = p16;  args[17] = p17;  args[18] = p18;
    args[19] = p19;  args[20] = p20;  args[21] = p21;
    args[22] = p22;  args[23] = p23;  args[24] = p24;
    OleProcedure(name, static_cast<TAutoArgsBase*>(&args));
  }
Цитата Сообщение от TrollHammer Посмотреть сообщение
Вызовите, как у меня в примере
Это первое что было сделано, сейчас, конечно, попробую еще "поиграться"...
Ошибки всякие сыпятся просто
0
 Аватар для TrollHammer
1216 / 709 / 336
Регистрация: 22.02.2018
Сообщений: 2,095
Записей в блоге: 2
11.04.2018, 10:52
Цитата Сообщение от Electroflower Посмотреть сообщение
Я думала процедура и такое количество обработает
Данное количество параметров необходимо для корректного вызова процедуры VBA PrintOut
1
Shiningemerald
 Аватар для Electroflower
384 / 117 / 22
Регистрация: 05.01.2012
Сообщений: 951
11.04.2018, 11:16  [ТС]
Цитата Сообщение от TrollHammer Посмотреть сообщение
Данное количество параметров необходимо для корректного вызова процедуры VBA PrintOut
ааа, понятно

Итак, вы были правы насчет
Цитата Сообщение от TrollHammer Посмотреть сообщение
"оберните" их в Variant, как у меня
...
Все заработало как надо!
Вот так выглядит вызов с параметрами:
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
//Объявления 
const int wdPrintRangeOfPages = 4;
WideString Pages = "1-1"; 
 
//Вызов
WordDocument.OleProcedure("PrintOut",
                EmptyParam,
                EmptyParam,
                Variant(wdPrintRangeOfPages),
                EmptyParam,
                EmptyParam,
                EmptyParam,
                EmptyParam,
                EmptyParam,
                Variant(Pages),
                EmptyParam,
                EmptyParam,
                EmptyParam,
                EmptyParam,
                EmptyParam,
                EmptyParam,
                EmptyParam,
                EmptyParam,
                EmptyParam);
Добавлено через 1 минуту
TrollHammer, Спасибо большое за поддержку! Очень выручил!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
11.04.2018, 11:16
Помогаю со студенческими работами здесь

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

Как сделать случайный переход на одну из диапазона страниц
Подскажите, пожалуйста, как сделать случайный переход на одну из диапазона страниц.

Печать страниц
Привет Народ! Подскажите пожалуйста, Посоветуйте нормальный модуль печати для Joomla ? Заранее спасибо!

Печать страниц
Привет! Есть ли в joomla хороший модуль печати, я пользовался стандартным, мне он не подошел, или что можете посоветовать чтобы нормально...

Печать web страниц
Поделитесь опытом вывода данных на печать. Кто как поступает, когда необходимо вывести данные в определенном формате. Речь идет о различных...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru