Вот пример одного из моих компонентов, инкапсулирующий вышесказанную функциональность:
procedure TCrpePrinter.GetCurrentPrinter;varlpDevice: PChar;lpDriver: PChar;lpPort: PChar;Handle: THandle;beginlpDevice := StrAlloc(255);lpDriver := StrAlloc(255);lpPort := StrAlloc(255); tryPrinter.GetPrinter(lpDevice,lpDriver,lpPort,Handle);if Handle <> 0 then { если это не 0, то мы имеем указатель на структуру устройства}beginFDevMode := Ptr(Handle,0); {Получаем дескриптор структуры устройства}FDevice := StrPas(lpDevice);FDriver := StrPas(lpDriver);FPort := StrPas(lpPort);endelsebeginPrinter.PrinterIndex := Printer.PrinterIndex; {Этим мы пытаемся осуществить инициализацию}Printer.GetPrinter(lpDevice,lpDriver,lpPort,Handle);if Handle <> 0 thenbeginFDevMode := Ptr(Handle,0);FDevice := StrPas(lpDevice);FDriver := StrPas(lpDriver);FPort := StrPas(lpPort);endelsebeginFDevMode := nil;raise ECrpe.Create('Ошибка загрузки драйвера принтера');end;end;finallyStrDispose(lpDevice);StrDispose(lpDriver);StrDispose(lpPort);end;end; |
Изменение лотка и количества копий:
dmCopies := 2; dmDefaultSource := 2; {Нижний лоток} |
Как только вы получите указатель на структуру devmode, вы вправе делать изменения любых полей. Говорят, могут быть проблемы при изменении лотков во время печати, но сам я не пробовал менять эти поля в структуре DevMode.
- Jeff Fisher [000822]