Delphi Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
델파이 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
FreePascal/Lazarus
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
델마당
볼랜드포럼 광고 모집

델파이 Q&A
Delphi Programming Q&A
[3662] [질문] 프린터 다이올로그(쪽설정)기능을 구현하려면..
아이야 [ ] 1373 읽음    1998-07-15 20:52
조금 어려운 질문 인지 모르겠군요.

프린터의 쪽설정 기능을 구현하려 합니다. 델파이 에서 제공하는 프린트
다이올로그 박스는 이용에 제약이 많아 메모장의 쪽설정 다이올로그 박스를
이용하려 합니다.

이렇게 소스를 코딩하니까 메모장의 쪽설정 다이올로그를 가져오더군요

------소 스----
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;

------ 소스 끝---

그런데 이렇게 읽어서 저장한 각종 옵션이 이데로 저장이 되는 지요.
제가 어떻게 하여야 설정값을 실제 프린트를 할때 반영할 수 있을까요.

프린터를 유연하게 제어할 수 있는 방법을 아시면 조언을 부탁드립니다.

기쁨이 넘치는 하루하루가 되십시오.



+ -

관련 글 리스트
3662 [질문] 프린터 다이올로그(쪽설정)기능을 구현하려면.. 아이야 1373 1998/07/15
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.