Discussion:
Word und Delphi
(zu alt für eine Antwort)
Klaus Dewald
2005-12-12 22:32:22 UTC
Permalink
Hallo NG,
ich weiß, das Thema hatten wir schon, aber ich googele nun seit 2
Stunden. Ich benötige die Möglichkeit bei der Textübergabe zu Word
Tabulatoren je Zeile zu setzen und den Text dann daran ausrichten zu
lassen. Ich habe es schon mit WordApplication.Paragraphs.TabIndent
versucht, jedoch ohne Ergebnis.

Auch in den Beispielen von djpate.freeserve.co.uk ist nichts darüber zu
finden.

Gerade habe ich Paragraphs.Tabstops.add gefunden. Aber ich erhalte hier
dauernd die Fehlermeldung EOleException - "Falscher Parameter" als
Antwort zur Laufzeit. Die Methode meiner Form sieht so aus:

procedure TMainForm.FormShow(Sender: TObject);
Var cDOTFile : OleVariant;
cDOTPath : OleVariant;
cAlign : OleVariant;
nTabPos : Single;
begin

WordApplication1.Connect;
WordApplication1.Visible := True;
WordApplication1.Options.ReplaceSelection := False;
WordApplication1.Documents.Add(cDOTFile,EmptyParam,EmptyParam,EmptyParam);
WordApplication1.Options.ReplaceSelection := False;
WordDocument1.ConnectTo(WordApplication1.ActiveDocument);
cAlign := 'Left';
nTabPos := 5;
// Bei diesem Aufruf erhalte ich die Meldung
WordDocument1.Paragraphs.TabStops.Add(nTabPos,cAlign,EmptyParam);
Ueberschrift(S);
...
end;

Danke schon mal für Eure Hilfe und Hinweise
Klaus Dewald
Klaus Dewald
2005-12-12 23:09:08 UTC
Permalink
Ich habs gefunden. Tabstops war schon richtig. Ich weiß nur nicht wie
die Unterscheidung Linksbündig, Rechtsbündig etc. als Parameter zu
übergeben ist. Außerdem scheinen die Werte des ersten Parameters nicht
in Millimeter zu sein. Wie kann man das umrechnen? bei Eingabe von 200
erhalte ich einen Tabstop kurz hinter der 7 im Dokument.

Tipps, Ideen?
Danke
Klaus Dewald
Post by Klaus Dewald
Hallo NG,
ich weiß, das Thema hatten wir schon, aber ich googele nun seit 2
Stunden. Ich benötige die Möglichkeit bei der Textübergabe zu Word
Tabulatoren je Zeile zu setzen und den Text dann daran ausrichten zu
lassen. Ich habe es schon mit WordApplication.Paragraphs.TabIndent
versucht, jedoch ohne Ergebnis.
Auch in den Beispielen von djpate.freeserve.co.uk ist nichts darüber zu
finden.
Gerade habe ich Paragraphs.Tabstops.add gefunden. Aber ich erhalte hier
dauernd die Fehlermeldung EOleException - "Falscher Parameter" als
procedure TMainForm.FormShow(Sender: TObject);
Var cDOTFile : OleVariant;
cDOTPath : OleVariant;
cAlign : OleVariant;
nTabPos : Single;
begin
WordApplication1.Connect;
WordApplication1.Visible := True;
WordApplication1.Options.ReplaceSelection := False;
WordApplication1.Documents.Add(cDOTFile,EmptyParam,EmptyParam,EmptyParam);
WordApplication1.Options.ReplaceSelection := False;
WordDocument1.ConnectTo(WordApplication1.ActiveDocument);
cAlign := 'Left';
nTabPos := 5;
// Bei diesem Aufruf erhalte ich die Meldung
WordDocument1.Paragraphs.TabStops.Add(nTabPos,cAlign,EmptyParam);
Ueberschrift(S);
....
end;
Danke schon mal für Eure Hilfe und Hinweise
Klaus Dewald
Gerd-Ulrich Meyer
2005-12-13 20:55:29 UTC
Permalink
Hallo,
Post by Klaus Dewald
Außerdem scheinen die Werte des ersten Parameters nicht
in Millimeter zu sein. Wie kann man das umrechnen? bei Eingabe von 200
erhalte ich einen Tabstop kurz hinter der 7 im Dokument.
Wenn ich mich recht erinnere, rechnet Word (und wahrscheinlich auch
die anderen Office-Produkte) nicht nicht in mm oder ähnlichen
"bekannten" Einheiten, sondern in "Twips". Aber wie der Zusammenhang
zwischen Pixel, Punkten und Milimetern ist, hab ich nicht mehr finden
können. Ich hoffe, es hilft trotzdem ein wenig weiter.

