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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.03.2010, 18:20   #1
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию Получение информации о принтере

Нашел в 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;
Вопрос такой - как получить остальную информацию о форматах бумаги а не только название (размеры интересуют)?
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог
mutabor вне форума Ответить с цитированием
Старый 06.03.2010, 19:32   #2
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

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

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

Во-первых, спасибо за пример. Что-то я раньше не обращал внимания на эту функцию.
Пришлось даже подправить 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, 20:47   #4
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

alexBlack, благодарю!
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог
mutabor вне форума Ответить с цитированием
Старый 17.05.2011, 16:37   #5
puma_q
Новичок
Джуниор
 
Регистрация: 17.05.2011
Сообщений: 1
По умолчанию

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


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

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

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


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