S
smock
Здравствуйте!
Объясните чайнику как в Дельфи 7, грамотно вставить код?
Все получается, а вот пункт 4 нет. То есть не могу понять почему при нажатии на F9 вываливается ошибка…если кто подскажет пошагово как правильно создать данную программку буду признателен…А если кто и исходник скинет, что бы посмотреть как все делается правильно вообще зашибись будет… Чесно говоря нужен исходник уже время поджимает
И еще буждет ли работать этот ткод в XP...
uses WinSpool;
…………………..
type JOB_INFO_1_ARRAY = Array of JOB_INFO_1;
…………………..
Function GetSpoolerJobs(sPrinterName : String) : JOB_INFO_1_ARRAY;
var
i : Integer;
hPrinter : THandle;
bResult : Boolean;
cbBuf : DWORD;
pcbNeeded : DWORD;
pcReturned : DWORD;
aJobs : Array[0..99] of JOB_INFO_1;
begin
cbBuf := 1000;
bResult := OpenPrinter(PChar(sPrinterName), hPrinter, Nil);
if NOT bResult then begin
ShowMessage('Error opening the printer');
exit;
end;
bResult := EnumJobs(hPrinter,0,Length(aJobs),1,@aJobs,cbBuf,pcbNeeded,pcReturned);
if NOT bResult then begin
ShowMessage('Error Getting Jobs information');
exit;
end;
ClosePrinter(hPrinter);
for i:=0 to pcReturned-1 do begin
if aJobs.pDocument <> Nil then begin
SetLength(Result, Length(Result)+1);
Result[Length(Result)-1] := aJobs;
end;
end;
end;
Пример использования:
1- Создайте новый проект со StringGrid и Timer.
2- В StringGrid установите свойства “ColCount” и “RowCount” в 20.
3- У таймера (Timer) установите свойство “Interval” в 500.
4- В обработчик события “OnTime” таймера добавьте следующий код:
procedure TForm1.Timer1Timer(Sender: TObject);
var
i, ii : Integer;
aJobs : JOB_INFO_1_ARRAY;
begin
for i:=0 to StringGrid1.ColCount-1 do
for ii:=0 to StringGrid1.RowCount-1 do StringGrid1.Cells[i,ii] := '';
aJobs := GetSpoolerJobs('HP LaserJet 6L PCL');
for i:=0 to Length(aJobs)-1 do begin
StringGrid1.Cells[i,0] := aJobs.pPrinterName;
StringGrid1.Cells[i,1] := aJobs.pMachineName;
StringGrid1.Cells[i,2] := aJobs.pUserName;
StringGrid1.Cells[i,3] := aJobs.pDocument;
StringGrid1.Cells[i,4] := aJobs.pDatatype;
StringGrid1.Cells[i,5] := aJobs.pStatus;
StringGrid1.Cells[i,6] := IntToStr(aJobs.Status);
case aJobs.Status of
JOB_STATUS_PAUSED: StringGrid1.Cells[i,6] := 'JOB_STATUS_PAUSED';
JOB_STATUS_ERROR: StringGrid1.Cells[i,6] := 'JOB_STATUS_ERROR';
JOB_STATUS_DELETING: StringGrid1.Cells[i,6] := 'JOB_STATUS_DELETING';
JOB_STATUS_SPOOLING: StringGrid1.Cells[i,6] := 'JOB_STATUS_SPOOLING';
JOB_STATUS_PRINTING: StringGrid1.Cells[i,6] := 'JOB_STATUS_PRINTING';
JOB_STATUS_OFFLINE: StringGrid1.Cells[i,6] := 'JOB_STATUS_OFFLINE';
JOB_STATUS_PAPEROUT: StringGrid1.Cells[i,6] := 'JOB_STATUS_PAPEROUT';
JOB_STATUS_PRINTED: StringGrid1.Cells[i,6] := 'JOB_STATUS_PRINTED';
JOB_STATUS_DELETED: StringGrid1.Cells[i,6] := 'JOB_STATUS_DELETED';
JOB_STATUS_BLOCKED_DEVQ: StringGrid1.Cells[i,6] := 'JOB_STATUS_BLOCKED_DEVQ';
JOB_STATUS_USER_INTERVENTION: StringGrid1.Cells[i,6] := 'JOB_STATUS_USER_INTERVENTION';
JOB_STATUS_RESTART: StringGrid1.Cells[i,6] := 'JOB_STATUS_RESTART';
JOB_POSITION_UNSPECIFIED: StringGrid1.Cells[i,6] := 'JOB_POSITION_UNSPECIFIED';
else StringGrid1.Cells[i,6] := 'Unknown status...';
end;
end;
StringGrid1.Refresh;
end;
5- Запустите проект и попробуйте что-нибудь отправить на печать из MSWord или другого приложения и посмотрите в stringgrid.
Некоторые замечания и дополнения:
Структура JOB_INFO_1 объявлена в юните WinSpool следующим образом:
JOB_INFO_1 = record
JobId: DWORD;
pPrinterName: PAnsiChar;
pMachineName: PAnsiChar;
pUserName: PAnsiChar;
pDocument: PAnsiChar;
pDatatype: PAnsiChar;
pStatus: PAnsiChar;
Status: DWORD;
Priority: DWORD;
Position: DWORD;
TotalPages: DWORD;
PagesPrinted: DWORD;
Submitted: TSystemTime;
end;
И массив так же можно объявить следующим образом:
aJobs : Array[0..99] of JOB_INFO_1;
Объясните чайнику как в Дельфи 7, грамотно вставить код?
Все получается, а вот пункт 4 нет. То есть не могу понять почему при нажатии на F9 вываливается ошибка…если кто подскажет пошагово как правильно создать данную программку буду признателен…А если кто и исходник скинет, что бы посмотреть как все делается правильно вообще зашибись будет… Чесно говоря нужен исходник уже время поджимает
И еще буждет ли работать этот ткод в XP...
uses WinSpool;
…………………..
type JOB_INFO_1_ARRAY = Array of JOB_INFO_1;
…………………..
Function GetSpoolerJobs(sPrinterName : String) : JOB_INFO_1_ARRAY;
var
i : Integer;
hPrinter : THandle;
bResult : Boolean;
cbBuf : DWORD;
pcbNeeded : DWORD;
pcReturned : DWORD;
aJobs : Array[0..99] of JOB_INFO_1;
begin
cbBuf := 1000;
bResult := OpenPrinter(PChar(sPrinterName), hPrinter, Nil);
if NOT bResult then begin
ShowMessage('Error opening the printer');
exit;
end;
bResult := EnumJobs(hPrinter,0,Length(aJobs),1,@aJobs,cbBuf,pcbNeeded,pcReturned);
if NOT bResult then begin
ShowMessage('Error Getting Jobs information');
exit;
end;
ClosePrinter(hPrinter);
for i:=0 to pcReturned-1 do begin
if aJobs.pDocument <> Nil then begin
SetLength(Result, Length(Result)+1);
Result[Length(Result)-1] := aJobs;
end;
end;
end;
Пример использования:
1- Создайте новый проект со StringGrid и Timer.
2- В StringGrid установите свойства “ColCount” и “RowCount” в 20.
3- У таймера (Timer) установите свойство “Interval” в 500.
4- В обработчик события “OnTime” таймера добавьте следующий код:
procedure TForm1.Timer1Timer(Sender: TObject);
var
i, ii : Integer;
aJobs : JOB_INFO_1_ARRAY;
begin
for i:=0 to StringGrid1.ColCount-1 do
for ii:=0 to StringGrid1.RowCount-1 do StringGrid1.Cells[i,ii] := '';
aJobs := GetSpoolerJobs('HP LaserJet 6L PCL');
for i:=0 to Length(aJobs)-1 do begin
StringGrid1.Cells[i,0] := aJobs.pPrinterName;
StringGrid1.Cells[i,1] := aJobs.pMachineName;
StringGrid1.Cells[i,2] := aJobs.pUserName;
StringGrid1.Cells[i,3] := aJobs.pDocument;
StringGrid1.Cells[i,4] := aJobs.pDatatype;
StringGrid1.Cells[i,5] := aJobs.pStatus;
StringGrid1.Cells[i,6] := IntToStr(aJobs.Status);
case aJobs.Status of
JOB_STATUS_PAUSED: StringGrid1.Cells[i,6] := 'JOB_STATUS_PAUSED';
JOB_STATUS_ERROR: StringGrid1.Cells[i,6] := 'JOB_STATUS_ERROR';
JOB_STATUS_DELETING: StringGrid1.Cells[i,6] := 'JOB_STATUS_DELETING';
JOB_STATUS_SPOOLING: StringGrid1.Cells[i,6] := 'JOB_STATUS_SPOOLING';
JOB_STATUS_PRINTING: StringGrid1.Cells[i,6] := 'JOB_STATUS_PRINTING';
JOB_STATUS_OFFLINE: StringGrid1.Cells[i,6] := 'JOB_STATUS_OFFLINE';
JOB_STATUS_PAPEROUT: StringGrid1.Cells[i,6] := 'JOB_STATUS_PAPEROUT';
JOB_STATUS_PRINTED: StringGrid1.Cells[i,6] := 'JOB_STATUS_PRINTED';
JOB_STATUS_DELETED: StringGrid1.Cells[i,6] := 'JOB_STATUS_DELETED';
JOB_STATUS_BLOCKED_DEVQ: StringGrid1.Cells[i,6] := 'JOB_STATUS_BLOCKED_DEVQ';
JOB_STATUS_USER_INTERVENTION: StringGrid1.Cells[i,6] := 'JOB_STATUS_USER_INTERVENTION';
JOB_STATUS_RESTART: StringGrid1.Cells[i,6] := 'JOB_STATUS_RESTART';
JOB_POSITION_UNSPECIFIED: StringGrid1.Cells[i,6] := 'JOB_POSITION_UNSPECIFIED';
else StringGrid1.Cells[i,6] := 'Unknown status...';
end;
end;
StringGrid1.Refresh;
end;
5- Запустите проект и попробуйте что-нибудь отправить на печать из MSWord или другого приложения и посмотрите в stringgrid.
Некоторые замечания и дополнения:
Структура JOB_INFO_1 объявлена в юните WinSpool следующим образом:
JOB_INFO_1 = record
JobId: DWORD;
pPrinterName: PAnsiChar;
pMachineName: PAnsiChar;
pUserName: PAnsiChar;
pDocument: PAnsiChar;
pDatatype: PAnsiChar;
pStatus: PAnsiChar;
Status: DWORD;
Priority: DWORD;
Position: DWORD;
TotalPages: DWORD;
PagesPrinted: DWORD;
Submitted: TSystemTime;
end;
И массив так же можно объявить следующим образом:
aJobs : Array[0..99] of JOB_INFO_1;