?
Solved

select a word from a Word Document to process using Delphi

Posted on 2002-05-06
8
Medium Priority
?
639 Views
Last Modified: 2007-11-27
Hi guys,

Im working in a spanish check speller program written in delphi. Im using OLE automation to create an instance of Word application. I can load a document from Delphi and also, I can insert text from my delphi application to Word.

So, having a document loaded in Word, I want to get word by word (from Word document to Delphi), so I can process it with my check spell method and then return back corrected to the word document. I think I have to use some sort of select text method but I cant find how to use it...

Any expert around here to help me? I will give the points to a working example...

best regards,
Manuel Lopez (lopem)

Ps.This is the unit I am using:

unit WordAuto;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;

type
  TForm1 = class(TForm)
    LaunchButton: TButton;
    CloseButton: TButton;
    Memo1: TMemo;
    NewDocButton: TButton;
    TypeTextButton: TButton;
    WordText: TEdit;
    Label1: TLabel;
    procedure LaunchButtonClick(Sender: TObject);
    procedure CloseButtonClick(Sender: TObject);
    procedure NewDocButtonClick(Sender: TObject);
    procedure TypeTextButtonClick(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private Declarations }
    procedure AppQuit(Sender: TObject);
    procedure AppDocumentChange(Sender: TObject);
    procedure DocNew(Sender: TObject);
    procedure DocOpen(Sender: TObject);
    procedure DocClose(Sender: TObject);
  public
    { Public Declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

uses
  AutoImpl;

var
  WordObject : TWordObject;

procedure TForm1.LaunchButtonClick(Sender: TObject);
begin
  if not Assigned(WordObject) then
  begin
    WordObject := TWordObject.Create;
    with WordObject do
    begin
      Caption := 'Delphi is RAD!';
      Visible := True;
      OnQuit := AppQuit;
      OnDocumentChange := AppDocumentChange;
      OnNewDocument := DocNew;
      OnOpenDocument := DocOpen;
      OnCloseDocument := DocClose;
    end;
    LaunchButton.Enabled := False;
    CloseButton.Enabled := True;
    NewDocButton.Enabled := True;
  end;
end;

procedure TForm1.CloseButtonClick(Sender: TObject);
begin
  if Assigned(WordObject) then begin
    LaunchButton.Enabled := True;
    CloseButton.Enabled := False;
    NewDocButton.Enabled := False;
    TypeTextButton.Enabled := False;
    WordObject.Free;
    WordObject := nil;
  end;
end;

procedure TForm1.AppDocumentChange(Sender: TObject);
begin
  Memo1.Lines.Add('Document changed');
  TypeTextButton.Enabled := WordObject.Application.Documents.Count > 0;
end;

procedure TForm1.AppQuit(Sender: TObject);
begin
  Memo1.Lines.Add('Quitting Word');
  WordObject.Free;
  WordObject := nil;
  LaunchButton.Enabled := True;
  CloseButton.Enabled := False;
  NewDocButton.Enabled := False;
  TypeTextButton.Enabled := False;
end;

procedure TForm1.DocNew(Sender: TObject);
begin
  Memo1.Lines.Add('New document');
end;

procedure TForm1.DocOpen(Sender: TObject);
begin
  Memo1.Lines.Add('Document opened');
end;

procedure TForm1.DocClose(Sender: TObject);
begin
  Memo1.Lines.Add('Document closed');
end;

procedure TForm1.NewDocButtonClick(Sender: TObject);
begin
  try
    WordObject.NewDoc('');
  except
    ShowMessage('It seems like somebody killed Word and didn''t tell me about it...');
    if Assigned(WordObject) then begin
      LaunchButton.Enabled := True;
      CloseButton.Enabled := False;
      NewDocButton.Enabled := False;
      TypeTextButton.Enabled := False;
      WordObject.Free;
      WordObject := nil;
    end;
  end;
end;

procedure TForm1.TypeTextButtonClick(Sender: TObject);
begin
  WordObject.InsertText(WordText.Text);
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  if Assigned(WordObject) then begin
    WordObject.Free;
    WordObject := nil;
  end;
end;

end.


But... i dont know how i can get word by word from Word document to Delphi.
0
Comment
Question by:lopem
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 5
  • 3
8 Comments
 
LVL 11

Expert Comment

by:robert_marquardt
ID: 6992894
I would write the spell checker as WLL (Word Addin DLL).
You can write procedures which can be easily assigned to Word menu items.
From there on it is mainly calling VBA. Install the VBA help of Word.
Do NOT use the index properties of the collections of Word. They are SLOW.
I made such an Addin for Word 97 and Word 97 was buggy as hell.
0
 
LVL 3

Author Comment

by:lopem
ID: 6994230
Hi Robert,

How you can write a WLL? I dont really know. In fact, I just want to know how to get an item (a word) from a Word Document to process it in my Delphi application and returnr the item (modified) to the Word document.

Best regards,
Manuel Lopez (lopem)
0
 
LVL 3

Author Comment

by:lopem
ID: 6997288
50 more points!

Any taker?
best wishes
Manuel Lopez (lopem)
0
VIDEO: THE CONCERTO CLOUD FOR HEALTHCARE

Modern healthcare requires a modern cloud. View this brief video to understand how the Concerto Cloud for Healthcare can help your organization.

 
LVL 11

Expert Comment

by:robert_marquardt
ID: 6997315
My Word knowledge is a bit rusty (Word 97). A WLL is nothing but a DLL with some functions with certain names exported. It is placed in a directory of the Word installation where Word loads it and calls the functions. The WLL stays loaded as long as word runs. You can export your own functions from the WLL and bind them in Word to new menu entries.
From the WLL you use COM to automate Word. The complete VBA of Word is available through COM so you implement something which is almost a VBA macro. The VBA help of Word is normally on the Word installation CD, but is not installed per default.

Please nag me and i will send you some WLL source code (in C i am afraid).
0
 
LVL 3

Author Comment

by:lopem
ID: 6997364
Robert,

please send me your c code. Let me see if i can figure out how to do that!  Thanks in advance... My email is morsa@la-morsa.com

best regards
Manuel Lopez (lopem)
0
 
LVL 11

Accepted Solution

by:
robert_marquardt earned 450 total points
ID: 6998105
The good news is hat it is Pascal (Delphi 4 code) , the bad news is that i will need some time to write english comments and strip some confidential parts. I hope to achieve that until Sunday.
0
 
LVL 3

Author Comment

by:lopem
ID: 6998106
Hi Robert,

I appreciate your effort. Where are you from by the way? Are you from Germany?
Anyway, I will looking forward for your code...

best regards,
Manuel Lopez (lopem)
0
 
LVL 3

Author Comment

by:lopem
ID: 7003297
Thanks Robert, It seems I can work around your code...

best regards
Manuel López (lopem)

0

Featured Post

Industry Leaders: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

The uses clause is one of those things that just tends to grow and grow. Most of the time this is in the main form, as it's from this form that all others are called. If you have a big application (including many forms), the uses clause in the in…
In this tutorial I will show you how to use the Windows Speech API in Delphi. I will only cover basic functions such as text to speech and controlling the speed of the speech. SAPI Installation First you need to install the SAPI type library, th…
Add bar graphs to Access queries using Unicode block characters. Graphs appear on every record in the color you want. Give life to numbers. Hopes this gives you ideas on visualizing your data in new ways ~ Create a calculated field in a query: …
Visualize your data even better in Access queries. Given a date and a value, this lesson shows how to compare that value with the previous value, calculate the difference, and display a circle if the value is the same, an up triangle if it increased…
Suggested Courses
Course of the Month8 days, 20 hours left to enroll

764 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question