Entwickler-Ecke

Dateizugriff - Word dokumente erstellen und gestalten


WileECoyote - So 06.11.05 19:10
Titel: Word dokumente erstellen und gestalten
Hallo,

wenn ich aus Delphi heraus nach Word "drucke", wie kann ich da das Layout gestalten?
Ich hätte gern eine Kopf sowie eine Fußzeile (mit Linien vom Arbeitsbereich getrennt)
mit automatischen Seitenzahlen, Erstellungsdatum etc.
(ich möchte ungern mit einer Vorlage arbeiten)
Außerdem würde ich ganz gerne die Elemente, die ich nach Word exportiere vernünftig anordnen.
Kann mir vielleicht jemand sagen, wie das geht?
Ich exportiere sowohl normalen Text als auch Grafiken.

Wäre super, wenn hierfür jemand einen Tipp hätte, wenn möglich auch mit Quellcode, weil ich hiervon leider absolut keine Ahnung habe.

Danke im voraus und beste Grüße,

Wile E.


Keldorn - So 06.11.05 20:29

wenn du auch das Layout selber festlegen willst, kommst du mit einem Reportgenerator wie Rave oder Quickreport (je nach Delphiversion) sicher besser.

Wenn du in Word bleiben willst: zeichne dir Makros auf und gugg sie dir in VB an, damit hast du alle notwendigen Befehle und Konstanten. Die Forensuche hilft dir hier auch um die Stolpersteinchen zu finden.

Mfg Frank


WileECoyote - So 06.11.05 22:49

Hallo Keldorn,

muss leider in Word bleiben, ist Vorgabe.
Oder kann ich das alles in einem Quickreport machen und den anschließend nach Word exportieren? (mit Kopf-/Fusszeile etc.?)

Das mit dem Makros aufzeichnen war eigentlich ne sehr geile Idee, leider klappt das mit der Umsetzung der Befehle in Delphi nicht so wirklich.

Gibt es denn nicht irgendwo eine Hilfe, in der ich alle Befehle, die ich mit dem OleVarinat machen kann, stehen? Hier im Forum finde ich leider auch nicht die Sachen, die ich brauche.

Danke und Gruß, Wile E.


Keldorn - So 06.11.05 22:53

user profile iconWileECoyote hat folgendes geschrieben:

Das mit dem Makros aufzeichnen war eigentlich ne sehr geile Idee, leider klappt das mit der Umsetzung der Befehle in Delphi nicht so wirklich.

bei was denn zum Beispiel?

wie gesagt, ich kann dir nur empfehlen, dir die Bsp im Forum anzuschauen. Es gibt ein paar Sachen, die ein wenig anders laufen (z.B. über die items eigenschaft gehen), aber wiklich schwer ist es nicht.

Mfg Frank


WileECoyote - Mo 07.11.05 00:10

Hallo,

ein Beispiel habe ich hier:

Ich versuche, eine Kopf/Fusszeile einzufuegen, aber ich komme nicht mal in die "Nähe", dass es funktionieren könnte...



Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
ActiveWindow.ActivePane.View.SeekView = wdSeekCurrentPageHeader

NormalTemplate.AutoTextEntries("Erstellt von, Seite, Datum").Insert Where _
        :=Selection.Range, RichText:=True

If Selection.HeaderFooter.IsHeader = True Then
   ActiveWindow.ActivePane.View.SeekView = wdSeekCurrentPageFooter
Else
   ActiveWindow.ActivePane.View.SeekView = wdSeekCurrentPageHeader
End If

NormalTemplate.AutoTextEntries("Seite X von Y").Insert Where:=Selection. _
Range, RichText:=True

Selection.TypeText Text:="                          GftSollIst"


Ich habe jetzt noch herausgefunden, dass es eine Wordapplication gibt.
In den Beispielen ist das immer mit Word2000 gemacht worden. Funktioniert dass nur damit? Ich habe nämlich Word2003 und bei mir klappt der Befehl "connect" schon nicht.

Gruß, Wile E.


Keldorn - Mo 07.11.05 19:40

user profile iconWileECoyote hat folgendes geschrieben:

In den Beispielen ist das immer mit Word2000 gemacht worden.

das ist meistens egal. Am Anfang der delphi-Installation wirst du gefragt, welche Wordpackages du einbinden willst. Nachträglich kannst du das auch noch ändern -> siehe OH. es hängt natürlich davon ab, welche Delphi Verions du verwendest, mit Deelphi6 hast du nur die 97 und 2000-Office packages.