Gruss

Gerd-Ulrich Meyer
Klaus Dewald
2005-12-13 20:43:44 UTC
Permalink
Hi,
Yep, Danke für den Denkanstoss. Tante Google hat geholfen. 576 Twips
sind ein cm und dann je nach Auflösung umrechnen. Scheint einigermaßen
zu klappen.

hast Du evtl. auch Ideen wie man eine bestimmte TAB-Position über die
OLE Automation anspringen kann ohne TABS zu addieren?

Danke nochmals
Klaus Dewald
Post by Gerd-Ulrich Meyer
Hallo,
Post by Klaus Dewald
Außerdem scheinen die Werte des ersten Parameters nicht
in Millimeter zu sein. Wie kann man das umrechnen? bei Eingabe von 200
erhalte ich einen Tabstop kurz hinter der 7 im Dokument.
Wenn ich mich recht erinnere, rechnet Word (und wahrscheinlich auch
die anderen Office-Produkte) nicht nicht in mm oder ähnlichen
"bekannten" Einheiten, sondern in "Twips". Aber wie der Zusammenhang
zwischen Pixel, Punkten und Milimetern ist, hab ich nicht mehr finden
können. Ich hoffe, es hilft trotzdem ein wenig weiter.
Gruss
Gerd-Ulrich Meyer
Gerd-Ulrich Meyer
2005-12-13 23:07:27 UTC
Permalink
Hallo,
Post by Klaus Dewald
hast Du evtl. auch Ideen wie man eine bestimmte TAB-Position über die
OLE Automation anspringen kann ohne TABS zu addieren?
Die Word-VBA-Hilfe liefert mir dazu (Auszüge):

------------------------ snip ----------------------------------------
Verwendung der TabStops-Auflistung

Mit der TabStops-Eigenschaft können Sie die TabStops-Auflistung
zurückgeben. Das folgende Beispiel löscht alle benutzerdefinierten
Tabstopps aus dem ersten Absatz im aktiven Dokument.

ActiveDocument.Paragraphs(1).TabStops.ClearAll
Das folgende Beispiel fügt den markierten Absätzen einen Tabstopp an
der Position 2,5 Zoll hinzu und zeigt anschließend die Position von
jedem Element in der TabStops-Auflistung an.

Selection.Paragraphs.TabStops.Add Position:=InchesToPoints(2.5)
For Each aTab In Selection.Paragraphs.TabStops
MsgBox "Position = " _
& PointsToInches(aTab.Position) & " inches"
Next aTab

Mit TabStops(Index) können Sie ein einzelnes TabStop-Objekt
zurückgeben. (Index ist die Position des Tabstopps in Punkt oder die
Indexnummer.) Tabstopps werden numerisch von links nach rechts entlang
des Lineals indiziert. Das folgende Beispiel entfernt den ersten
benutzerdefinierten Tabstopp aus dem ersten Absatz im aktiven
Dokument.

ActiveDocument.Paragraphs(1).TabStops(1).Clear

------------------------ snip ----------------------------------------

Wieweit das allerdings auf die unterschiedlichen Word-Versionen
zutrifft, kann ich nicht sagen.

Gruss

