Вверх ↑
Этот топик читают: Гость
Разработчик
Ответов: 26061
Рейтинг: 2120
#31: 2017-02-01 14:57:33 ЛС | профиль | цитата
grial1964 писал(а):
Появилась новая проблема

Да, есть такое дело -- после вызова диалога очищается контекст устройства, вот почему и печатает чистый лист. Пока не совсем понятно, как от этого избавится. С количеством копий я пока не разбирался, принтер занят.
карма: 22

0
Ответов: 18
Рейтинг: 0
#32: 2017-02-02 11:47:40 ЛС | профиль | цитата
Чистый лист удалось победить. В том примерчике который приводил раньше, я попытался обьеденить вывод на экран и вывод на принтер по подобию из файла примера. Теперь сделал отдельно картинку на экран, и вывод на принтер, все заработало нормально.
карма: 1

0
Ответов: 18
Рейтинг: 0
#33: 2017-02-02 17:25:08 ЛС | профиль | цитата
Попробовал запустить програмку на другом компе, печатает 1 копию хоть и показывает в диалоговом окне нужное количество.

--- Добавлено в 2017-02-02 17:37:58

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

Редактировалось 1 раз(а), последний 2017-02-02 17:37:58
карма: 1

0
Ответов: 4612
Рейтинг: 746
#34: 2017-02-02 17:50:57 ЛС | профиль | цитата
grial1964 писал(а):
Параметры принтеров находятся в ветке реестра
Зачем? Зайти в папку "Принтеры" в Панели управления, правой кнопкой по принтеру - "Настройка печати" и всё задаётся по-умолчанию.

nesco, в том месте, где ты задаёшь количество копий - это количество нужно для диалога. Затем реальное количество должно получится как пользователь задаёт в диалоге.
Для того, чтобы задать самому количество копий без диалога - нужно установить прямо в параметрах принтера, типа

procedure THIPrinter._work_doPrint;
var re:PControl;
dt:TData;
cm:TRect;
begin
with Printer{$ifndef F_P}^{$endif} do
begin
Title := _prop_Title;
Copies := 100; // <====================
if System.Assigned(_data_Text.Event) or not System.Assigned(_data_RichEdit.Event) then
begin
BeginDoc;
WriteLn(ReadString(_Data,_data_Text,''));
_hi_OnEvent(_event_onPrint, integer(Handle));
EndDoc;
end
else
begin
dt := ReadData(_Data,_data_RichEdit,nil);
if Dt.sdata = 'RichEdit' then
begin
re := pointer(Dt.idata);
RE_Print(re);
end;
end;
end;
end;

Соответственно, для метода doPrint можно добавить свойства (в дополнение к Title): Copies, Orientation, Margins. Тогда метод будет выполнять то, на что и расчитан - запускать на печать без диалога, но с возможностью пользователю самому задать все параметры.

Там, если посмотреть в TPrinter.fDeviceMode - можно ещё много параметров задать, но наверное, нужно расширять TPrinter.

Редактировалось 1 раз(а), последний 2017-02-02 18:01:05
карма: 26

1
Голосовали:sashaoli
Ответов: 18
Рейтинг: 0
#35: 2017-02-02 22:18:52 ЛС | профиль | цитата
Зачем? Зайти в папку "Принтеры" в Панели управления, правой кнопкой по принтеру - "Настройка печати" и всё задаётся по-умолчанию.


Папка принтеры эт хорошо, но задача стоит в автоматизации процесса. Динамически менять настройки принтера и выбирать принтер без участия человека, и пока смог это сделать только через работу с реестром.
карма: 1

0
Разработчик
Ответов: 26061
Рейтинг: 2120
#36: 2017-02-03 02:36:28 ЛС | профиль | цитата
Netspirit писал(а):
в том месте, где ты задаёшь количество копий - это количество нужно для диалога. Затем реальное количество должно получится как пользователь задаёт в диалоге.

Привет, а это что?

procedure THIPrinter._work_doCopies;
begin
Copies := max(1, ToInteger(_Data));
Printer.Copies := Copies;
end;

Редактировалось 1 раз(а), последний 2017-02-03 02:36:42
карма: 22

0
Ответов: 19
Рейтинг: 1
#37: 2017-05-08 12:27:58 ЛС | профиль | цитата
Если ещё актуально, то думаю количество копий задавать вот так:




Add(MainForm,7302977,483,301)
{
Width=944
Height=609
}
Add(Memo,15483007,889,336)
{
Left=10
Top=20
Width=305
Height=125
Strings=#41:Съешь ещё этих мягких французских булок, |15:да выпей же чаю|
}
Add(Label,13388471,483,252)
{
Left=15
Top=160
Width=70
Height=17
Caption="кол.во копий"
}
Add(Button,8394074,497,406)
{
Left=155
Top=155
Width=160
Height=50
Caption="Print"
link(onClick,16078791:doDeferredEvent,[(647,412)(647,391)])
}
Add(DeferredEvent,16078791,693,385)
{
Delay=21
InData=0
link(onDeferredEvent,16005317:doFor,[])
}
Add(Printer,510874,903,462)
{
Point(doSettings)
Point(doPrintDlg)
Point(doCopies)
link(Text,15483007:Text,[(909,422)(895,422)])
}
Add(For,16005317,784,385)
{
Start=1
link(onEvent,510874:doPrint,[(860,391)(860,468)])
link(End,3829279:Text,[(797,349)(804,349)])
}
Add(Edit,3829279,798,280)
{
Left=20
Top=185
Text="0"
DataType=1
}

