いつも参考にさせていただき有難うございます。
プリンターで2種類のサイズに印刷するのですが、2回目に用紙サイズを設定しようとすると、GlobalLockの戻り値がnilに成ります。
プリンターの終了処理が悪いのですか、教えて下さい。
XP D4です。
ADevice, ADriver, APort: array[0..512] of Char;
ADeviceMode: THandle;
ADevMode : ^TDevMode;
procedure TForm1.PriBtnClick(Sender: TObject);
Printer.GetPrinter(ADevice, ADriver, APort, ADeviceMode);
if ADeviceMode <> 0 then begin
ADevMode := GlobalLock(ADeviceMode); //***2回目ここでnilになる
if (P_No.ItemIndex = 0) then begin // 用紙1
ADevMode^.dmPaperLength := Trunc(Inc_Pix * 4.5);
ADevMode^.dmPaperWidth := Inc_Pix * 9;
end else begin
ADevMode^.dmPaperLength := P_Round(Inc_Pix * 4.0);
ADevMode^.dmPaperWidth := P_Round(Inc_Pix * 7.5);
end;
GlobalUnLock(ADeviceMode);
Printer.SetPrinter(ADevice, ADriver, APort, ADeviceMode);
・
・
Printer.BeginDoc; // 印刷処理開始
Printer.NewPage;
・
・
Printer.EndDoc; // 終了
DeleteObject(Printer.Canvas.Font.Handle);
if ADeviceMode <> 0 then begin
GlobalUnlock(ADeviceMode);
GlobalFree(ADeviceMode);
ADeviceMode := 0;
end;
DeleteDC(W_PHand);
end;
end;
とりあえず、GlobalUnlockを2回しているのと、
GetPrinterの返したメモリハンドルやらCanvasのフォントやらを
勝手にDelete/Freeしちゃっていいの?というところが気になりますね。
torさん、ご回答有難うございました。
> Printer.EndDoc; // 終了
の後の処理を削除したら処理出来るようになりました。 有難うございました。
メモリーの解放等の処理が良くわからないもので、いろんなサンプルから引用しました。印刷が終わったら解放しようと思いました。
ツイート | ![]() |