Gerd-Ulrich Meyer
Klaus Dewald
2005-12-13 22:15:41 UTC
Permalink
Hm, Ich benutze in Delphi die Word Automationsserver. Dort gibt es eine
Tabstops-Eigenschaft der Paragraphs. Doch ich kann diese nur zum Setzen
der einzelnen Tabs benutzen. Zur Positionierung eines bestimmten
Textstücks auf eine bestimmte Tab-Position muß ich immer noch mühsam
TAB+TAB+TAB+Content addieren und als Selection.TypeText dann ausgeben.

Gibt es da nicht etwas besseres?
Post by Gerd-Ulrich Meyer
Hallo,
Post by Klaus Dewald
hast Du evtl. auch Ideen wie man eine bestimmte TAB-Position über die
OLE Automation anspringen kann ohne TABS zu addieren?
------------------------ snip ----------------------------------------
Verwendung der TabStops-Auflistung
Mit der TabStops-Eigenschaft können Sie die TabStops-Auflistung
zurückgeben. Das folgende Beispiel löscht alle benutzerdefinierten
Tabstopps aus dem ersten Absatz im aktiven Dokument.
ActiveDocument.Paragraphs(1).TabStops.ClearAll
Das folgende Beispiel fügt den markierten Absätzen einen Tabstopp an
der Position 2,5 Zoll hinzu und zeigt anschließend die Position von
jedem Element in der TabStops-Auflistung an.
Selection.Paragraphs.TabStops.Add Position:=InchesToPoints(2.5)
For Each aTab In Selection.Paragraphs.TabStops
MsgBox "Position = " _
& PointsToInches(aTab.Position) & " inches"
Next aTab
Mit TabStops(Index) können Sie ein einzelnes TabStop-Objekt
zurückgeben. (Index ist die Position des Tabstopps in Punkt oder die
Indexnummer.) Tabstopps werden numerisch von links nach rechts entlang
des Lineals indiziert. Das folgende Beispiel entfernt den ersten
benutzerdefinierten Tabstopp aus dem ersten Absatz im aktiven
Dokument.
ActiveDocument.Paragraphs(1).TabStops(1).Clear
------------------------ snip ----------------------------------------
Wieweit das allerdings auf die unterschiedlichen Word-Versionen
zutrifft, kann ich nicht sagen.
Gruss
Gerd-Ulrich Meyer
Heinz Zastrau
2005-12-14 10:00:40 UTC
Permalink
Hallo Klaus,
Post by Klaus Dewald
Zur Positionierung eines bestimmten
Textstücks auf eine bestimmte Tab-Position muß ich immer noch mühsam
TAB+TAB+TAB+Content addieren und als Selection.TypeText dann ausgeben.
also für jemanden der sich in den Word-Automation-Server verbissen hat
kann doch ein "TAB+TAB+TAB+Content" keine Mühsal bedeuten?

Wenn du gezielter Positionieren möchtest sind vielleicht Tabellen
interessanter für dich.

Ciao Heinz Z.
Klaus Dewald
2005-12-14 11:10:41 UTC
Permalink
Hallo,
natürlich keine Mühsal. Ist ja schnell getippt. Aber es birgt ein
Problem in sich. Ich versuche meinem Kunden die Möglichkeit zu geben auf
den Inhalt der Übertragung weitestgehend, ohne Programmänderungen machen
zu müssen, Einfluss zu nehmen. Heute übergibt er z.B. 'Angebot' und
einen Produktnamen. Im Programm wird dieser Produktname mit TAB+TAB+TAB
hinter das 'Angebot' gehängt. Wenn er nun später über die INI Datei den
Text 'Angebot' in z.B. 'Insertionsangebot' ändert weil ihm das besser
gefällt, dann überragt dieses neue Word mind. eine weitere
Tabulatorposition. klar kann ich auch in der INI Datei die Anzahl der
TABS eintragen lassen, aber ich hoffte auf eine, für den Kunden,
elegantere Lösung. Mit Tabellen bin ich mir nicht sicher, ob die
Bearbeitungsmöglichkeiten in Word hinterher noch so gegeben sind wie in
einem Fließtextaufbau. Sicher, die Daten wären in einer Tabelle gut
aufgehoben... Ich denke, das probier ich wenigstens mal.

Danke für Deine Hinweise.
Klaus Dewald
Post by Heinz Zastrau
Hallo Klaus,
Zur Positionierung eines bestimmten Textstücks auf eine bestimmte
Tab-Position muß ich immer noch mühsam TAB+TAB+TAB+Content addieren
und als Selection.TypeText dann ausgeben.
also für jemanden der sich in den Word-Automation-Server verbissen hat
kann doch ein "TAB+TAB+TAB+Content" keine Mühsal bedeuten?
Wenn du gezielter Positionieren möchtest sind vielleicht Tabellen
interessanter für dich.
Ciao Heinz Z.
Hans-Peter Diettrich
2005-12-13 10:38:47 UTC
Permalink
Post by Klaus Dewald
Ich habs gefunden. Tabstops war schon richtig. Ich weiß nur nicht wie
die Unterscheidung Linksbündig, Rechtsbündig etc. als Parameter zu
übergeben ist. Außerdem scheinen die Werte des ersten Parameters nicht
in Millimeter zu sein. Wie kann man das umrechnen? bei Eingabe von 200
erhalte ich einen Tabstop kurz hinter der 7 im Dokument.
IMO hängt die Skalierung von dem ab, was in Word eingestellt ist (Inch,
mm, Twips...). Das müßtest Du ggf. vorher selbst abfragen.

Ansonsten bist Du mit solchen Fragen in einer Word-Gruppe besser
aufgehoben, Word hat mit Delphi aber auch garnichts zu tun.

DoDi
Klaus Dewald
2005-12-14 11:14:07 UTC
Permalink
Hallo,
da ich die Delphi Word-Komponenten benutze und mit diesen verschiedene
Funktionen benutzen möchte, denke ich das ich hier schon richtig bin.
ich habe weniger ein Word Problem, als mehr ein Problem in diesen
Komponenten die richtigen Funktionen und Ansätze zu finden.

Wie muß man z.B. die Tabstops auf Linksbündig, Rechtsbündig etc. setzen.
In VB in Word selbst ist das relativ einfach. Aber wie wird das mit den
Delphi Komponenten gemacht?

Danke für Deine Hinweise
Klaus Dewald
Post by Hans-Peter Diettrich
Post by Klaus Dewald
Ich habs gefunden. Tabstops war schon richtig. Ich weiß nur nicht wie
die Unterscheidung Linksbündig, Rechtsbündig etc. als Parameter zu
übergeben ist. Außerdem scheinen die Werte des ersten Parameters nicht
in Millimeter zu sein. Wie kann man das umrechnen? bei Eingabe von 200
erhalte ich einen Tabstop kurz hinter der 7 im Dokument.
IMO hängt die Skalierung von dem ab, was in Word eingestellt ist (Inch,
mm, Twips...). Das müßtest Du ggf. vorher selbst abfragen.
Ansonsten bist Du mit solchen Fragen in einer Word-Gruppe besser
aufgehoben, Word hat mit Delphi aber auch garnichts zu tun.
DoDi
Martin Behrens
2005-12-14 12:57:31 UTC
Permalink
Post by Klaus Dewald
Wie muß man z.B. die Tabstops auf Linksbündig, Rechtsbündig etc. setzen.
In VB in Word selbst ist das relativ einfach. Aber wie wird das mit den
Delphi Komponenten gemacht?
Genauso. Über ".TabStops.Add (" kann man Tabulatoren setzen
(wdAlignTabCenter, wdAlignTabRight, ...).