карма: 0

0
Ответов: 19
Рейтинг: 1
#38: 2017-05-09 03:06:15 ЛС | профиль | цитата
grial1964
Можно посмотреть на пример, как менять параметры принтера и выбор принтера, через реестр?
Тоже нужна автоматизация печати.
карма: 0

0
Ответов: 18
Рейтинг: 0
#39: 2017-08-22 15:53:21 ЛС | профиль | цитата
пример смены в системе принтера по умолчанию

Add(MainForm,2953706,21,105)
{
Height=492
link(onCreate,3594548:doEvent1,[])
}
Add(Registry,16114156,210,224)
{
HKey=1
Key="Printers\DevModePerUser"
Point(onEnumValue)
Point(onEnumKey)
Point(doEnumValues)
link(onEnumValue,6261126:doAdd,[])
}
Add(Hub,5859765,161,273)
{
OutCount=4
link(onEvent1,6261126:doClear,[(266,279)(266,244)])
link(onEvent2,16114156:doEnumValues,[(203,286)(203,244)])
}
Add(ListBox,6261126,322,231)
{
Left=5
Top=155
Width=380
Height=200
DataType=1
Point(String)
Point(doSelectString)
}
Add(Label,5236431,322,77)
{
Left=10
Top=25
Width=103
Height=17
Caption="Принтер не выбран"
}
Add(InfoTip,16129091,133,189)
{
Info=#25:Просмотр - выбор принтера|
Width=337
Height=165
}
Add(Registry,2665837,609,245)
{
HKey=1
Key="Software\Microsoft\Windows NT\CurrentVersion\Devices"
link(onRead,14187175:doString,[])
link(Value,15760165:Var2,[])
}
Add(Registry,8651221,777,238)
{
HKey=1
Key="Software\Microsoft\Windows NT\CurrentVersion\Windows"
Value="Device"
Point(onEnumValue)
Point(onEnumKey)
Point(doEnumValues)
link(Data,12323634:Value,[(783,226)(751,226)(751,289)(720,289)])
}
Add(Memory,12323634,714,245)
{
link(onData,8651221:doWrite,[])
}
Add(FormatStr,14187175,672,245)
{
Mask="%1,%2"
link(onFString,12323634:doValue,[])
link(Str1,15760165:Var3,[(678,220)])
}
Add(GetDataEx,15760165,623,215)
{
Angle=3
link(Data,6261126:String,[(488,220)(488,295)(349,295)])
}
Add(Button,15926929,497,245)
{
Left=5
Top=360
Width=285
Caption="Установить по умолчанию"
link(onClick,3921436:doEvent1,[])
}
Add(InfoTip,11045398,518,189)
{
Info=#31:Установить принтер по умолчанию|
Width=337
Height=165
}
Add(Registry,6008923,203,70)
{
HKey=1
Key="Software\Microsoft\Windows NT\CurrentVersion\Windows"
Value="Device"
Point(onEnumValue)
Point(onEnumKey)
Point(doEnumValues)
link(onRead,4341045:doSplit,[])
}
Add(StrPart,4341045,252,70)
{
Char=","
link(onPart,5236431:doText,[])
}
Add(Hub,3594548,84,119)
{
OutCount=4
link(onEvent1,5600320:doWork2,[(150,125)(150,76)])
link(onEvent4,5859765:doEvent1,[(130,146)(130,279)])
}
Add(Label,14952544,203,28)
{
Left=10
Top=5
Width=121
Height=17
Caption="Принтер по умолчанию"
}
Add(Hub,3921436,553,245)
{
link(onEvent1,2665837:doRead,[])
link(onEvent2,5600320:doWork3,[(579,258)(579,168)(172,168)])
}
Add(HubEx,5600320,168,70)
{
link(onEvent,6008923:doRead,[])
}


Редактировалось 1 раз(а), последний 2017-08-22 16:02:53
карма: 1

0
Ответов: 19
Рейтинг: 1
#40: 2018-01-01 22:42:46 ЛС | профиль | цитата
Спасибо
карма: 0

0
Ответов: 53
Рейтинг: 3
#41: 2022-02-22 10:27:06 ЛС | профиль | цитата
Добрый день. Подскажите, а как отправить команду напрямую в принтер?
Тут вроде в теме как раз этикетки со штрих-кодами печатали, а как?
Есть USB-принтер Zebra, он печатает путем отправки ему ZPL-скриптов.

Варианты в виде расшаривания по сети, добавления текстовых принтеров изучены и отвергнуты как костыли.
Я так понял, что можно через WinAPI, но тут мои полномочия как бы и всё.

Редактировалось 1 раз(а), последний 2022-02-22 14:55:51
карма: 1

0
41
Сообщение
...
Прикрепленные файлы
(файлы не залиты)