Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.10.2006, 12:27   #1
Alar
Александр
Администратор
 
Аватар для Alar
 
Регистрация: 28.10.2006
Сообщений: 17,758
По умолчанию изменение свойст принтера

перенесено со старого форума. сообщение от fэn.

Помогите пожалуйста изменить лоток принтера, используемый по умолчанию. (Нужно четные странницы напечатать из внутреннего лотка а нечетные из внешнего(ручного). В диалоге это без проблем, а вот как программно не знаю). Заранее благодарен.

перенесено со старого форума. сообщение от nova-alex.

Возможно ответ на твой вопрос найдешь в Delphi World 6Pro-ОСиЖелезо-Принтеры ипечать-Изменение свойств печати во время ее выполнения. Сам код достаточно большой, чтобы сюда его помещать.
А потому "возможно", что сам еще не проверил. DW6Pro нужен со всеми последними обновлениями.

перенесено со старого форума. сообщение от Virtson.

Создайте копию модуля Printers.pas и переименуйте его в NewPrint.pas.

***НЕ делайте изменения в самом модуле Printers.pas, если вы сделаете это,

то получите во время компиляции приложения ошибку "Unable to find printers.pas"

(не могу найти printer.pas). (Я уже получае ее, поэтому и упоминаю об этом здесь...)***



Переместите модуль NewPrint.pas в директорию Lib.

(Используйте "C:\Program Files\Borland\Delphi Х\Lib" )



Измените ИМЯ МОДУЛЯ на NewPrint.pas

(с: unit Printers на: unit NewPrint)



Добавьте декларацию следующего PUBLIC метода класса TPrinter в секции Interface модуля NewPrint.pas:

procedure NewPageDC(DM: PDevMode);



Добавьте следующую процедуру в секцию реализации NewPrint.pas:

procedure TPrinter.NewPageDC(DM: PDevMode);

begin

CheckPrinting(True);

EndPage(DC);

{Проверяем наличие новых установок для принтера}

if Assigned(DM) then

ResetDC(DC,DM^);

StartPage(DC);

Inc(FPageNumber);

Canvas.Refresh;

end;



Вместо добавления "Printers" в секцию USES вашего приложения (список используемых модулей), добавьте "NewPrint".

Теперь вдобавок к старым методам (таким как BeginDoc, EndDoc, NewPage и др.), у вас появилась возможность изменения свойств принтера "на лету", т.е. между страницами при печати одного и того же документа. (Пример приведен ниже.)



Вместо вызова:

Printer.NewPage;

напишите:

Printer.NewPageDC(DevMode);



Вот небольшой пример:

procedure TForm1.Button1Click(Sender: TObject);

var

ADevice, ADriver, APort: array[0..255] of char;

ADeviceMode: THandle;

DevMode: PDevMode;

begin

with Printer do

begin

GetPrinter(ADevice, ADriver, APort, ADeviceMode);

SetPrinter(ADevice, ADriver, APort, 0);

GetPrinter(ADevice, ADriver, APort, ADeviceMode);

DevMode := GlobalLock(ADeviceMode);

if not Assigned(DevMode) then

ShowMessage('Не могу установить принтер.')

else

begin

with DevMode^ do

begin

{Применяем здесь любые настройки, необходимые для изменения установок печати}

dmDefaultSource := DMBIN_UPPER;

{этот код приведен в "Windows.pas"}

end;

GlobalUnlock(ADeviceMode);

SetPrinter(ADevice, ADriver, APort, ADeviceMode);

end;

end;



Printer.BeginDoc;

Printer.Canvas.TextOut(50, 50, 'Эта страница печатается из ВЕРХНЕГО ЛОТКА.');

with DevMode^ do

begin {Применяем здесь любые настройки, необходимые для изменения установок печати}

dmDefaultSource := DMBIN_LOWER; {этот код приведен в "Windows.pas"}

end;

Printer.NewPageDC(DevMode);

Printer.Canvas.TextOut(50, 50, 'Эта страница печатается из НИЖНЕГО ЛОТКА.');

Printer.EndDoc;

end;
Alar вне форума Ответить с цитированием
Старый 30.10.2006, 12:27   #2
Alar
Александр
Администратор
 
Аватар для Alar
 
Регистрация: 28.10.2006
Сообщений: 17,758
По умолчанию

перенесено со старого форума. сообщение от nova-alex.

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

перенесено со старого форума. сообщение от fэn.

Этот код не катит, я его везде вижу, а когда пытаюсь его реализовать, то изменений никаких, все печатается из одного лотка

перенесено со старого форума. сообщение от Virtson.

может все зависит от принтера. и от драйвера

перенесено со старого форума. сообщение от fэn.

но ведь в диалоге это можно сделать, если бы можно было узнать какие сообщения посредством диалога посылаются принтеру...

перенесено со старого форума. сообщение от nova-alex.

Попробуй такую конструкцию.
var
ADev, ADriv, APort:array [0..255] of Char;
adevh:Thandle;
devm:Pdevicemode;
begin
Printer.PrinterIndex:=Printer.Print erIndex;
Printer.getprinter(adev,adriv,aport ,adevh);
if adevh <> 0 then begin
DevM:= GlobalLock(adevh);
if DevM <> nil then begin
//Обязательная инициализация бита поля dmFields
devm^.dmFields:=devm^.dmFields or DM_DEFAULTSOURCE;
DevM^.dmDefaultSource:=DMBIN_UPPER;
GlobalUnlock(adevh);
end;
end;
{Блок распечатки страницы}
Printer.PrinterIndex:=Printer.Print erIndex;
Printer.getprinter(adev,adriv,aport ,adevh);
if adevh <> 0 then begin
DevM:= GlobalLock(adevh);
if DevM <> nil then begin
//Обязательная инициализация указателя поля dmFields
devm^.dmFields:=devm^.dmFields or DM_DEFAULTSOURCE;
DevM^.dmDefaultSource:=DMBIN_LOWER;
GlobalUnlock(adevh);
end;
end;
{Блок распечатки следующей страницы}

Обрати внимание на то, что обязательно нужно инициализировать указатель поля dmFields, а затем делать уставки.
Хотя в справке D6 по слову DevMode сказано, что (Reserved; must be zero)-зарезервировано и должно быть выставлено в ноль.
Кстати свою проблему частично решил(тема от 24 октября, в ней описал свое решение), здесь добавлю то, что изменения настроек принтера работали только для программы,сделавшей эти изменения и только до момента ее закрытия. После закрытия все настройки возвращались к установкам принтера.


Текст и нужно удалить.

перенесено со старого форума. сообщение от fэn.


Наконец-то решил, надо было чуть изменить код, значения для dmdefaultsource : 3 - внутренний лоток, 4 - внешний(это для ricoh aficio 1018d pcl 6, для других могут быть другие значения)
with DevMode^ do
begin
{Применяем здесь любые настройки, необходимые для изменения установок печати}
//dmDefaultSource := DMBIN_UPPER;
dmDefaultSource :=4;
end;
GlobalUnlock(ADeviceMode);
SetPrinter(ADevice,ADriver,APort,AD eviceMode);
Всем спасибо.
Alar вне форума Ответить с цитированием
Старый 10.10.2012, 00:53   #3
Bagir
Пользователь
 
Регистрация: 10.10.2012
Сообщений: 19
По умолчанию

Alar посмотрите пожалуйста http://www.programmersforum.ru/showt...85#post1111085
Речь идет о изменении настроек принтера. Вы писали, что у Вас получилось сделать так, чтобы изменения были только пока живет программа. То есть изменялись не общие настройки принтера а их копия, которую помнит прога.
Bagir вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Подключение принтера к ноутбуку! Николай_ Компьютерное железо 4 07.03.2010 18:51
Программное добавление принтера AlexandrSid Общие вопросы Delphi 5 13.08.2008 15:29
Разработка виртуального принтера studentTomsk Помощь студентам 3 03.02.2008 13:39
Чертов памперс принтера Stanislav Компьютерное железо 9 18.01.2008 11:29
Изменить размеры страницы принтера Shuraken Win Api 1 30.08.2007 05:14