Martin
Martin Behrens
2005-12-14 12:59:01 UTC
Permalink
Post by Klaus Dewald
Ich habs gefunden. Tabstops war schon richtig. Ich weiß nur nicht wie
die Unterscheidung Linksbündig, Rechtsbündig etc. als Parameter zu
übergeben ist. Außerdem scheinen die Werte des ersten Parameters nicht
in Millimeter zu sein. Wie kann man das umrechnen?
Z. B. mit CentimetersToPoints.


Martin

Klaus Dewald
2005-12-12 23:53:44 UTC
Permalink
Zusatzfrage: Wie kann ich eine bestimmte Tabulatorposition anspringen?
Ich setze z.B.

WordDocument1.Paragraphs.TabStops.Add(IniFile.ReadInteger('WORDDATEI','TAB01',10),EmptyParam,EmptyParam);

WordDocument1.Paragraphs.TabStops.Add(IniFile.ReadInteger('WORDDATEI','TAB02',30),EmptyParam,EmptyParam);

WordDocument1.Paragraphs.TabStops.Add(IniFile.ReadInteger('WORDDATEI','TAB03',100),EmptyParam,EmptyParam);

WordDocument1.Paragraphs.TabStops.Add(IniFile.ReadInteger('WORDDATEI','TAB04',200),EmptyParam,EmptyParam);

WordDocument1.Paragraphs.TabStops.Add(IniFile.ReadInteger('WORDDATEI','TAB05',240),EmptyParam,EmptyParam);

WordDocument1.Paragraphs.TabStops.Add(IniFile.ReadInteger('WORDDATEI','TAB05',350),EmptyParam,EmptyParam);

Nun möchte ich in einer Zeile einen Inhalt auf TAB02 und einen weiteren
Inhalt auf TAB04 setzen. Normalerweise würde ich TAB+TAB+Content
addieren. Wenn aber Content für die Position TAB02 so groß ist, das er
über die Position von TAB03 hinausragt, dann ist ein TAB ausreichend um
auf TAB04 zu kommen. Wie kann ich das ausrechnen wieviele Tabs ich
mitsenden muß, oder gibt es dafür eine Methode oder ein Property das vor
der Ausgabe gesetzt wird?

Paragraphs.TabIndent habe ich schon ausprobiert. Das funktioniert nicht
wie ich mir das vorstelle. Es setzt den Einzug für den ganzen
Paragraphen was anschließend Auswirkungen auf den nachfolgenden Text hat
und jede Menge Verschiebungen produziert.

Vielen Dank für jeden Tipp.
Klaus Dewald
Post by Klaus Dewald
Hallo NG,
ich weiß, das Thema hatten wir schon, aber ich googele nun seit 2
Stunden. Ich benötige die Möglichkeit bei der Textübergabe zu Word
Tabulatoren je Zeile zu setzen und den Text dann daran ausrichten zu
lassen. Ich habe es schon mit WordApplication.Paragraphs.TabIndent
versucht, jedoch ohne Ergebnis.
Auch in den Beispielen von djpate.freeserve.co.uk ist nichts darüber zu
finden.
Gerade habe ich Paragraphs.Tabstops.add gefunden. Aber ich erhalte hier
dauernd die Fehlermeldung EOleException - "Falscher Parameter" als
procedure TMainForm.FormShow(Sender: TObject);
Var cDOTFile : OleVariant;
cDOTPath : OleVariant;
cAlign : OleVariant;
nTabPos : Single;
begin
WordApplication1.Connect;
WordApplication1.Visible := True;
WordApplication1.Options.ReplaceSelection := False;
WordApplication1.Documents.Add(cDOTFile,EmptyParam,EmptyParam,EmptyParam);
WordApplication1.Options.ReplaceSelection := False;
WordDocument1.ConnectTo(WordApplication1.ActiveDocument);
cAlign := 'Left';
nTabPos := 5;
// Bei diesem Aufruf erhalte ich die Meldung
WordDocument1.Paragraphs.TabStops.Add(nTabPos,cAlign,EmptyParam);
Ueberschrift(S);
....
end;
Danke schon mal für Eure Hilfe und Hinweise
Klaus Dewald
Loading...