user profile iconWileECoyote hat folgendes geschrieben:
Funktioniert dass nur damit? Ich habe nämlich Word2003 und bei mir klappt der Befehl "connect" schon nicht.

klappt nicht, absolut geniale und aussagekräftige Fehlerbeschreibung :roll:

einen Teil des makros (anzeigewechsel Kopf/Fußzeile) kannst du dir sparen.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
procedure TForm1.Button1Click(Sender: TObject);
Var _index,_Richtext:olevariant;
begin
  //eine Wordapplication auf die Form, alle einstellugen so lassen
  WordApplication1.Connect;
  try
    //neues Dokument hinzufügen und zu diesem verbinden
    WordDocument1.ConnectTo(WordApplication1.Documents.Add(EmptyParam,EmptyParam,EmptyParam,EmptyParam));
    WordApplication1.Selection.TypeText('Hallo');

    //Kopzeile anzeigen und Text einfügen
    WordApplication1.ActiveWindow.ActivePane.View.SeekView := wdSeekCurrentPageHeader;
    _index := 'Erstellt von, Seite, Datum';
    _Richtext:=true;
    WordApplication1.NormalTemplate.AutoTextEntries.Item(_index).Insert(WordApplication1.Selection.range,_richtext);

    //fußzeile anzeigen und Text einfügen
    WordApplication1.ActiveWindow.ActivePane.View.SeekView := wdSeekCurrentPageFooter;
    _index := 'Seite X von Y';
    _Richtext:=true;
    WordApplication1.NormalTemplate.AutoTextEntries.Item(_index).Insert(WordApplication1.Selection.range,_richtext);
    //text zentrieren
    WordApplication1.Selection.ParagraphFormat.Alignment := wdAlignParagraphCenter;

    //wieder zurück zum Dokument
    WordApplication1.ActiveWindow.ActivePane.View.SeekView := wdSeekMainDocument;

    //"Enter" und nochmal was vom Text
    WordApplication1.Selection.TypeParagraph;
    WordApplication1.Selection.TypeText('blabla');
    //worddocument close, save etc. -> Forensuche
  finally
    WordApplication1.Disconnect;
  end;
end;


Wenn du es ein paar mal gemacht hast, weißt du, auf was du aufpassen mußt (zuwas gehört z.B. Selection, NormalTemplate -> zu Wordapplication), das du die Items-Eigenschaft verwenden mußt (steht im Makro nicht drin) und mit Hilfe der Codevervollständigung bekommst du auch schnelle raus, wann du mit OleVariant arbeiten mußt.

Aber wenn du schon am Anfang Probleme hast, wird der Weg mehr als steinig, ich würd mir das wirklich nochmal überlegen ob Word wirklich das richtige ist. wieso und für was ist das Vorgabe?

Mfg Frank


WileECoyote - Di 08.11.05 00:32

Hallo Keldorn,

sorry, dass ich erst jetzt wieder hier bin, aber Scheisslanger Arbeitstag und dann musste ich bis eben noch eine Bedienungsanleitung für die Zwischenversion erstellen...

Erstmal vielen Danke für deine viele Hilfe...der Quelltextausschnitt ist supergenial, dass ist genau dass, wo ich gestern Nacht 3 Stunden lang rumgemacht habe...echt super!!!!!

Du hast recht, über das "Autovervollständigen" finde ich schon die Befehle die ich brauche, aber ich komm irgendwie mit den OLEVARIANT-Variablen nicht klar, die Funktionsaufrufe gehen dann immer nicht, weil ich nicht weiss, was ich da reinschreiben soll und dann bekomm´ ich immer die Fehlermeldung "Die Typen der formalen und der tatsächlichen Parameter müssen übereinstimmen..."...ja du hast recht, wird wohl noch sehr steinig, aber ist leider Vorgabe so...dass Projekt mach ich neben der Arbeit für einen Verlag, und die haben bis jetzt bei allen Projekten eine "druckfunktion" nach Word...da muss man sich halt fügen.

Das mit dem Connect hab ich inzwischen auch hinbekommen...so spät vergisst man schon mal das TWordapplication.create...

Ich habe mir mal in einer Schleife alle Namen der Autotextentries ausgeben lassen. Kann ich die alle als String übergeben, so wie du das unten gemacht hast? Oder muss ich den Wert "Value" nehmen?

Und wenn du mir noch sagen könntest, wie ich Linien unter die Kopf- und über die Fusszeile bekomme, wäre ich der glücklichste Mensch auf Erden...oder auf jeden Fall nah dran.

