Solved

select a word from a Word Document to process using Delphi

Posted on 2002-05-06
8
637 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
Technology Partners: 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!

 
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 150 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

Free Tool: Path Explorer

An intuitive utility to help find the CSS path to UI elements on a webpage. These paths are used frequently in a variety of front-end development and QA automation tasks.

One of a set of tools we're offering as a way of saying thank you for being a part of the community.

Question has a verified solution.

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

Creating an auto free TStringList The TStringList is a basic and frequently used object in Delphi. On many occasions, you may want to create a temporary list, process some items in the list and be done with the list. In such cases, you have to…
Introduction Raise your hands if you were as upset with FireMonkey as I was when I discovered that there was no TListview.  I use TListView in almost all of my applications I've written, and I was not going to compromise by resorting to TStringGrid…
If you're a developer or IT admin, you’re probably tasked with managing multiple websites, servers, applications, and levels of security on a daily basis. While this can be extremely time consuming, it can also be frustrating when systems aren't wor…
There's a multitude of different network monitoring solutions out there, and you're probably wondering what makes NetCrunch so special. It's completely agentless, but does let you create an agent, if you desire. It offers powerful scalability …

696 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