Delphi-Word Automation refresh Issues
History/Archivio
Delphi-Word Automation refresh Issues
2 msg
[borland.public.delphi.oleautomation]
Delphi-Word Automation refresh Issues
Jen Collier [Feb 25 2004, 10:08]
Can anyone help with a few refresh issues that users are experiencing when using word automation from Delphi?
When users save documents in Word, the whole screen is refreshed and the vertical scroll bar at the right hand side of the screen has duplicated, so there are 2 vertical scroll bars. If the user clicks in the middle of the outer vertical scroll bar, all of the toolbar buttons underneath the drop down menus at the top of the screen completely disappear and the scroll bar changes colour to black.
The work around at the moment is for the users to click on the arrow at the bottom of the outer vertical scroll bar to correct the scroll bars so that one remains.
We're using an Ole Container modified to control word, this is the attached word container.pas. The form we use the container in is the DocEdit.pas/dfm. If they save a document (in the OLE Container in Delphi) then we have to clear the document and reload it to make the flag behave correctly.
Users experiencing the problem are using Win XP Professional SP1, application written in Delphi 6.0, Office 2000 standard up to SP3. They are not running Norton anti virus software, but do run an app called Hayes DX which they have to close down before attempting to hook into word from the Delphi app otherwise they get the error message 'call was rejected by callee'.
Any suggestions for the scroll bar phenomenon much appreciated.
Regards
Jennifer Collier
WORDCONTAINER.PAS
{Word Interface Component using VBA and TOleContainer to
allow viewing and editing of Microsoft Word documents.
To open a word doc, set CurrentDocFile := 'C:/Path/Docname.doc';
To edit the document on opening, call WordContainer1.ActivateDocument
from FormShow.
To have the Word toolbar appear where you want it, place 2 panels on
a form. One has TWordContainer and Locked := True. The other has
Locked := False and the toolbar will appear there.
Note that the document is deactivated when any other TWinControl gets
focus. Use the Activate button to reactivate the document. A separate
form is used for control buttons to prevent activate/deactivate of
the document whenever a mode change is made.
This app and component are not all-inclusive nor perfect, but they go
a long way toward having a usable Word container.
Freeware--no support, no warranty, no liability.
}
unit WordContainer;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, ExtCtrls,
OleCtnrs, Dialogs, WinProcs, StdCtrls, Buttons, {Word_TLB}Word2000, Variants;
type
TWordPageFit = (pfNone, pfFullPage, pfBestFit);
TWordContainer = class(TOleContainer)
private
FDocument: string;
FWordApp: OleVariant;
FCollate, FDisablePrint: Boolean;
FPageFit: TWordPageFit;
FZoom: integer;
function CheckSectionNumber(SecNum: integer): integer;
function GetToolbarIndex(CmdBarName: string): integer;
function GetToolBtnIndex(ToolbarIndex: integer; ButtonName: string): Integer;
function GetChangesMade: Boolean;
protected
function GetDocumentPrinter : string;
procedure SetDocumentPrinter(const Value : string);
procedure SetDocFile(ADoc: string);
procedure SetWordPageFit(Value: TWordPageFit);
procedure SetDisablePrint(Value: Boolean);
public
constructor Create(AOwner: TComponent); override;
procedure ActivateDocument;
procedure DeactivateDocument;
procedure ClearDocRef;
procedure BeginUpdate;
procedure EndUpdate;
procedure SetFontName(FontName: string);
procedure SetParagraphStyle(StyleName: string);
procedure SetZoom(Percent: integer);
procedure InsertText(SomeText: string);
procedure InsertBlankParagraph;
procedure InsertFile(Filename: string);
procedure InsertTable(RowCount, ColumnCount: integer);
procedure TableNextCell;
procedure TableInsertRows(RowsToAdd: integer);
procedure TableDeleteRow;
procedure FindBookmark(BmName: string);
procedure GoToSection(SectionNumber: integer);
procedure DisableToolbars;
procedure ShowHideToolbar(ToolbarName: string; ShowToolbar: Boolean);
procedure ActivatePrintButton(MakeActive: Boolean);
procedure ReplaceAllDocument(OldString, NewString : OleVariant);
procedure AppendDocument(Filename: string);
procedure FirstPageHeaderFooter(SectionNumber: integer; Different: Boolean);
procedure LinkHFtoPrevious(SameAs: Boolean);
procedure AddNewSection;
procedure MakeNewDocument;
procedure RestartSectionNumbering(SecNum: integer);
procedure PrintDocument(Copies: integer);
procedure PrintDocToFile(Filename: string);
procedure SaveDocumentAs(Filename: string);
procedure SaveAsRTF(Filename: string);
procedure LoadFromFile(Filename: string);
procedure SetMargins(SectionNumber: integer; Left, Top, Right, Bottom, HdrDist, FtrDist: single);
procedure SetSectionHeaderFooter;
property DocumentPrinter: string read GetDocumentPrinter write SetDocumentPrinter;
property ChangesMade: Boolean read GetChangesMade;
published
property CollateCopies: Boolean read FCollate write FCollate default False;
property CurrentDocFile: string read FDocument write SetDocFile;
property DisablePrint: Boolean read FDisablePrint write SetDisablePrint default True;
property PageFit: TWordPageFit read FPageFit write SetWordPageFit default pfBestFit;
property Zoom: integer read FZoom write SetZoom default 100;
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('Servers', [TWordContainer]);
end;
constructor TWordContainer.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FCollate := False;
FDisablePrint := True;
FZoom := 100;
FDocument := '';
VarClear(FWordApp);
AllowActiveDoc := True;
AllowInPlace := True;
AutoActivate := aaManual; // Must set to this because when the form opens there is nothing to focus on
AutoVerbMenu := False;
BorderStyle := bsNone;
Align := alClient;
Caption := '';
end;
procedure TWordContainer.BeginUpdate;
begin
FWordApp.ScreenUpdating := False;
end;
procedure TWordContainer.EndUpdate;
begin
FWordApp.ScreenUpdating := True;
end;
procedure TWordContainer.SetDocFile(ADoc: string);
var
LoadError: Boolean;
begin
LoadError := False;
try
LoadFromFile(ADoc);
except
LoadError := True;
end;
if LoadError then
begin
if Length(ADoc) > 0 then
ShowMessage('Error loading ' + ADoc);
FDocument := '';
end;
end;
procedure TWordContainer.LoadFromFile(Filename: string);
begin
CreateObjectFromFile(Filename, False);
FDocument := Filename;
end;
procedure TWordContainer.ActivateDocument;
begin
if State <> osEmpty then
begin
DoVerb(ovShow);
if VarIsEmpty(FWordApp) then
FWordApp := OleObject.Application;
if FDisablePrint then
ActivatePrintButton(False); // Print button on f_Word becomes not available
end;
end;
procedure TWordContainer.DeactivateDocument;
begin
if Showing then
Parent.SetFocus; // Requires an ActiveControl to be set in owner form
end;
function TWordContainer.CheckSectionNumber(SecNum: integer): integer;
begin
if SecNum = 0 then
Result := FWordApp.ActiveDocument.Sections.Count
else
Result := SecNum;
end;
procedure TWordContainer.GoToSection(SectionNumber: integer);
begin
FWordApp.Selection.GoTo(wdGoToSection, wdGoToFirst, CheckSectionNumber(SectionNumber), '');
end;
procedure TWordContainer.SetFontName(FontName: string);
begin
FWordApp.Selection.Font.Name := FontName;
end;
procedure TWordContainer.SetParagraphStyle(StyleName: string);
begin
FWordApp.Selection.Range.Style := StyleName;
end;
procedure TWordContainer.SetDisablePrint(Value: Boolean);
begin
FDisablePrint := Value;
ActivatePrintButton(not Value);
end;
procedure TWordContainer.FindBookmark(BmName: string);
begin
//function GoTo_(var What: OleVariant; var Which: OleVariant; var Count: OleVariant; var Name: OleVariant): Range; safecall;
FWordApp.Selection.GoTo(wdGoToBookmark, EmptyParam, EmptyParam, BmName);
FWordApp.Selection.Find.ClearFormatting;
end;
procedure TWordContainer.InsertText(SomeText: string);
begin
FWordApp.Selection.TypeText(SomeText);
end;
procedure TWordContainer.InsertBlankParagraph;
begin
FWordApp.Selection.TypeParagraph;
end;
procedure TWordContainer.InsertFile(Filename: string);
begin
{ procedure InsertFile(const FileName: WideString; var Range: OleVariant;
var ConfirmConversions: OleVariant; var Link: OleVariant;
var Attachment: OleVariant); safecall;}
FWordApp.Selection.InsertFile(Filename);
end;
procedure TWordContainer.InsertTable(RowCount, ColumnCount: integer);
begin
FWordApp.ActiveDocument.Tables.Add(FWordApp.ActiveDocument.Range, RowCount, ColumnCount);
end;
procedure TWordContainer.TableNextCell;
begin
FWordApp.Selection.MoveRight(wdCell, EmptyParam, EmptyParam);
end;
procedure TWordContainer.TableInsertRows(RowsToAdd: integer);
begin
FWordApp.Selection.InsertRows(RowsToAdd);
end;
procedure TWordContainer.TableDeleteRow;
begin
FWordApp.Selection.Rows.Delete;
end;
procedure TWordContainer.ReplaceAllDocument(OldString, NewString : OleVariant);
var
iSections, iHFIndex : integer;
begin
FWordApp.ActiveDocument.Range(EmptyParam, EmptyParam).Find.ClearFormatting;
{ function Execute(var FindText: OleVariant; var MatchCase: OleVariant; var MatchWholeWord: OleVariant;
var MatchWildcards: OleVariant; var MatchSoundsLike: OleVariant; var MatchAllWordForms: OleVariant;
var Forward: OleVariant; var Wrap: OleVariant; var Format: OleVariant;
var ReplaceWith: OleVariant; var Replace: OleVariant): WordBool; safecall;
}
FWordApp.ActiveDocument.Range(EmptyParam, EmptyParam).Find.Execute( //Search & Replace Main Document
OldString, False, EmptyParam,
False, False, False,
True, wdFindStop, False,
NewString, wdReplaceAll);
//Search & Replace headers and footers
for iSections := 1 to FWordApp.ActiveDocument.Range(EmptyParam, EmptyParam).Sections.Count do
begin
for iHFIndex := 1 to FWordApp.ActiveDocument.Range(EmptyParam, EmptyParam).Sections.Item(iSections).Footers.Count do
FWordApp.ActiveDocument.Range(EmptyParam, EmptyParam).Sections.Item(iSections).Footers.Item(iHFIndex).Range.Find.Execute(
OldString, False, EmptyParam,
False, False, False,
True, wdFindStop, False,
NewString, wdReplaceAll);
for iHFIndex := 1 to FWordApp.ActiveDocument.Range(EmptyParam, EmptyParam).Sections.Item(iSections).Footers.Count do
FWordApp.ActiveDocument.Range(EmptyParam, EmptyParam).Sections.Item(iSections).Headers.Item(iHFIndex).Range.Find.Execute(
OldString, False, EmptyParam,
False, False, False,
True, wdFindStop, False,
NewString, wdReplaceAll);
end;
end;
procedure TWordContainer.AppendDocument(Filename: string);
begin
FWordApp.Selection.EndKey(wdStory);
AddNewSection;
LinkHFtoPrevious(False);
InsertFile(FileName);
end;
procedure TWordContainer.AddNewSection;
begin
FWordApp.Selection.InsertBreak(wdSectionBreakNextPage);
end;
procedure TWordContainer.MakeNewDocument;
begin
FWordApp.Documents.Add(EmptyParam, EmptyParam);
end;
procedure TWordContainer.LinkHFtoPrevious(SameAs: Boolean);
var
SecNum: integer;
begin
SecNum := CheckSectionNumber(0);
FWordApp.ActiveDocument.Sections.Item(SecNum).Headers.Item(wdHeaderFooterFirstPage).LinkToPrevious := SameAs;
FWordApp.ActiveDocument.Sections.Item(SecNum).Footers.Item(wdHeaderFooterFirstPage).LinkToPrevious := SameAs;
FWordApp.ActiveDocument.Sections.Item(SecNum).Headers.Item(wdHeaderFooterPrimary).LinkToPrevious := SameAs;
FWordApp.ActiveDocument.Sections.Item(SecNum).Footers.Item(wdHeaderFooterPrimary).LinkToPrevious := SameAs;
end;
procedure TWordContainer.RestartSectionNumbering(SecNum: integer);
var
Section: OleVariant;
begin
Section := CheckSectionNumber(SecNum);
FWordApp.ActiveDocument.Sections.Item(Section).Headers.Item(wdHeaderFooterFirstPage).PageNumbers.RestartNumberingAtSection := True;
FWordApp.ActiveDocument.Sections.Item(Section).Footers.Item(wdHeaderFooterFirstPage).PageNumbers.RestartNumberingAtSection := True;
FWordApp.ActiveDocument.Sections.Item(Section).Headers.Item(wdHeaderFooterFirstPage).PageNumbers.StartingNumber := 1;
FWordApp.ActiveDocument.Sections.Item(Section).Footers.Item(wdHeaderFooterFirstPage).PageNumbers.StartingNumber := 1;
end;
procedure TWordContainer.FirstPageHeaderFooter(SectionNumber: integer; Different: Boolean);
var
SecNum: OleVariant;
begin
SecNum := CheckSectionNumber(SectionNumber);
FWordApp.ActiveDocument.Sections.Item(SecNum).PageSetup.DifferentFirstPageHeaderFooter := Different;
end;
procedure TWordContainer.SetMargins(SectionNumber: integer; Left, Top, Right, Bottom, HdrDist, FtrDist: single);
var
InsToPts: single;
begin
if Left <> 0 then
begin
InsToPts := Left * 72.27;
FWordApp.ActiveDocument.Range(EmptyParam, EmptyParam).Sections.Item(SectionNumber).PageSetup.LeftMargin := InsToPts;
end;
if Top <> 0 then
begin
InsToPts := Top * 72.27;
FWordApp.ActiveDocument.Range(EmptyParam, EmptyParam).Sections.Item(SectionNumber).PageSetup.TopMargin := InsToPts;
FWordApp.ActiveDocument.Range(EmptyParam, EmptyParam).Sections.Item(SectionNumber).PageSetup.HeaderDistance := InsToPts;
end;
if Right <> 0 then
begin
InsToPts := Right * 72.27;
FWordApp.ActiveDocument.Range(EmptyParam, EmptyParam).Sections.Item(SectionNumber).PageSetup.RightMargin := InsToPts;
end;
if Bottom <> 0 then
begin
InsToPts := Bottom * 72.27;
FWordApp.ActiveDocument.Range(EmptyParam, EmptyParam).Sections.Item(SectionNumber).PageSetup.BottomMargin := InsToPts;
FWordApp.ActiveDocument.Range(EmptyParam, EmptyParam).Sections.Item(SectionNumber).PageSetup.FooterDistance := InsToPts;
end;
if HdrDist <> 0 then
begin
InsToPts := HdrDist * 72.27;
FWordApp.ActiveDocument.Range(EmptyParam, EmptyParam).Sections.Item(SectionNumber).PageSetup.HeaderDistance := InsToPts;
end;
if FtrDist <> 0 then
begin
InsToPts := FtrDist * 72.27;
FWordApp.ActiveDocument.Range(EmptyParam, EmptyParam).Sections.Item(SectionNumber).PageSetup.FooterDistance := InsToPts;
end;
{ With ActiveDocument.Range(Start:=Selection.Start, End:=ActiveDocument.Content.End).PageSetup
.LineNumbering.Active = False
.Orientation = wdOrientPortrait
.TopMargin = InchesToPoints(0.5)
.BottomMargin = InchesToPoints(0.5)
.LeftMargin = InchesToPoints(0.5)
.RightMargin = InchesToPoints(0.5)
.Gutter = InchesToPoints(0)
.HeaderDistance = InchesToPoints(0.25)
.FooterDistance = InchesToPoints(0.5)
.PageWidth = InchesToPoints(8.5)
.PageHeight = InchesToPoints(11)
.FirstPageTray = wdPrinterDefaultBin
.OtherPagesTray = wdPrinterDefaultBin
.SectionStart = wdSectionNewPage
.OddAndEvenPagesHeaderFooter = False
.DifferentFirstPageHeaderFooter = False
.VerticalAlignment = wdAlignVerticalTop
.SuppressEndnotes = False
.MirrorMargins = False
.TwoPagesOnOne = False
.GutterPos = wdGutterPosLeft
End With
}
end;
procedure TWordContainer.SetSectionHeaderFooter;
var
iSections, iHFIndex, iSectionCount: integer;
begin
iSectionCount := FWordApp.ActiveDocument.Range(EmptyParam, EmptyParam).Sections.Count;
for iSections := 2 to iSectionCount do
begin
for iHFIndex := 1 to FWordApp.ActiveDocument.Range(EmptyParam, EmptyParam).Sections.Item(iSections).Footers.Count do
FirstPageHeaderFooter(iHFIndex, False);
FWordApp.ActiveDocument.Range(EmptyParam, EmptyParam).Sections.Item(iSections).PageSetup.DifferentFirstPageHeaderFooter := False;
for iHFIndex := 1 to FWordApp.ActiveDocument.Range(EmptyParam, EmptyParam).Sections.Item(iSections).Headers.Count do
FWordApp.ActiveDocument.Range(EmptyParam, EmptyParam).Sections.Item(iSections).PageSetup.DifferentFirstPageHeaderFooter := False;
end;
end;
procedure TWordContainer.SetWordPageFit(Value: TWordPageFit);
begin
if Value <> FPageFit then
begin
FPageFit := Value;
case FPageFit of
pfNone: FWordApp.ActiveWindow.ActivePane.View.Zoom.PageFit := wdPageFitNone;
pfFullPage: FWordApp.ActiveWindow.ActivePane.View.Zoom.PageFit := wdPageFitFullPage;
else {pfBestFit:}
FWordApp.ActiveWindow.ActivePane.View.Zoom.PageFit := wdPageFitBestFit;
end; // case
end;
end;
function TWordContainer.GetDocumentPrinter: string;
begin
if not (csDesigning in ComponentState) then
Result := FWordApp.ActivePrinter;
end;
procedure TWordContainer.SetDocumentPrinter(const Value : String);
begin
if not (csDesigning in ComponentState) then
FWordApp.ActivePrinter := Value;
end;
procedure TWordContainer.SetZoom(Percent: integer);
begin
FZoom := Percent;
FWordApp.ActiveDocument.ActiveWindow.ActivePane.View.Zoom.Percentage := Percent;
end;
procedure TWordContainer.DisableToolbars;
var
ToolbarIndex: integer;
begin
FWordApp.ActiveDocument.ActiveWindow.DisplayRulers := False;
for ToolbarIndex := 1 to (FWordApp.ActiveDocument.CommandBars.Count) do
FWordApp.ActiveDocument.Commandbars.Item[ToolbarIndex].Enabled := False;
end;
function TWordContainer.GetToolbarIndex(CmdBarName: string): integer;
var
ToolbarIndex: integer;
begin
Result := -1;
for ToolbarIndex := 1 to (FWordApp.ActiveDocument.CommandBars.Count) do
begin
if FWordApp.ActiveDocument.Commandbars.Item[ToolbarIndex].Name = CmdBarName then
begin
Result := ToolbarIndex;
break;
end;
end;
end;
function TWordContainer.GetToolBtnIndex(ToolbarIndex: integer; ButtonName: string): integer;
var
ButtonIndex: integer;
ThisBtn: string;
begin
Result := -1;
for ButtonIndex := 1 to (FWordApp.ActiveDocument.CommandBars.Item[ToolbarIndex].Controls.Count) do
begin
ThisBtn := FWordApp.ActiveDocument.CommandBars.Item[ToolbarIndex].Controls[ButtonIndex].Caption;
if ThisBtn = ButtonName then
begin
Result := ButtonIndex;
break;
end;
end;
end;
procedure TWordContainer.ShowHideToolbar(ToolbarName: string; ShowToolbar: Boolean);
begin
FWordApp.ActiveDocument.Commandbars.Item[GetToolbarIndex(ToolbarName)].Visible := ShowToolbar;
end;
procedure TWordContainer.ActivatePrintButton(MakeActive: Boolean);
var
TBIndex, BtnIndex, KeyCode: integer;
begin
TBIndex := GetToolbarIndex('Standard');
if TBIndex = -1 then
exit;
BtnIndex := GetToolBtnIndex(TBIndex, '&Print...');
if BtnIndex = -1 then
exit;
KeyCode := FWordApp.BuildKeyCode(wdKeyControl, wdKeyP);
if MakeActive then
begin
FWordApp.ActiveDocument.CommandBars.Item[TBIndex].Controls[BtnIndex].Visible := True;
FWordApp.FindKey[KeyCode].Clear;
end else
begin
FWordApp.ActiveDocument.CommandBars.Item[TBIndex].Controls[BtnIndex].Visible := False;
end;
end;
procedure TWordContainer.SaveDocumentAs(Filename: string);
begin
FWordApp.Documents.Item(1).SaveAs(Filename);
FDocument := Filename;
end;
procedure TWordContainer.SaveAsRTF(Filename: string);
begin
FWordApp.Documents.Item(1).SaveAs(Filename, wdFormatRTF, False, '', True, '', False, False, False, False, False);
end;
procedure TWordContainer.PrintDocToFile(FileName : String);
begin
FWordApp.Documents.Item(1).PageSetup.OtherPagesTray := wdPrinterAutomaticSheetFeed; // Maybe not necessary...
FWordApp.Documents.Item(1).PageSetup.FirstPageTray := wdPrinterAutomaticSheetFeed; // if other bugs are gone
FWordApp.Printout(EmptyParam, EmptyParam, EmptyParam,
FileName, EmptyParam, EmptyParam,
EmptyParam, EmptyParam, EmptyParam,
EmptyParam, True,
EmptyParam, FDocument,// FDocument prints our doc in case Word is already open
EmptyParam, EmptyParam);
// Check that the print has finished before exiting the procedure
while FWordApp.BackgroundPrintingStatus > 0 do
begin
Sleep(100);
Application.ProcessMessages;
end;
end;
procedure TWordContainer.PrintDocument(Copies: integer);
begin
// FWordApp.Documents.Item(1).PageSetup.OtherPagesTray := wdPrinterDefaultBin;// wdPrinterAutomaticSheetFeed;
// FWordApp.Documents.Item(1).PageSetup.FirstPageTray := wdPrinterDefaultBin; // wdPrinterAutomaticSheetFeed;
FWordApp.Dialogs.Item(wdDialogFilePrint).Show;
{FWordApp.Printout(EmptyParam, EmptyParam, EmptyParam,
EmptyParam, EmptyParam, EmptyParam,
EmptyParam, Copies, EmptyParam,
EmptyParam, False,
FCollate, FDocument,
EmptyParam, EmptyParam);}
// Check that the print has finished before exiting the procedure
while FWordApp.BackgroundPrintingStatus > 0 do
begin
Sleep(100);
Application.ProcessMessages;
end;
end;
{ ******************* End of TWordContainer ******************}
procedure TWordContainer.ClearDocRef;
begin
VarClear(FWordApp);
end;
function TWordContainer.GetChangesMade: Boolean;
{var
x: TwordApplication;
p: TWordDocument;}
begin
Result := not FWordApp.Documents.Item(1).Saved;
end;
end.
DOCEDIT.PAS
unit DocEdit;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ActnList, Menus, OleCtnrs, WordContainer, OleServer, Word2000,
ImgList{, WinSpool};
type
TEditFormMode = (efmReadOnly, efmEdit, efmPrint, efmPrintToFile);
type
TfrmDocEdit = class(TForm)
mmMain: TMainMenu;
File1: TMenuItem;
mnuSave: TMenuItem;
N1: TMenuItem;
mnuClose: TMenuItem;
alMain: TActionList;
actSave: TAction;
actClose: TAction;
wcMain: TWordContainer;
actPrint: TAction;
Print1: TMenuItem;
imlMain: TImageList;
actCancel: TAction;
actCancel1: TMenuItem;
procedure actSaveExecute(Sender: TObject);
procedure actCloseExecute(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure actPrintExecute(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure actCancelExecute(Sender: TObject);
private
FFormMode: TEditFormMode;
FDocFile: TFileName;
FDocName: string;
FOutputFileName: string;
function Initialise(const AFileName: TFileName; const ADocName: string; const AFormMode: TEditFormMode): Boolean;
procedure SetFormMode(const Value: TEditFormMode);
procedure SetDocFile(const Value: TFileName);
procedure SetDocName(const Value: string);
procedure PrintDocument;
procedure CheckActions;
procedure DoSave;
private
property FormMode: TEditFormMode read FFormMode write SetFormMode;
property DocFile: TFileName read FDocFile write SetDocFile;
property DocName: string read FDocName write SetDocName;
property OutputFileName: string read FOutputFileName write FOutputFileName;
public
function EditFile(const AFileName: TFileName; const ADocName: string='SBMS DOC'): Boolean;
function ViewFile(const AFileName: TFileName; const ADocName: string='SBMS DOC'): Boolean;
function PrintFile(const AFileName: TFileName; const ADocName: string='SBMS DOC'): Boolean;
function PostScriptPrint(const AFileName, PSFileName: TFileName; const ADocName: string='SBMS DOC'): Boolean;
end;
var
frmDocEdit: TfrmDocEdit;
implementation
{$R *.dfm}
uses Globals;
function TfrmDocEdit.PostScriptPrint(const AFileName, PSFileName: TFileName; const ADocName: string): Boolean;
begin
OutputFileName := PSFileName;
Result := Initialise(AFileName, ADocName, efmPrintToFile);
end;
function TfrmDocEdit.PrintFile(const AFileName: TFileName; const ADocName: string): Boolean;
begin
Result := Initialise(AFileName, ADocName, efmPrint);
end;
function TfrmDocEdit.EditFile(const AFileName: TFileName; const ADocName: string): Boolean;
begin
Result := Initialise(AFileName, ADocName, efmEdit);
end;
function TfrmDocEdit.ViewFile(const AFileName: TFileName; const ADocName: string): Boolean;
begin
Result := Initialise(AFileName, ADocName, efmReadOnly);
end;
function TfrmDocEdit.Initialise(const AFileName: TFileName; const ADocName: string;
const AFormMode: TEditFormMode): Boolean;
begin
Result := False;
try
// ALWAYS set FormMode first
FormMode := AFormMode;
DocFile := AFileName; //starts wordcontainer
DocName := ADocName;
case FFormMode of
efmEdit, efmReadOnly:
begin
Self.Width := Screen.Width div 2;
Self.Height := Screen.Height div 2;
Result := (Self.ShowModal = mrOK);
end;
efmPrint, efmPrintToFile:
begin
Self.Show;
Self.Visible := False;
PrintDocument;
Result := True;
Self.Close;
end;
end;
except
on E:Exception do
begin
ShowMessage('' + E.Message);
Result := False;
end;
end;
CheckActions;
end;
procedure TfrmDocEdit.SetDocFile(const Value: TFileName);
begin
FDocFile := Value;
FileSetReadOnly(FDocFile, FFormMode = efmReadOnly);
wcMain.CurrentDocFile := FDocFile;
end;
procedure TfrmDocEdit.SetFormMode(const Value: TEditFormMode);
begin
FFormMode := Value;
case FFormMode of
efmReadOnly:
begin
Self.Caption := 'Viewing Document '+FDocName+' (Read Only)';
end;
efmEdit:
begin
Self.Caption := 'Editing Document '+FDocName;
end;
efmPrint, efmPrintToFile:
begin
Self.Caption := 'Printing Document '+FDocName; { Doesn't really matter }
end;
end;
end;
procedure TfrmDocEdit.actSaveExecute(Sender: TObject);
begin
DoSave;
wcMain.ClearDocRef;
wcMain.DeactivateDocument;
wcMain.CurrentDocFile := FDocFile;
wcMain.ActivateDocument;
CheckActions;
end;
procedure TfrmDocEdit.actCloseExecute(Sender: TObject);
begin
ModalResult := mrOK;
end;
procedure TfrmDocEdit.FormShow(Sender: TObject);
begin
wcMain.ActivateDocument;
if FFormMode in [efmReadOnly, efmEdit] then Self.WindowState := wsMaximized;
CheckActions;
end;
procedure TfrmDocEdit.SetDocName(const Value: string);
begin
FDocName := Value;
end;
procedure TfrmDocEdit.PrintDocument;
var
OldPrinter: string;
begin
with wcMain do
begin
OldPrinter := DocumentPrinter;
try
if FFormMode = efmPrintToFile then
begin
DocumentPrinter := POSTSCRIPT_PRINTER;
PrintDocToFile(FOutputFileName);
end
else
begin
PrintDocument(1);
end;
finally
DocumentPrinter := OldPrinter;
end;
end;
end;
procedure TfrmDocEdit.FormCreate(Sender: TObject);
begin
Self.Height := 0;
Self.Width := 0;
Self.Left := Screen.DesktopLeft;
Self.Top := Screen.DesktopTop;
end;
procedure TfrmDocEdit.CheckActions;
begin
actSave.Enabled := (FFormMode = efmEdit);
actPrint.Enabled := (FFormMode in [efmReadOnly, efmEdit]);
end;
procedure TfrmDocEdit.actPrintExecute(Sender: TObject);
begin
PrintDocument;
end;
procedure TfrmDocEdit.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if (FFormMode = efmEdit) and wcMain.ChangesMade and
(MsgBox('Changes have been made and not saved.'#13'Do you want to save now?',
'Save Changes', MB_ICONQUESTION + MB_YESNO + MB_DEFBUTTON1) = ID_YES) then
begin
DoSave;
end;
wcMain.ClearDocRef;
end;
procedure TfrmDocEdit.actCancelExecute(Sender: TObject);
begin
ModalResult := mrCancel;
end;
procedure TfrmDocEdit.DoSave;
begin
wcMain.SaveDocumentAs(FDocFile);
end;
end.
Re: Delphi-Word Automation refresh Issues
Oliver Townshend [Feb 25 2004, 10:35]
> Users experiencing the problem are using Win XP Professional SP1,
application written in Delphi 6.0, Office 2000 standard up to SP3. They are
not running Norton anti virus software, but do run an app called Hayes DX
which they have to close down before attempting to hook into word from the
Delphi app otherwise they get the error message 'call was rejected by
callee'.
Build a stand alone system which is just WinXP and Office (i.e. no Hayex DX,
or any other unnecessary software). See if you still have the problem.
Oliver
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
콜백 함수를 Angular 하위 구성 요소에 전달이 예제는 구성 요소에 함수를 전달하는 것과 관련하여 최근에 직면한 문제를 다룰 것입니다. 국가 목록을 제공하는 콤보 상자 또는 테이블 구성 요소. 지금까지 모든 것이 구성 요소 자체에 캡슐화되었으며 백엔드에 대한 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.