Also, nochmals vielen vielen Dank für deine Hilfe,

beste Grüße aus Braunschweig,

Wile E.


Keldorn - Di 08.11.05 14:03

z.B. hinter WordApplication1.NormalTemplate.AutoTextEntries


Delphi-Quelltext
1:
2:
3:
    WordApplication1.Selection.Borders.Item(wdBorderBottom).LineStyle :=wdLineStyleDouble;
    WordApplication1.Selection.Borders.Item(wdBorderBottom).LineWidth :=wdLineWidth050pt;
    WordApplication1.Selection.Borders.Item(wdBorderBottom).Color     :=wdColorRed;


wdborderbottom: die andere Konstanten siehe OH vom VBA_Word oder über die codevervollständigung.

dort wo Olevariant steht, kannst du keine Strings etc. übergeben, da mußt du über eine Variable gehen.

Mfg Frank


WileECoyote - Do 10.11.05 22:02

hi keldorn,

nochmals vielen vielen dank für deine hilfe!!!
und auch nochmals sorry, dass ich mich dann nicht melde, aber arbeit ist im moment chaos...
zwei fragen hab ich noch:

kann ich denn dem olevariant nen string mitgeben und ihn dann als inputparameter verwenden?
(dass hatte ich schonmal versucht, und immer die meldung bekommen, dass die tatsächlichen mit den formalen parameternübereinstimmen müssen???)

und wenn ich wordapplication.normaltemplate....verwende, überschreib ich mir dann nicht die normal.dot? habe nämlich, nachdem ich die geöffneten dokumente schließen wollte, öfter mal die meldung bekommen, dass ich die normal.dot speichern soll? gibt es auch sowas wie actualtemplate??


vielen dank und beste grüße aus braunschweig,

Wile E.


WileECoyote - Do 10.11.05 22:43

sorry, nochmal ich...

warum verwendest du wordapplication.activewindow...müßte es nicht activedocument sein?

was ist der unterschied??

gruß, wile E.


WileECoyote - Fr 11.11.05 01:07

hi,

jetzt habe ich noch folgendes problem:

ich möchte zur zeit nur in der kpfzeile) textfelder hinzufügen. eins soll rechts, das andere soll links ausgerichtet sein.
ich bekomme das aber mit dem formfields.add nicht hin:

variante 1:




Delphi-Quelltext
1:
2:
3:
formfeld:=myword.ActiveDocument.FormFields.Add(myword.Selection.Range,wdFieldFormTextInput);
formfeld.Name:='ueberschrift';
formfeld.Range.Text:=name;


hier bekomme ich immer den fehler "Dieser Befehl ist nicht verfügbar".

die andere variante war:


Delphi-Quelltext
1:
2:
3:
4:
5:
var _field : TOleEnum;
...

_field := wdFieldFormTextInput;
myword.ActiveDocument.FormFields.Add(myword.Selection.Range,_field);


aber auch hier bekomme ich die fehlermeldung...habe diese varianten beide aus dem forum...warum klappt das nicht?

und wie kann ich das machen, dass ich sie nachher ansprechen kann?
hier im forum habe ich gesehen, dass es, nachdem sie einmal angelegt sind, mit

Delphi-Quelltext
1:
2:
myword.ActiveDocument.FormFields.Item(formfeld.name).Range.Text:=name;
myword.ActiveDocument.Formfields.Item('Text1').Result := name;


geht, also muss ich ihnen ja wie im ersten beispiel einen namen zuweisen??


und wie kann ich die dinger denn in derselben zeile rechts und links ausrichten?
ich brauch nicht unbedingt formfields, habe es vorher nur über typetext versucht, wenn ich die aber nacheinander auf das formular gepackt habe und jeweils anschließend das selection.paragraphformat.alignment gesetzt habe, sind beide ausdrücke nach rechts bzw. links gewandert???

Delphi-Quelltext
1:
2:
3:
4:
myword.Selection.TypeText(name);
myword.Selection.ParagraphFormat.Alignment:= wdalignparagraphleft;
myword.Selection.TypeText('Evaluierung GFT Sol[l]Ist');
myword.Selection.ParagraphFormat.Alignment:= wdalignparagraphright;


wär super, wenn du mir dass noch zeigen könntest

vielen dank schonmal im vorraus,

Wile E.

ps: bei den autotextentries wird "Seite X von Y" nicht angezeigt? kann das an der vorlage liegen(normal.dot evtl zerschossen??)


