Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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


Ответ
 
Опции темы
Старый 06.03.2010, 19:20   #1
mutabor
Телепат с дипломом
Профессионал
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,931
Репутация: 1570

icq: 401708834
По умолчанию Получение информации о принтере

Нашел в DW пример получения списка форматов бумаги в принтере по умолчанию. Немного исправил его, убрал огромный массив из-за к-рого была ошибка E2100, сделал вместо него нулевой массив и добавил контроль допустимого диапазона, код ниже.
Код:

procedure TForm1.GetPaperList;
type
  TPaperName = array[0..63] of Char;
  TPaperNameArray = array[0..0] of TPaperName;
  PPaperNameArray = ^TPaperNameArray;
var
  Device, Driver, Port: array[0..255] of Char;
  hDevMode: THandle;
  i, numPaperformats: Integer;
  pPaperFormats: PPapernameArray;
  sl: TStringList;
begin
  Printer.PrinterIndex := -1;
  Printer.GetPrinter(Device, Driver, Port, hDevmode);
  numPaperformats :=
    WinSpool.DeviceCapabilities(Device, Port, DC_PAPERNAMES, nil, nil);
  if numPaperformats > 0 then
  begin
    GetMem(pPaperformats, numPaperformats * Sizeof(TPapername));
    sl:=TStringList.Create;
    try
      WinSpool.DeviceCapabilities(Device, Port, DC_PAPERNAMES,
        Pchar(pPaperFormats), nil);
      //memo1.clear;
      {$R-} {выключаем контроль допустимого диапазона}
      for i := 0 to numPaperformats-1 do
        sl.Add(IntToStr(i+1)+'. '+pPaperformats^[i]);
      {$R+} {включаем контроль допустимого диапазона}
    finally
      FreeMem(pPaperformats);
    end;
    ShowMessage(sl.Text);
    sl.Free;
  end;
end;

Вопрос такой - как получить остальную информацию о форматах бумаги а не только название (размеры интересуют)?
mutabor вне форума   Ответить с цитированием
Старый 06.03.2010, 20:32   #2
mihali4
*
Профессионал
 
Регистрация: 22.11.2006
Адрес: Москва
Сообщений: 9,198
Репутация: 2661
По умолчанию

Посмотрите функцию DEVMODE.
У нее есть нужные вам параметры:
short dmPaperSize;
short dmPaperLength;
short dmPaperWidth;

Последний раз редактировалось mihali4; 06.03.2010 в 20:42.
mihali4 вне форума   Ответить с цитированием
Старый 06.03.2010, 20:49   #3
alexBlack
Новичок
Профессионал
 
Регистрация: 12.10.2007
Адрес: -
Сообщений: 1,204
Репутация: 920
По умолчанию

Во-первых, спасибо за пример. Что-то я раньше не обращал внимания на эту функцию.
Пришлось даже подправить Printers.pas:

Код:

function TPrinter.SetPaperSize(TypePaper:sTypePaper):boolean;
begin
   CheckPrinting(False);
   GetPrinterIndex;
   SetState(psNoHandle);

   // Устанавливаем нужные размеры и ориентацию
   DevMode^.dmPaperSize    := dmPaper_A4;
   DevMode^.dmOrientation := DMORIENT_PORTRAIT;

   // Проверяем реально установленные размеры:
   try
      X := GetDeviceCaps(Handle, HORZSIZE);
      Y := GetDeviceCaps(Handle, VERTSIZE);
   except
      X := 100; Y := 100;
   end;
   //...

С использование DeviceCapabilities будет гораздо проще.
Для размеров бумаги у этой функции есть отдельный запрос:

Код:

procedure TForm1.Button1Click(Sender: TObject);
type
    tSizes = array [word] of TPoint;
    pSizes = ^tSizes;
var Device, Driver, Port: array [byte] of Char;
    hDevMode: THandle;
    numSizes : integer;
    i:integer;
    sizes : pSizes;
begin
   Printer.PrinterIndex := -1;
   Printer.GetPrinter(Device, Driver, Port, hDevmode);
   numSizes := WinSpool.DeviceCapabilities(
                     Device, Port, DC_PAPERSIZE, nil, nil);
   if numSizes = 0 then exit;

   GetMem(Sizes, numSizes * Sizeof(TPoint));
   try
      WinSpool.DeviceCapabilities(
           Device, Port, DC_PAPERSIZE, PChar(Sizes), nil);

      for i := 0 to NumSizes - 1 do begin
        ListBox1.Items.Add(
            IntToStr(Sizes[i].X) + 'x' +
            IntToStr(Sizes[i].Y));
      end;
   finally
     FreeMem(Sizes);
   end;
end;

alexBlack вне форума   Ответить с цитированием
Старый 06.03.2010, 21:47   #4
mutabor
Телепат с дипломом
Профессионал
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,931
Репутация: 1570

icq: 401708834
По умолчанию

alexBlack, благодарю!
mutabor вне форума   Ответить с цитированием
Старый 17.05.2011, 16:37   #5
puma_q
Новичок
 
Регистрация: 17.05.2011
Сообщений: 1
Репутация: 10
По умолчанию

Добрый день всем. Для принтеров формата А4, А3 размер бумаги получаю с помощью DevMode^.dmPaperLength и DevMode^.dmPaperWidth. А вот размер бумаги для плоттера не удаётся определить, эти два параметры возвращают 0, а параметр dmPaperSize всегда выдает A1_594x841mm. Подскажите как это исправить или где это можно исправить...
Может быть разрядности не хватает у dmPaperLength и dmPaperWidth, т.к. они имебт типа SmallInt.
puma_q вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Получение информации о железе FalseMaster Win Api 2 25.11.2009 07:05
Получение "скрытой" информации из bmp Alex Cones Мультимедиа в Delphi 6 11.06.2009 11:07
Получение информации из мр3 GAGARIN-NEW Мультимедиа в Delphi 2 24.03.2008 16:19
обновление в блоге - Получение информации о загрузке системы. Pblog Обсуждение статей 0 08.01.2008 19:30
Получение информации о классе Sibedir Общие вопросы Delphi 7 07.12.2007 15:37


06:16.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru