조금 어려운 질문 인지 모르겠군요.
프린터의 쪽설정 기능을 구현하려 합니다. 델파이 에서 제공하는 프린트
다이올로그 박스는 이용에 제약이 많아 메모장의 쪽설정 다이올로그 박스를
이용하려 합니다.
이렇게 소스를 코딩하니까 메모장의 쪽설정 다이올로그를 가져오더군요
------소 스----
procedure TF_PrtCtl.Button1Click(Sender: TObject);
begin
PageDialog;
end;
{===============================================================================}
function TF_PrtCtl.PageDialog: Boolean; //Print Dialog를 추가하자
{===============================================================================}
var
PageDlgRec: TPageSetupDlg;
DevHandle: THandle;
begin
FillChar(PageDlgRec, SizeOf(PageDlgRec), 0);
PageDlgRec.lStructSize := SizeOf(PageDlgRec);
PageDlgRec.hInstance :={System.}HInstance;
GetPrinter(DevHandle,PageDlgRec.hDevNames);
PageDlgRec.hDevMode := CopyData(DevHandle);
Printer.Orientation := poPortrait;
PageDlgRec.hWndOwner := Application.Handle;
if TaskModalDialog(@PageSetupDlg, PageDlgRec) then Result:=true else Result:=false;
Refresh;
SetPrinter(PageDlgRec.hDevMode, PageDlgRec.hDevNames);
end;
procedure GetPrinter(var DeviceMode, DeviceNames: THandle);
var
Device, Driver, Port: array[0..79] of char;
DevNames: PDevNames;
Offset: PChar;
begin
Printer.GetPrinter(Device, Driver, Port, DeviceMode);
if DeviceMode <> 0 then
begin
DeviceNames := GlobalAlloc(GHND, SizeOf(TDevNames) +
StrLen(Device) + StrLen(Driver) + StrLen(Port) + 3);
DevNames := PDevNames(GlobalLock(DeviceNames));
try
Offset := PChar(DevNames) + SizeOf(TDevnames);
with DevNames^ do
begin
wDriverOffset := Longint(Offset) - Longint(DevNames);
Offset := StrECopy(Offset, Driver) + 1;
wDeviceOffset := Longint(Offset) - Longint(DevNames);
Offset := StrECopy(Offset, Device) + 1;
wOutputOffset := Longint(Offset) - Longint(DevNames);;
StrCopy(Offset, Port);
end;
finally
GlobalUnlock(DeviceNames);
end;
end;
end;
function CopyData(Handle: THandle): THandle;
var
Src, Dest: PChar;
Size: Integer;
begin
if Handle <> 0 then
begin
Size := GlobalSize(Handle);
Result := GlobalAlloc(GHND, Size);
if Result <> 0 then
try
Src := GlobalLock(Handle);
Dest := GlobalLock(Result);
if (Src <> nil) and (Dest <> nil) then Move(Src^, Dest^, Size);
finally
GlobalUnlock(Handle);
GlobalUnlock(Result);
end
end
else Result := 0;
end;
function TaskModalDialog(DialogFunc: Pointer; var DialogData): Bool;
type
TDialogFunc = function(var DialogData): Bool stdcall;
var
ActiveWindow: HWnd;
WindowList: Pointer;
begin
ActiveWindow := GetActiveWindow;
WindowList := DisableTaskWindows(0);
try
Result := TDialogFunc(DialogFunc)(DialogData);
finally
EnableTaskWindows(WindowList);
SetActiveWindow(ActiveWindow);
end;
end;
procedure SetPrinter(DeviceMode, DeviceNames: THandle);
var
DevNames: PDevNames;
begin
DevNames := PDevNames(GlobalLock(DeviceNames));
try
with DevNames^ do
Printer.SetPrinter(PChar(DevNames) + wDeviceOffset,
PChar(DevNames) + wDriverOffset,
PChar(DevNames) + wOutputOffset, DeviceMode);
finally
GlobalUnlock(DeviceNames);
GlobalFree(DeviceNames);
end;
end;
------ 소스 끝---
그런데 이렇게 읽어서 저장한 각종 옵션이 이데로 저장이 되는 지요.
제가 어떻게 하여야 설정값을 실제 프린트를 할때 반영할 수 있을까요.
프린터를 유연하게 제어할 수 있는 방법을 아시면 조언을 부탁드립니다.
기쁨이 넘치는 하루하루가 되십시오.
|