Keldorn - Fr 11.11.05 18:42

user profile iconWileECoyote hat folgendes geschrieben:
hi keldorn,
kann ich denn dem olevariant nen string mitgeben und ihn dann als inputparameter verwenden?
(dass hatte ich schonmal versucht, und immer die meldung bekommen, dass die tatsächlichen mit den formalen parameternübereinstimmen müssen???)

Beispiel?

user profile iconWileECoyote hat folgendes geschrieben:
und wenn ich wordapplication.normaltemplate....verwende, überschreib ich mir dann nicht die normal.dot? habe nämlich, nachdem ich die geöffneten dokumente schließen wollte, öfter mal die meldung bekommen, dass ich die normal.dot speichern soll? gibt es auch sowas wie actualtemplate??

Mußt du in der Wordhilfe nachlesen, ob es sowas gibt. Alternativ den Text selber schreiben, auf einem nicht dt. System wird der AutotextEintrag sowieso nicht da sein

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
Var: _type,_Text,_PreserveFormatting:olevariant;
...
    WordApplication1.Selection.TypeText('Seite ');
    _Type:=wdFieldEmpty;
    _Text:='PAGE';
    _PreserveFormatting:=true;
    WordApplication1.Selection.Fields.Add(WordApplication1.Selection.Range,_type,_Text,_PreserveFormatting);
    WordApplication1.Selection.TypeText(' von ');
    _Text:='NUMPAGES';
    WordApplication1.Selection.Fields.Add(WordApplication1.Selection.Range,_type,_Text,_PreserveFormatting);


user profile iconWileECoyote hat folgendes geschrieben:

warum verwendest du wordapplication.activewindow...müßte es nicht activedocument sein?

Ich richte mich nach den Makros. Es kommt auch immer drauf an, wenn du nur dSachen ins Dok reinschreibst und es nicht wider brauchst, reicht das meiner Meinung nach. Wenn du länger Zeit damit arbeitest (z.B. Daten reinschreiben, Nutzer kann noch was ändern und anschließend wird es vom Delphiprog geschlossen) würde ich nicht mehr mit activedocument arbeiten. Das Risko wäre zu groß, das der Anwender in der Zwischenzeit ein anderes Dok geöffnet hat, mit activedocument greifst du dann vielleicht aufs falsche zu. du kannst dir noch ein Worddoc auf die Form pappen und dich zu dem Connecten.

user profile iconWileECoyote hat folgendes geschrieben:

und wie kann ich die dinger denn in derselben zeile rechts und links ausrichten?
ich brauch nicht unbedingt formfields, habe es vorher nur über typetext versucht, wenn ich die aber nacheinander auf das formular gepackt habe und jeweils anschließend das selection.paragraphformat.alignment gesetzt habe, sind beide ausdrücke nach rechts bzw. links gewandert???

Mach das mal in Word nach ;) dann wird dir klar, das das so nicht gehen kann. Nutze Tabs.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
    WordApplication1.Selection.TypeParagraph;
    WordApplication1.Selection.TypeText('Links'+chr(vk_tab)+'Rechts');
    _Alignment:= wdAlignTabRight;
    _Leader   := wdTabLeaderSpaces;
    WordApplication1.Selection.ParagraphFormat.TabStops.Add(
         WordApplication1.CentimetersToPoints(15.87),
         _Alignment,
         _Leader);



Delphi-Quelltext
1:
2:
3:
4:
var _field : Olevariant  
...  
_field := wdFieldFormTextInput;  
myword.ActiveDocument.FormFields.Add(myword.Selection.Range,_field);

geht.

alternativ: http://www.dsdt.info/tipps/?id=599
Auch hier: in der Word-VB-Hilfe nachschauen, welche Eigenschaften es gibt, da gibts bestimmt auch den Namen.
Bei Formularfeldern mußt du aufpassen: Word prüft nicht, ob der Name schon vergeben wurde. Du kannst 2 Felder "Bla" erstellen und bekommst später evtl Problem beim Zugriff.

Mfg Frank


WileECoyote - Fr 11.11.05 18:56

hi frank,

aber wie gebe ich den formfields einen namen, dass ich sie wieder ansprechen kann??
auch in dem beispiel auf "dsdt" werden immer nur bestehende felder gefüllt.

und bei


Delphi-Quelltext
1:
2:
3:
4:
var _field : Olevariant  
...  
_field := wdFieldFormTextInput;  
myword.ActiveDocument.FormFields.Add(myword.Selection.Range,_field);

bekomme ich immer die fehlermeldung: "Befehl nicht verfügbar".

irgend ne idee? ich kanns mir nicht erklären, denn den quelltext habe ich ja auch schon in diversen beiträgen gesehen

gibt es eigentlich irgendein buch, in dem dieser kram irgendwie beschrieben ist?

danke und gruß, Wile E.


Keldorn - Sa 12.11.05 20:52

Doch das geht. Aber nicht in der Kopf/Fußzeile, probiers in Word, geht auch nicht, wie auch. Ein Textformularfeld macht nur Sinn, wenn es einmal existert.


Delphi-Quelltext
1:
2:
3:
4:
5:
Var _Formfield:Formfield;
...
    _field := wdFieldFormTextInput;
    _Formfield:=WordApplication1.ActiveDocument.FormFields.Add(WordApplication1.Selection.Range,_field);
    _Formfield.Name := 'TestName';


Mfg frank


WileECoyote - Mo 14.11.05 02:00

hi frank,

ich wiederhole mich, aber vielen dank für deine hilfe!!

nun habe ich noch eine frage:

kann ich irgendwie feststellen, an welcher position (horizontal) ich bin?

in der kopfzeile soll nämlich zunächst (links) der dateiname stehen und (rechts) der programmname
wenn ich nun dazwischen 2 tabs einfüge, klappt das auch schonmal ganz gut
wenn der anwender aber z.b. "iiiiii" als dateiname angibt, passt das nicht mehr, (da brauch ich dann 3) wohingegen es bei "aaaaaa" passt. die character zu zählen bringt mir also nichts und die schrift so anzupassen, dass für jeder buchstabe denselben platz braucht, sieht sch.... aus.

gibts da ne möglichkeit?

oder kann man, nachdem man zum beispiel zunächst beide begriffe eingefügt hat, mit moveleft an den anfang des programmnamens springen und so lange leerzeichen einfuegen, bis der name umgebrochen werden würde?

danke und gruß, Wile E.


Keldorn - Mo 14.11.05 21:21

konkretes Bsp wäre hilfreich, so richtig verstehe ich es nicht. Warum nicht einen rechtsbündigen Tab? 2 Tabs würde ich nie setzen, wenn dann einen und die Position entsprechend setzen und nicht die Standardtabs nutzen.

Mfg Frank


WileECoyote - Di 15.11.05 18:47

hi frank,

hier mal das beispiel:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
   myword.ActiveWindow.ActivePane.View.SeekView := wdSeekCurrentPageHeader;
   myword.Selection.TypeText(dateiname);
   myword.Selection.TypeText(chr(vk_tab)+chr(vk_tab));
   myword.Selection.Font.Bold := wdtoggle;
   myword.Selection.Font.Name:='Verdana';
   _alignment := wdaligntabcenter;
   _Leader := wdtableaderspaces;
   //myword.Selection.ParagraphFormat.TabStops.Add(myword.CentimetersToPoints(10),_Alignment,_Leader);
   myword.Selection.TypeText('Evaluierung GFT Sol[l]Ist');


der "dateiname" soll links ausgerichtet sein und er kann theoretisch beliebigen text enthalten, von einem buchstaben bis...
der text "Evaluierung GFT Sol[l]Ist" soll rechtsbündig stehen.

dass kriege ich im moment nur hin, wenn ich die beiden tabs dazwischen schreibe...ist der dateiname nun allerdings sehr kurz, ist es ein tab zu wenig, wenn der dateiname recht lang ist, entsprechend
mit dem paragraphformat habe ich auch rumexperimentiert, passiert aber ungefähr gar nichts, egal ob ich einen zentimeter angebe oder zehn...

vielen dank und beste grüße aus braunschweig,

Wile E.


Keldorn - Di 15.11.05 20:22

mein bsp oben macht doch bereits das, was du willst.
außerdem fügst du einen zentrierten Tab ein, das da weder weas links noch rechtsbündiges rauskommt, ist klar ;)


WileECoyote - Di 15.11.05 21:02

das mit dem centertab steht da, weil ich ein bisschen rumgespielt habe...

es wird mir aber nur ein ganz normaler tab eingefügt (habe jetzt nochmal dein beispiel kopiert),
so dass das "rechts" aus deinem beispiel in der mitte steht


Keldorn - Di 15.11.05 22:20

dann zeig nochmal deinen richtigen code


WileECoyote - Mi 16.11.05 02:16

hi frank,

