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

Вниз

кол-во страниц отправленых на принтер   Найти похожие ветки 

 
ted   (2002-05-12 19:43) [0]

Подскажите, как подсчитать кол-во страниц отправленых на принтер?
Заранее благодарен.....


 
Konorl   (2002-05-12 20:26) [1]

Сам не делал, но считаю, что с помощью функции GetJob
определите JOB_INFO_1, с этой структуре есть количество страниц
документа TotalPages. Необходимо сначало открыть нужный принтер OpenPrinter на нужном JobId.


 
ted   (2002-05-12 21:55) [2]

> Konorl
Спасибо за совет, вот код, но он выдает ошибку, не могу понять в чем дело.......8(
Ошика звучит так: incompatible types "Cardinal" and "PDWORD"
Пробовал менять dwNeeded1 : DWORD; на dwNeeded1 : cardinal; все равно не фурычит. Помогите разоблаться, плиз......

var
hPrinter : THandle;
PD : TPrinterDefaults;
JI2 : PjobInfo2;
dwNeeded1 : DWORD;
begin
ji2:=nil;
OpenPrinter(PChar(GetPrinterName), hPrinter, @PD);
getjob(hPrinter,0,2,JI2,0, dwNeeded1);


 
Anatoly Podgoretsky   (2002-05-12 22:20) [3]

getjob(hPrinter,0,2,JI2,0, @dwNeeded1);


 
ted   (2002-05-13 01:44) [4]

Попробовал все здорово только количество страниц все время 0.
Что в этом коде не так, подскажите, плиз???????
procedure TForm1.GetInfo100;
var
hPrinter : THandle;
PD : TPrinterDefaults;
JI2 : PjobInfo2;
dwNeeded1 : dword;
begin
Memo5.Lines.Clear;
ji2:=nil;
// Узнаем реальный размер структуры
OpenPrinter(PChar(GetPrinterName), hPrinter, @PD);
getjob(hPrinter,0,2,JI2,0, @dwNeeded1);
// Выделим память
hGlobal := GlobalAlloc(GHND, DWNEEDED1);
JI2 := PJobInfo2(GlobalLock(hGlobal));
// Отобразим ее
with Memo5.Lines, JI2^ do
begin
Add("TotalPages = " + IntToStr(TotalPages));
end;

// Освободим память
GlobalUnlock(hGlobal);
GlobalFree(hGlobal);

end;


 
ted   (2002-05-13 07:02) [5]

Помогите разобраться, плиз...........


 
Konorl   (2002-05-13 17:21) [6]

Не претендую на истину, попробу так:

procedure TForm1.CountOrdersPrinter;
var
hPrinter,hGlobal: THandle;
JobId, cbBuf, dwNeeded: Cardinal;
JB1: PJOBINFO1;
PD: TPrinterDefaults;

function GetPrinterName: String;
var
Buffer: Array[0..255] of Char;
S: String;
begin
GetProfileString("windows", "device", ",,,", buffer, 256);
S:=StrPas(Buffer);
Result:=Copy(S, 1, Pos(",", S)-1);
end;

begin
OpenPrinter(PChar(GetPrinterName), hPrinter, @PD);
hGlobal := GlobalAlloc(GHND, dwNeeded);
JB1:= PJOBINFO1(GlobalLock(hGlobal));
cbBuf:=255;
for JobId:=1 to 255 do
if GetJob(hPrinter, JobId, 1, JB1, cbBuf, @dwNeeded) then
Label1.Caption:=inttostr(JB1.TotalPages);
ClosePrinter(hPrinter);
end;

Покажет кол. страниц первого задания принтера по умолчанию.
Если дальше в лес - доделывай сам.


 
Konorl   (2002-05-13 17:27) [7]

Забыл
GlobalUnlock(hGlobal);
GlobalFree(hGlobal);

и написать вылет после лабель.


 
ted   (2002-05-25 22:33) [8]

Помогите, плиз...
Бьюсь уже вторую неделю, все препробовал не могу наити ошибку...
Все время показывает в первом задании 16 страниц, а в остальных 0....
procedure TForm1.GetInfo100;
var
hPrinter,hGlobal: THandle;
JobId, cbBuf, dwNeeded: Cardinal;
JB2: PJOBINFO2;
PD: TPrinterDefaults;
begin
Memo5.Lines.Clear;
OpenPrinter(PChar(GetPrinterName), hPrinter, @PD);
hGlobal := GlobalAlloc(GHND, dwNeeded);
JB2:= PJOBINFO2(GlobalLock(hGlobal));
cbBuf:=255;
i:="";
for JobId:=0 to 255 do
if GetJob(hPrinter, JobId, 2, JB2, cbBuf, @dwNeeded) then

With Memo5.Lines, JB2^ do
begin
Add("Dokument name = " + pDocument);
Add("User name = " + pUserName);
Add("PagesPrinted = " + inttostr(PagesPrinted));
Add("TotalPages = " + inttostr(TotalPages));
end;
GlobalUnlock(hGlobal);
GlobalFree(hGlobal);

end;



 
ted   (2002-05-26 13:26) [9]

Помогите плиз, очень нужно......


 
RV   (2002-05-27 13:50) [10]

Ну вот как я делаю ....


uses ...winspool...

function GetEnumeratedPrinterPorts: String;
var
sl: TStringlist;
Buffer, PrinterInfo: PChar;
Flags, Count, NumInfo: DWORD;
I,j: Integer;

PrinterHandle:tHandle;
ZadachiPrintera : array [0..20] of TJobInfo2;
ByteRez,StructCount : DWORD;
Stroka : String;

begin
Result := "";
if Win32Platform = VER_PLATFORM_WIN32_NT then
Flags := PRINTER_ENUM_CONNECTIONS or PRINTER_ENUM_LOCAL
else
Flags := PRINTER_ENUM_DEFAULT or PRINTER_ENUM_LOCAL;
Count := 0;
EnumPrinters(Flags, nil, 2, nil, 0, Count, NumInfo);
if Count = 0 then Exit;
GetMem(Buffer, Count);
try
if not EnumPrinters(Flags, nil, 2, PByte(Buffer), Count, Count, NumInfo) then
Exit;
PrinterInfo := Buffer;
sl:= TStringlist.Create;
stroka:="";
try
for I := 0 to NumInfo - 1 do
with PPrinterInfo2(PrinterInfo)^ do
begin

//


 
RV   (2002-05-27 15:40) [11]

В догонку
про Как узнать что задание пошло на принтер?
пока у меня прога по таймеру ловит, т.к.
procedure WM_SpoolerStatus(var Msg : TWMSPOOLERSTATUS); message WM_SPOOLERSTATUS;
так и не срабатывает, впечатление что нет сообщения WM_SPOOLERSTATUS

как сделать что бы процедурка срабатывала именно тогда, когда задание добавится (удалится) из списка задач принтера
а то некрасиво получается




 
jedi   (2002-05-27 17:24) [12]

Mne stalo interesno i ya atcril MSDN i vot 4to tam nashel:
-------------------------------------------------------------
This message is for informational purposes only. This message is advisory and does not have guaranteed delivery semantics. Applications should not assume that they will receive a WM_SPOOLERSTATUS message for every change in spooler status.

Windows 2000/XP: The WM_SPOOLERSTATUS message is not sent. To be notified of changes to the print queue status, use FindFirstPrinterChangeNotification and FindNextPrinterChangeNotification. The following code outlines how this might be done.

HANDLE chgObject;
DWORD *pdwChange;
BOOL fcnreturn;

chgObject = FindFirstPrinterChangeNotification( hPrinter, PRINTER_CHANGE_JOB, 0, NULL);
WaitForSingleObject(chgObject, INFINTE);
fcnreturn = FindNextPrinterChangeNotification(chgObject, pdwChange, NULL, NULL);
if (fcnreturn) {
// check value of *pdwChange and deal with the indicated change

ya proveril v win9x sobshenie posilaetsea, a dlea win2000/xp pridetsea delat" kak v primere iz MSDN.

Best regards!


 
RV   (2002-05-28 12:23) [13]

Приветствую всех!
Приветствую jedi!

не понятно несколько...можно на делфях пример?
я начинающий - не понятно как это работает
вот с сообщением WM_SPOOLERSTATUS понятно - ну типа прога подписалась на него, тебе дальше пофигу - процедурка сработает когда надо
а сдесь как?

HANDLE FindFirstPrinterChangeNotification(
HANDLE hPrinter, // handle to printer or print server to monitor for changes
DWORD fdwFlags, // flags that specify the conditions to monitor
DWORD fdwOptions, // reserved, must be zero
LPVOID pPrinterNotifyOptions // pointer to structure specifying printer information to monitor
);

Parameters
hPrinter
Handle to the printer or print server that you want to monitor. This handle is obtained by calling the OpenPrinter function.

т.е. надо OpenPrinter вызывать. периодично что-ли?
]да, тогда что же, опять таймер нужен? толков тогда от нее (повторю, можть я не понимаю чего - объяните бестолковому)
]нет, тогда я вот как раз вообще не понимаю....
плз, хелп! не кодом, так хоть пояснением механизма работы этого дела
СПАСИБО заранее


 
ted   (2002-05-31 15:04) [14]

