...use the spell check functionality from word?
|
Autor:
Scrap |
[ Print tip
] | | |
{
Die Rechtschreibprüfung von Word kann für die eigene Zwecke verwendet werden.
So funktionierts:
1. Word mit einem leeren Dokument öffnen
2. Wort, das zu überprüfen ist, an Word übergeben
3. Rechtschreibprüfung von Word starten
4. Ersetztes Wort wieder holen und im Memo wieder einsetzen
Problematik:
- Einige Wörter werden von Word ignoriert:
- Wörter mit Zahlen
- Wörter mit der Länge 1
- Rechtschreibprüfung lässt sich nicht abbrechen
- Wenn Word schon geöffnet ist, kann unter Umständen die Rechtschreibprüfung
nicht gestartet werden (Fehlermeldung: RPC-Server nicht vorhanden)
}
uses Word2000;
function TForm1.IsSatzZeichen(c: CHAR): Boolean;
begin
case c of
'(': Result := True;
')': Result := True;
' ': Result := True;
'.': Result := True;
',': Result := True;
'!': Result := True;
'?': Result := True;
'-': Result := True;
':': Result := True;
';': Result := True;
#$D: Result := True;
#$A: Result := True;
else
Result := False;
end;
end;
procedure TForm1.CheckText(Memo: TMemo);
var
i: Integer;
MySelStart: INTEGER;
Token: string;
Line: string;
ReplaceStr: string;
WordList: TStrings;
varFalse: OleVariant;
begin
// Läuft Word?
if EXE_Running('WINWORD.EXE', False) then
begin
if mrYes = MessageDlg('Word ist geöffnet.' + #13 + #10 +
'Für die Rechtschreibprüfung muss Word beendet werden.' + #13 + #10 +
'' + #13 + #10 + 'Word abschiessen?', mtWarning, [mbYes, mbNo], 0) then
begin
KillTask('WINWORD.EXE');
end;
end
else
begin
// Startwerte
i := 1;
Line := Memo.Text;
WordList := TStringList.Create;
// Memo traviersieren und einzelne Wörter (Token) rausholen
while not (Line[i] = #0) do
begin
Token := '';
// Tokem zusammenstellen
while not IsSatzZeichen(Line[i]) do
begin
Token := Token + Line[i];
Inc(i);
end;
if Token <> '' then
begin
// Token speichern
WordList.Add(Token);
end;
if IsSatzZeichen(Line[i]) then
begin
// "Token" speichern
WordList.Add(Line[i]);
Inc(i);
end;
end;
// Verbindung zu Word aufbauen
WordApp.Disconnect;
WordDoc.Disconnect;
WordApp.Connect;
WordApp.Visible := False;
// Leeres Dokument erzeugen
WordDoc.ConnectTo(WordApp.Documents.Add(EmptyParam, EmptyParam, EmptyParam, EmptyParam));
MySelStart := 0;
// WordList traversieren und auf Rechschreibung prüfen
for i := 0 to WordList.Count - 1 do
begin
if not IsSatzzeichen(Wordlist[i][1]) then
begin
WordApp.Visible := False;
// WordDokumentinhalt löschen
WordDoc.Range.Delete(EmptyParam, EmptyParam);
// Token in Word einfügen
WordDoc.Range.Set_Text(WordList[i]);
// Rechtschreibprüfung aufrufen
WordApp.Visible := False;
WordDoc.CheckSpelling;
WordApp.Visible := False;
// Resultat von der Rechtschreibprüfung holen und aufbereiten
ReplaceStr := WordDoc.Range.Get_Text;
WordApp.Visible := False;
ReplaceStr := ReplaceString(ReplaceStr, #$D, '');
// Neues Wort in Memo einfügen
Memo.SetFocus;
Memo.SelStart := MySelStart;
Memo.SelLength := Length(WordList[i]);
Memo.SelText := ReplaceStr;
WordList[i] := ReplaceStr;
end;
MySelStart := MySelStart + Length(WordList[i]);
end;
MessageDlg('Rechtschreibprüfung abgeschlossen.', mtInformation, [mbOK], 0);
// Verbindung zu Word abbrechen und Word schliessen ohne zu speichern
WordDoc.Disconnect;
WordApp.Disconnect;
varFalse := False;
WordApp.Quit(varFalse);
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
// Rechtschreibprüfung durchführen
CheckText(Memo1);
end;
|