hier mal der "komplette" quelltext...ich habe, wie gesagt, dass problem, dass in der kopfzeile
der programmname nicht richtig ausgerichtet wird.

noch eine frage...am schluss füge ich ja ein textfeld ein...mein problem ist nun, dass ich
mit der "selection" da nicht mehr rauskomme...alles, was ich danach schreibe, geht in die
textbox....hab das schon mit seekview etc. probiert, klappt aber alles nicht



Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
 if iswordinstalled
  then begin
 try

   screen.Cursor:=crhourglass;
   myword := TWordApplication.Create(nil);
   mydoc:= TWorddocument.Create(nil);
   myword.Connect;
   myword.Visible:=false;
   mydoc.ConnectTo(myword.Documents.Add(EmptyParam,EmptyParam,EmptyParam,EmptyParam));

//   Kopfzeile einfuegen  #####################################################
   myword.ActiveWindow.ActivePane.View.SeekView := wdSeekCurrentPageHeader;
   //myword.Selection.TypeText(dateiname);
   myword.Selection.Borders.Item(wdborderbottom).LineStyle := wdlinestylesingle;
   myword.Selection.Borders.Item(wdborderbottom).LineWidth := wdlinewidth100pt;
   myword.Selection.Borders.Item(wdborderbottom).Color := wdcolorblack;
   //myword.Selection.TypeText(chr(vk_tab)+chr(vk_tab));
   myword.Selection.TypeText(dateiname+chr(vk_tab)+'Evaluierung GFT Sol[l]Ist');
   _alignment := wdaligntabright;
   _Leader := wdtableaderspaces;
   myword.Selection.ParagraphFormat.TabStops.Add(myword.CentimetersToPoints(15.87),_Alignment,_Leader);
//**************************************************************************************************
// hier ist der programmname immer nur mittig
//**************************************************************************************************
   //myword.Selection.TypeText('Evaluierung GFT Sol[l]Ist');

   _Count:=25;
   _Unit := WDCharacter;
   _Extend := wdextend;
   myword.selection.moveleft(_Unit,_Count,_Extend);
   myword.Selection.Font.Bold := wdtoggle;
   myword.Selection.Font.Name:='Verdana';

//   Fußzeile einfuegen  ######################################################
   myword.ActiveWindow.ActivePane.View.SeekView := wdseekcurrentpagefooter;
   _index := 'Erstellt von, Seite, Datum';
   _Richtext:=true;
   myword.NormalTemplate.AutoTextEntries.Item(_index).Insert(myword.Selection.Range,_richtext);
   myword.Selection.ParagraphFormat.Alignment := wdalignparagraphcenter;
   myword.Selection.Borders.Item(wdbordertop).LineStyle := wdlinestylesingle;
   myword.Selection.Borders.Item(wdbordertop).LineWidth := wdlinewidth100pt;
   myword.Selection.Borders.Item(wdbordertop).Color := wdcolorblack;

// Hauptdokument erzeugen Seite 1  ############################################
   myword.ActiveWindow.ActivePane.View.SeekView := wdseekmaindocument;

// Logo erzeugen
   myword.Selection.TypeParagraph;
   _select := msofalse;

   tempfilename:=extractfilepath(paramstr(0))+'gftsollist'+datetostr(date)+datetostr(time)+'.jpg';
   try
   fauswertung.Image1.Picture.SaveToFile(tempfilename);
   except
   end;

   if fileexists(tempfilename)
    then
     begin
      _true := true;
      _false := false;
      _left :=myword.centimeterstopoints(12.8);
      _top:=myword.centimeterstopoints(0.1);
      _width:=myword.centimeterstopoints(3.1);
      _height:=myword.CentimetersToPoints(3.1);
      myword.ActiveDocument.Shapes.AddPicture(tempfilename,_false,_true,_left,_top,_width,_height,EmptyParam);

      if fileexists(tempfilename)
       then deletefile(tempfilename);
      myword.Selection.ParagraphFormat.Alignment:=wdalignparagraphright;
//      myword.Selection.ShapeRange.ZOrder(msobringinfrontoftext);

     end;

// panel erzeugen
   myword.ActiveDocument.Shapes.AddTextbox(msoTextorientationhorizontal
                ,myword.CentimetersToPoints(2.5),myword.CentimetersToPoints(2.5)
                ,myword.CentimetersToPoints(16),myword.CentimetersToPoints(3.3)
                ,EmptyParam).select(_Select);

   myword.Selection.ShapeRange.TextFrame.TextRange.Select;
   myword.Selection.ParagraphFormat.Alignment:=wdalignparagraphleft;

   myword.Selection.Font.Bold := 1;
   myword.Selection.TypeText('Autor');
   myword.Selection.Font.Bold := 0;
   myword.Selection.TypeText(chr(vk_tab)+chr(vk_tab)+':'+chr(vk_tab)+header.Autor);
   myword.Selection.TypeParagraph;
   myword.Selection.Font.Bold := 1;
   myword.Selection.TypeText('Katalog');
   myword.Selection.Font.Bold := 0;
   myword.Selection.TypeText(chr(vk_tab)+':'+chr(vk_tab)+header.Name);
   myword.Selection.TypeParagraph;
   myword.Selection.Font.Bold := 1;
   myword.Selection.TypeText('Ident 1');
   myword.Selection.Font.Bold := 0;
   myword.Selection.TypeText(chr(vk_tab)+':'+chr(vk_tab)+header.Text1);
   myword.Selection.TypeParagraph;
   myword.Selection.Font.Bold := 1;
   myword.Selection.TypeText('Ident 2');
   myword.Selection.Font.Bold := 0;
   myword.Selection.TypeText(chr(vk_tab)+':'+chr(vk_tab)+header.Text2);
   myword.Selection.TypeParagraph;
   myword.Selection.Font.Bold := 1;
   myword.Selection.TypeText('Version');
   myword.Selection.Font.Bold := 0;
   myword.Selection.TypeText(chr(vk_tab)+':'+chr(vk_tab)+header.Text3);
   myword.Selection.TypeParagraph;
   myword.Selection.Font.Bold := 1;
   myword.Selection.TypeText('Datum');
   myword.Selection.Font.Bold := 0;
   myword.Selection.TypeText(chr(vk_tab)+chr(vk_tab)+':'+chr(vk_tab)+header.Datum);
   myword.Selection.TypeParagraph;
   myword.Selection.ShapeRange.Fill.Visible := msoTrue;
   myword.Selection.ShapeRange.Fill.Solid;
   myword.Selection.ShapeRange.Fill.ForeColor.RGB := RGB(234,234,234);
   myword.Selection.ShapeRange.Fill.Transparency:=0.41;
   myword.Selection.ShapeRange.Line.Visible := msofalse;
   myword.Selection.ShapeRange.ZOrder(msosendtoback);


kann ich eigentlich das dokument am ende schützen? so dass der anwender nicht die texte austauschen kann bzw. die elemente verschieben kann??

danke und gruß,

Wile E.


Keldorn - Mi 16.11.05 22:03

für den code habe ich heute keine Zeit.
Schützen: ja das geht, es gibt einen protect-Befehl im Dokument, kannst sogar ein Passwort vergeben. aber aufpassen, das du auch den Vorgabetext der Formualrfelder setzt, sonst ist anch einem entschützen und erneuten schützen des Doks durhc den Anwender alles weg.

MfgFrank


Keldorn - So 20.11.05 21:37

ok, mein fehler. Mein code war ja für den normalen Text, in der Kopf und Fußzeile sind schon 2 Tabs automatisch drin 8Links ist klar, Zentriert und rechts sind automatisch da)


Delphi-Quelltext
1:
2:
myword.Selection.TypeText(dateiname+chr(vk_tab)+chr(vk_tab)+'Evaluierung GFT Sol[l]Ist'); 
(kein Tab erstellen

somit steht Dateiname links und Evaluierung rechts

Mfg Frank


WileECoyote - So 20.11.05 22:34

hi frank,

so hatte ich das ja....klappt in der regel auch ganz gut,
aber wenn der dateiname zum beispiel "iiii" (auf was anwender halt so alles kommen)
ist, dann reichen die beiden tabs nicht mehr...umgekehrt genauso, wenn der dazeiname zu lamng ist,
sind 2 tabs zu viel...und über stringlänge zu gehen bringt ja nichts, da das "i" weniger platz braucht als das "w"....und die schrift so einzustellen, dass alle buchgstaben gleich viel platz benötigen, sieht nicht gut aus...wäre also schön, wenn es eine möglichkeit gäbe, die position im document in zentimetern oder so berechnen zu können, oder feststellen zu können, ob es gerade einen zeilenumbruch gegeben hat oder nicht, damit man evtl. ein tab löschen kann???

gruß, frank


Keldorn - Mo 21.11.05 21:55

Hast du dir mal dein erstelltes Wordoc angeschaut? geh in die Kopfzeile und gugg sie dir an. Was würdest du du denn machen, damit die Anzeige richtig aussieht?


WileECoyote - Mo 21.11.05 22:25

wenn eins zuviel da ist, würde ich es wegnehmen, wenn ein zuwenig das ist, würde ich eins hinzutun...aus mangel besseren wissens...???


Keldorn - Mo 21.11.05 22:28

Sicher das du das tun würdest? Warum nicht den mittigen Tab löschen? Dann hast du nur den rechten und ein Tabzeichen reicht zwischen den beiden Texten.


WileECoyote - Mo 21.11.05 22:31

ich probier das gleich nochmal aus, meine aber in erinnerung zu haben, dass ein tab zu wenig ist, der programmtext "Evaluierung....." steht dann nicht ganz rechts...würde es evtl. helfen,
wenn ich das als blockabsatz mache?


WileECoyote - Mo 21.11.05 22:41

einer ist zu wenig, da ist bei einem "normalen" dateinamen der text schon zu weit links, siehe bild
vielleicht komme ich auch nicht mit den "linken" und "rechten" tabs klar?


Delphi-Quelltext
1:
myword.Selection.TypeText(dateiname+chr(vk_tab)+'Evaluierung GFT Sol[l]Ist');                    


Keldorn - Mo 21.11.05 22:46

in deinem screenshot bist du aber nicht in der Kopzeile (Menu ansicht ->Kopf und Fußzeile)


WileECoyote - Mo 21.11.05 22:53

doch, das ist der text aus der kopfzeile, screenshot allerdings aus dem originaldokument, wie ich es von delphi erstellt bekomme...

anbei bild mit ansicht kopfzeile


Keldorn - Mo 21.11.05 23:02

jetzt siehst du doch die 2 gesetzten Tabstops im Lineal. den mittigen würdest du löschen.


WileECoyote - Mo 21.11.05 23:05

aber ich habe doch nur ein tab geschrieben?? zwischen "Unbenannt 1" und "Evalueirung..."...mehr ist da gar nicht drin...oh mein gott, ich glaub´, ich bin selbst für word zu doof


WileECoyote - Mo 21.11.05 23:08

jetzt sind da 2 tabs zwischen, aber oben in der leiste hat sich nichts getan???


Keldorn - Mo 21.11.05 23:16

im Lineal, siehst du es jetzt?


WileECoyote - Mo 21.11.05 23:20

jo, gesehen...aber wo kommen die her? bzw. viel wichtiger: wie kriege ich das so hin, das das richtig ist...beim versuch mit nur einem tabstop hats ja auch nicht geklappt...sorry, keine ahnung


Keldorn - Mo 21.11.05 23:23

den mittigen tabstop löschen.


WileECoyote - Mo 21.11.05 23:27

hilfe...aber wie??? unten stehen die beiden versionen, mit denen ich die screenshots erzeugt habe...beide mit dem selben ergebnis...wie kann ich denn da den "mittigen" tabstop löschen???


Delphi-Quelltext
1:
myword.Selection.TypeText(dateiname+chr(vk_tab)+chr(vk_tab)+'Evaluierung GFT Sol[l]Ist');                    



Delphi-Quelltext
1:
myword.Selection.TypeText(dateiname+chr(vk_tab)+'Evaluierung GFT Sol[l]Ist');                    


WileECoyote - Mo 21.11.05 23:30

und wenn ich das in word mache...ergebnis siehe bild


WileECoyote - Mo 21.11.05 23:38

ok, jetzt habe ich den richtigen erwischt, jetzt siehts so aus...


Keldorn - Di 22.11.05 21:03


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
       _index:=1;
       //mittigen Tasb löschen
       WordApplication1.Selection.ParagraphFormat.TabStops.Item(_index).clear;
       //übriggebliebener rechter Tabstop ist jetzt auch mittig, k.A. wieso, also rechtbündig machen
       WordApplication1.Selection.ParagraphFormat.TabStops.Item(_index).Alignment:=wdaligntabright;

       WordApplication1.Selection.TypeText('dateiname'+chr(vk_tab)+'Evaluierung GFT Sol[l]Ist');


Mfg Frank


WileECoyote - Di 22.11.05 23:23

hey frank,

sehr sehr geil...das funktioniert einwandfrei...sorry dass ich dich damit so gestresst habe!!!
alles andere (textboxen, bilder, kopfzeilen etc.) habe ich jetzt hinbekommen, hätt´ ich nie geschafft
ohne deine hilfe!!


also, vielen vielen dank,

Wile E.