Всем привет!
> RV
Я нарыл вот такую прогу, она срабатывает, когда задание идет на печать, и показывает сколько заданий отправлено.
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;

type
TForm1 = class(TForm)
Label1: TLabel;
private
{ Private declarations }
procedure WM_SpoolerStatus(var Msg : TWMSPOOLERSTATUS);
message WM_SPOOLERSTATUS;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}


procedure TForm1.WM_SpoolerStatus(var Msg : TWMSPOOLERSTATUS);

begin
Label1.Caption := IntToStr(msg.JobsLeft) +
" Jobs currenly in spooler";
msg.Result := 0;
end;
end.


 
ted   (2002-05-31 15:05) [15]

> RV
Попробую соединить, если получиться вышлю на мыло.


 
RV   (2002-05-31 15:42) [16]

всех поздравляю с моим днем рождения!
>to ted
Я же г-рю выше,
procedure WM_SpoolerStatus(var Msg : TWMSPOOLERSTATUS); message WM_SPOOLERSTATUS;
так и не срабатывает

винда потому что, как г-рит jedi, 2000.
и енто правильно (не посылается там енто сообщение).



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

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

Наверх





Память: 0.49 MB
Время: 0.007 c
3-23961
Doctor
2002-07-19 11:27
2002.08.08
Year,Month,Day


1-24045
Андрусь
2002-07-22 19:37
2002.08.08
Неясная реакция среды


3-23858
kaif
2002-07-17 15:05
2002.08.08
И все-таки нужен нормальный инсталлятор IB/Firebird/Yaffil


3-23951
Nonam
2002-07-17 14:09
2002.08.08
Delphi 6 Update 2


1-24047
xyz
2002-07-25 00:29
2002.08.08
слова в RichEdit





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский