Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2012.05.27;
Скачать: [xml.tar.bz2];

Вниз

Вопрос по установке размеров страницы при печати   Найти похожие ветки 

 
дикий   (2012-01-25 10:43) [0]

Возможно ли установить свои размеры страницы для принтера и нарисовав на ней что-нибудь напечатать без использования TPrintDialog?

Т.е. установили

procedure some(Width, Height: SmallInt);
var
 Device, Driver, Port: array [0 .. 255] of char;
 hDMode: THandle;
 DevMode: PDeviceMode;
begin
 Printer.GetPrinter(Device, Driver, Port, hDMode);
 if hDMode <> 0 then begin
   DevMode := GlobalLock(hDMode);
   if DevMode <> nil then begin
     DevMode^.dmFields := DevMode.dmFields or DM_PAPERSIZE or DM_PAPERWIDTH or DM_PAPERLENGTH;
     DevMode^.dmPaperSize := DMPAPER_USER;
     DevMode^.dmPaperWidth := Width;
     DevMode^.dmPaperLength := Height;
     Printer.setPrinter(Device, Driver, Port, hDMode);
     GlobalUnlock(hDMode);
   end;
 end;
end;


Затем в другом месте программы прочитали
Phdc := Printer.Handle;
 PageWidth := GetDeviceCaps(Phdc, HORZSIZE);
 PageHeight := GetDeviceCaps(Phdc, VERTSIZE);


И напечатали
Printer.Canvas.Width = PageWidth = Width
PageWidth и Width из примеров выше


 
Dimka Maslov ©   (2012-01-25 11:49) [1]

TPrintDialog есть надстройка над GetPrinter и SetPrinter. Следовательно, можно в одном месте программы сделать SetPrinter, а в другом GetPrinter. Свои размеры можно задать в системных настройках принтера, но работать это будет только при рулонной подаче.


 
дикий   (2012-01-25 12:32) [2]


> Dimka Maslov ©   (25.01.12 11:49) [1]
> но работать это будет только при рулонной подаче.

Мне так и надо.
У меня плоттер, на который надо послать три с половиной метра.


 
Dimka Maslov ©   (2012-01-25 12:41) [3]

Ну так и всё. Идём в настройки плоттера, там задаём пользовательский размер и печатаем.

А кроме того, содержимое DevMode можно сохранять и восстанавливать при следующем запуске программы, если особенно лениво каждый раз делать настройку через TPrintDialog.


 
дикий   (2012-01-25 14:57) [4]


> Dimka Maslov ©   (25.01.12 12:41) [3]
> Идём в настройки плоттера, там задаём пользовательский размер и печатаем.

некошерно =(
Длина документа всегда разная, от полуметра до нескольких. Да и ширина тоже, но не больше А0

Меня устроили два варианта:

procedure setPageSize1(Width, Height: SmallInt);
var
 HPrinter: THandle;
 InfoSize, BytesNeeded: Cardinal;
 DevMode: PDeviceMode;
 PI2: PPrinterInfo2;
 PrinterDefaults: TPrinterDefaults;
begin
 with PrinterDefaults do begin
   DesiredAccess := PRINTER_ACCESS_USE;
   pDatatype := nil;
   PDEVMODE := nil;
 end;
 if OpenPrinter(PWideChar(Name), HPrinter, @PrinterDefaults) then begin
   try
     SetLastError(0);
     if not GetPrinter(HPrinter, 2, nil, 0, @BytesNeeded) then begin
       PI2 := AllocMem(BytesNeeded);
       try
         InfoSize := SizeOf(TPrinterInfo2);
         if GetPrinter(HPrinter, 2, PI2, BytesNeeded, @BytesNeeded) then begin
           DevMode := PI2.PDEVMODE;
           DevMode.dmFields := DevMode.dmFields or DM_PAPERSIZE or DM_PAPERWIDTH or DM_PAPERLENGTH;
           DevMode.dmPaperSize := DMPAPER_USER;
           DevMode.dmPaperWidth := Width;
           DevMode.dmPaperLength := Height;
           PI2.pSecurityDescriptor := nil;
           if DocumentProperties(0, HPrinter, PWideChar(Name), PI2.PDEVMODE^, PI2.PDEVMODE^,
             DM_IN_BUFFER or DM_OUT_BUFFER) = IDOK then begin
             setPrinter(HPrinter, 2, PI2, 0);
           end;
         end;
       finally
         FreeMem(PI2, BytesNeeded);
       end;
     end;
   finally
     ClosePrinter(HPrinter);
   end;
 end;
end;


и второй

procedure setPageSize2(Width, Height: SmallInt);
Var
 HPrinter: LongWORD;
 pDATA: Pointer;
 nRequired: PDWORD;
 prnDefaults: TPrinterDefaults;
begin
 with prnDefaults do begin
   pDatatype := Nil;
   PDEVMODE := Nil;
   DesiredAccess := PRINTER_ALL_ACCESS;
 end;
 OpenPrinter(PChar(Printer.Printers[Printer.PrinterIndex]), HPrinter, @prnDefaults);
 New(nRequired);
 GetPrinter(HPrinter, 2, Nil, 0, nRequired);
 GetMem(pDATA, nRequired^);
 try
   if GetPrinter(HPrinter, 2, pDATA, nRequired^, nRequired) then begin
     with PRINTER_INFO_2(pDATA^).PDEVMODE^ do begin
       PRINTER_INFO_2(pDATA^).pSecurityDescriptor := Nil;
       dmFields := dmFields OR DM_PAPERSIZE OR DM_PAPERLENGTH OR DM_PAPERWIDTH;
       dmPaperSize := 0;
       dmPaperLength := Height;
       dmPaperWidth := Width;
     end;
     if not setPrinter(HPrinter, 2, pDATA, 0) then
       raise EAbort.Create(SysErrorMessage(GEtLastError));
   end
   else
     raise EAbort.Create("GetPrinter 2 fails: " + SysErrorMessage(GEtLastError));
 finally
   FreeMem(pDATA);
   Dispose(nRequired);
 end;
end;


Оба устанавливают нужные значения. Только второй почему-то не работает с параметром DMPAPER_USER для dmPaperSize, ему обязательно нужен 0.

А вот тот, что в первом посте никак не хочет работать =(


 
Dimka Maslov ©   (2012-01-25 15:44) [5]

Ещё есть в плоттерах функции автоповорота и автообрезки, позволяющие один раз задать в настройках размер ширина_рулона &#215; 100500 и в дальнейшем не заморачиваться с фактическим размером.


 
Dimka Maslov ©   (2012-01-25 16:03) [6]

Кстати, первый пост работать не будет, ибо Printer.GetPrinter выдаём совсем не DeviceMode, а некоторый, зависящий от драйвера принтера массив данных, определяющий состояние его настройки, а Printer.SetPrinter ни разу не принимает DeviceMode.



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2012.05.27;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.003 c
2-1327316580
dis12345
2012-01-23 15:03
2012.05.27
CAPS Lock установить программно верх


2-1327473823
дикий
2012-01-25 10:43
2012.05.27
Вопрос по установке размеров страницы при печати


15-1327057073
И. Павел
2012-01-20 14:57
2012.05.27
Гитара


15-1327222812
Псарь
2012-01-22 13:00
2012.05.27
Торрент и интернет.


3-1276053430
O.O
2010-06-09 07:17
2012.05.27
Замена алгоритма в вычисляемое поле Firebird





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский