Q&A

  • 워드 문서로 보이기....소스 좀 봐주세요...
음.. 디비그리드의 내용을 워드로 또는 메모의 내용을 워드로... 보내는것을

하고 싶은데.. 음..버튼을 클릭하면 워드를 띄우고, 워드에 새문서 추가 해야

하고.그리고,, 폼에 있는 데이타(일단, 메모에 있는 글이라고 하져..)를 워드로

보내야 하져.. 그리고.. 버튼을 클릭할때마다 워드가 계속 뜨는 것을 방지

해야 하고여.. 그리고.. 폼이 닫히면.. 워드도 같이 닫혀야 합니다...

그리고.. 기존에 워드가 떠 있으면.. 버튼을 클릭했을때.. 체크해서 보이기나

아니면 워드를 실행해서 보여야 하고..음... 까다롭나?

간단하긴 한데.. 몰라서 질문 드립니다.. 아래 코드는 제가 이리저리 왔다 갔다

하면서 이것저것 해본건데요... 주석문으로 달아 놓은것을 보시고..

체크해 주세요...

그럼 아래는 소스입니다...

참고로.. 델 5를 썼고여... 델5업그레이드를 해서.. 아래 uses절에

word2000을 추가 했습니다.. 업그레이드를 하지 않으신분은 word97을

써주세요..

답변안해주면.... 쿠데타 일을킬꼬야...(협박)^^;

unit word;



interface



uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

word2000, StdCtrls;



type

TForm1 = class(TForm)

Button1: TButton;

Memo1: TMemo;

Button2: TButton;

Button3: TButton;

Button4: TButton;

procedure Button1Click(Sender: TObject);

procedure FormClose(Sender: TObject; var Action: TCloseAction);

procedure Button2Click(Sender: TObject);

procedure FormDestroy(Sender: TObject);

procedure Button4Click(Sender: TObject);

private

{ Private declarations }

Word: _Application;

public

{ Public declarations }



end;



var

Form1: TForm1;



implementation

uses

comobj, ActiveX;

{$R *.DFM}



procedure TForm1.Button1Click(Sender: TObject);

var

Word: Variant;

Unknown: IUnknown;

Result: HResult;

begin

Result := GetActiveObject(CLASS_wordApplication, nil, Unknown);

if (Result <> 0) then

begin

Word := CreateOleObject('Word.Basic');

Word.FileNew;

Word.AppShow;

Word.Insert(Memo1.Lines.Text);

end

else begin

try

word.visible := true; // 여기서 에러

except

showmessage('예외발생');

end;

end;

end;



procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);

begin

// 클로우즈때 워드도 닫고 폼도 닫고 하고 싶은데.. 안된다..

word.quit; // 에러 발생..

end;



procedure TForm1.Button2Click(Sender: TObject);

var

Word: _Application;

Unknown: IUnknown;

Result: HResult;

Template :OleVariant;

DocTemplate : OleVariant;

NewTemplate : OleVariant;

begin

Result := GetActiveObject(CLASS_WordApplication, nil, Unknown);

if (Result <> 0) then begin

Word := CoWordApplication.Create;

DocTemplate := Template;

NewTemplate := False;

// word.Documents.Add(DocTemplate, NewTemplate); //새문서를 추가 하고 싶은데 안된다..

Word.Visible := True;

end

else begin

OleCheck(Result);

OleCheck(Unknown.QueryInterface(_Application, Word));

Word.Visible := True;

end;



end;



procedure TForm1.FormDestroy(Sender: TObject);

begin

//헐... 어떻게 해야 할까...(종료될때 워드를 안닫는다...ㅠ.ㅠ)

// word.Quit;<--- 에러

end;



procedure TForm1.Button4Click(Sender: TObject);

var

WordApp : Variant ;

WinHandle : hwnd ;

Result : HResult;

Unknown: IUnknown;

begin

Result := GetActiveObject(CLASS_wordApplication, nil, Unknown);

if (Result = 0) then begin // 이미 워드가 실행중인지를 체크

WordApp.Visible := true; // <--- 에러 발생

//Project Pword.exe raised exception class EoleError with message 'Variant does

//Not reference an automation object. Process stopped. Use Step or Run to continue.

//에러 메시지가 위와 같이 나온다.

end //if문의 끝

else begin

try

WordApp := CreateOLEObject ( 'Word.Application') ;

// SetForegroundWindow( WinHandle );

WordApp.Documents.Add ; //새문서 추가

WordApp.Insert(Memo1.Lines.Text); //<---- 에러발생

except

Application.MessageBox ( 'MS Word를 열 수 없습니다' + chr(13) +

'MS Word가 설치되어있는지 확인하십시요' , '알림' , MB_OK ) ;

end; //try 문의 끝

WordApp.Visible := True ;

end; //esle문의 끝

end;

end.

1  COMMENTS
  • Profile
    류응철 2000.06.03 00:02
    좀 더 간단한 코드가 있을거라고 생각합니다...

    일단 워드가 실행중이면 워드 종료후 프로그램을 종료하고여..

    워드가 실행중이 아니면 프로그램만 종료합니다..

    procedure TForm1.FormDestroy(Sender: TObject);

    var

    VClose: OleVariant;

    WordActivated: Boolean;

    begin

    WordActivated := False;

    VClose := findwindow('opusapp', nil);//워드의 클래스명이 opusapp이다

    if VClose = 0 then

    close

    else begin

    VClose := GetActiveOleObject('Word.Application');

    VClose.Application.Quit;

    WordActivated := True;

    end;

    end;