unit ControlWordS;

interface

uses Classes, Sysutils, Word97;

type
  TControlWord = class(TComponent)
  private
    { Private declarations }
    FWordApp : TWordApplication;
  public
    { Public declarations }
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;

    function OpenWordFile(DocPath : String) : Boolean;

    procedure myAppQuit(Sender: TObject);
    { 將游標移到本行第一碼 }
    procedure MoveToLineFirst;
    { 將游標移到本行最後一碼 }
    procedure MoveToLineEnd(Selected : Boolean);
    { 將游標移到本頁最前 }
    procedure MoveToPageFirst;
    { 將游標移到本頁最後 }
    procedure MoveToPageEnd;
    { 將游標向右移動N碼 }
    procedure MoveToRight(Selected : Boolean; lCount : Integer);
    { 設定書籤 }
    procedure AddBookMark(BookMarkName : String);
    { 移動到指定的書籤上 }
    function GotoBookMark(BookMarkName : String) : Boolean;
    { 切換頁首頁尾 }
    procedure ChangSeekType(ViewType : String);
    { 取得游標現在所在頁次 }
    function GetNowPageNumber : Integer;
    { 存檔 }
    procedure SaveDocument(DocPath : String);

    function FindText(KeyStr : String) : Boolean;

  published
    { Published declarations }
  end;


implementation

{ TControlWord }

procedure TControlWord.AddBookMark(BookMarkName: String);
var aRange, aDefaultSorting : OleVariant;
begin
  With FWordApp Do
  Begin
    aRange := Selection.Range;
    ActiveDocument.Bookmarks.Add(BookMarkName, aRange);
    aDefaultSorting := wdSortByName;
    ActiveDocument.Bookmarks.DefaultSorting := aDefaultSorting;
    ActiveDocument.Bookmarks.ShowHidden := True;
  End;
end;

procedure TControlWord.ChangSeekType(ViewType: String);
var aSeekTYpe : OleVariant;
begin
  If UpperCase(ViewType) = 'PAGEFOOTER' Then
    aSeekTYpe := wdSeekCurrentPageFooter
  Else If UpperCase(ViewType) = 'PAGEHEADER' Then
    aSeekTYpe := wdSeekCurrentPageHeader
  Else aSeekTYpe := wdSeekMainDocument;
  With FWordApp Do
  Begin
    ActiveWindow.ActivePane.View.SeekView := aSeekTYpe;
  End;
end;

constructor TControlWord.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FWordApp := TWordApplication.Create(Self);
  FWordApp.OnQuit := myAppQuit;
end;

destructor TControlWord.Destroy;
begin
  FWordApp.Disconnect;
  FWordApp.Free;
  inherited Destroy;
end;

function TControlWord.FindText(KeyStr: String): Boolean;
begin
  //
end;

function TControlWord.GetNowPageNumber: Integer;
var
  aPageType : OleVariant;
  NowPageNumber : Integer;
begin
  aPageType := wdActiveEndPageNumber;
  NowPageNumber := FWordApp.Selection.Information[aPageType];
  Result := NowPageNumber;
end;

function TControlWord.GotoBookMark(BookMarkName: String): Boolean;
var aWhat, aWhich, aCount, aName : OleVariant;
begin
  with FWordApp Do
  Begin
    aWhat := wdGoToBookmark;
    aName := BookMarkName;
    Result := True;
    If ActiveDocument.Bookmarks.Exists(aName) Then
      Selection.GoTo_(aWhat, aWhich, aCount, aName)
    Else Result := False;
  End;
end;

procedure TControlWord.MoveToLineEnd(Selected: Boolean);
var aUnit, aExtend : OleVariant;
begin
  With FWordApp Do
  Begin
    aUnit := wdLine;
    aExtend := wdExtend;
    If Selected Then
      Selection.EndKey(aUnit, aExtend)
    Else
      Selection.EndKey(aUnit, EmptyParam);
  End;
end;

procedure TControlWord.MoveToLineFirst;
var aUnit : OleVariant;
begin
  With FWordApp Do
  Begin
    aUnit := wdLine;
    Selection.HomeKey(aUnit, EmptyParam);
  End;
end;

procedure TControlWord.MoveToPageEnd;
var aUnit : OleVariant;
begin
  With FWordApp Do
  Begin
    aUnit := wdStory;
    Selection.EndKey(aUnit, EmptyParam);
  End;
end;

procedure TControlWord.MoveToPageFirst;
var aUnit : OleVariant;
begin
  With FWordApp Do
  Begin
    aUnit := wdStory;
    Selection.HomeKey(aUnit, EmptyParam);
  End;
end;

procedure TControlWord.MoveToRight(Selected: Boolean; lCount: Integer);
var
  aUnit, aExtend, aCount : OleVariant;
begin
  With FWordApp Do
  Begin
    aUnit := wdCharacter;
    aExtend := wdExtend;
    aCount := lCount;
    If Selected Then
      Selection.MoveRight(aUnit, aCount, aExtend)
    Else
      Selection.MoveRight(aUnit, aCount, EmptyParam);   
  End;
end;

procedure TControlWord.myAppQuit(Sender: TObject);
begin
  FWordApp.Disconnect;
end;

function TControlWord.OpenWordFile(DocPath : String): Boolean;
var FFIleName : OleVariant;
begin
  FFileName := DocPath;
  FWordApp.Documents.Open(FFileName, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam);
  FWordApp.Visible := True;
end;

procedure TControlWord.SaveDocument(DocPath: String);
var
  aDocFileName , aDocFileFormat: OleVariant;
begin
  aDocFileName := DocPath;
  aDocFileFormat := wdFormatDocument;
  FWordApp.ActiveDocument.SaveAs(aDocFileName, aDocFileFormat, EmptyParam, EmptyParam,
    EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam);
end;

end.