Autor Beitrag
retterman
Hält's aus hier
Beiträge: 6

Win2k, WinXP
Delphi 1 bis 2006 Prof u. a.
BeitragVerfasst: Fr 10.08.07 12:07 
Hallo,

seit ein paar Tagen komme ich mit einem Problem nicht mehr weiter. Weder Google noch die Forumsuche haben mir weitergeholfen.

Ich erstelle ein neues Word-Dokument aus einer Vorlage und fülle dieses neue Dokument mit Daten. Der Benutzer hat anschließend das fertig vorbereitete Dokument (ein Prüfprotokoll) in Word vor sich und kann selber entscheiden, was er damit macht, z. B. drucken, speichern oder nur schließen (verwerfen). Das alles funktioniert auch schon wie es soll. Nur beim Speichern wird im Speichern-Unter-Dialog als Vorschlag für den Dokumentennamen immer "ATR.doc" angeboten (wobei Word diesen Namen anscheinend aus dem Titel "ATR #0151-200 for AHRS" der DOT generiert). Ich würde gerne selber einen Namen für das Dokument vorgeben, der im Speichern-Unter-Dialog vorgeschlagen wird, aber ohne das Dokument zu speichern. Weiß jemand, wie das geht? Den Titel des Dokuments zu ändern, nützt jedenfalls nichts.

Mit diesem Codeauszug erzeuge ich das Dokument:

ausblenden volle Höhe 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:
procedure TForm2.CreateWordDocument;
var
  WinWord : Variant;
  Cursor : TCursor;
begin
  Cursor := Screen.Cursor;
  try
    Screen.Cursor := crHourglass;

    try
      // Es wird zuerst versucht, eine laufende Word-Instanz zu verwenden
      WinWord := GetActiveOleObject('Word.Application');
    except
      try
        // Läuft Word noch nicht, wird eine neue Verbindung aufgebaut
        WinWord := CreateOleObject('Word.Application');
      except
        // Schlägt sie fehl (Word nicht installiert), gibt es eine Fehlermeldung
        ShowMessage('Microsoft Word can not be launched.');
        Exit;
      end;
    end;

    WinWord.Visible := true;
    WinWord.Documents.Add(Template:= DotName, NewTemplate:=False, DocumentType:=0);

    // Hier wird das Dokument mit den Daten gefüllt
    // (wegen der Übersichtlichkeit weggelassen)

  finally
    Screen.Cursor := Cursor;
    WinWord := unassigned;
  end;
end;


Vielen Dank schon mal für Eure Hilfe.

Servus, Retterman
wwwdirk
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 38


D6 Prof / D2005 Prof
BeitragVerfasst: Fr 10.08.07 12:28 
Ich bin mir nicht ganz sicher, aber versuchs mal so:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
var
  vDoc: _Document;
begin
  //...
  vDoc := WinWord.Documents.Add(Template:= DotName, NewTemplate:=False, DocumentType:=0); 
  vDoc.Name := 'MeinName.doc';
  // ...
end;

Gruß
Dirk
retterman Threadstarter
Hält's aus hier
Beiträge: 6

Win2k, WinXP
Delphi 1 bis 2006 Prof u. a.
BeitragVerfasst: Fr 10.08.07 14:24 
Es geht leider nicht. Laut Exception ist "Name" eine schreibgeschützte Eigenschaft.

So ähnlich habs ich aber auch schon probiert:

ausblenden Delphi-Quelltext
1:
    WinWord.ActiveDocument.Name := 'Vorschlag.doc';					


Hat aber (logischerweise) auch nicht geklappt.

Trotzdem vielen Dank für Deine Antwort.

Servus, Retterman
hathor
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 10.08.07 15:56 
Für "ATR.doc" den Schreibschutz aktivieren, dann MUSS man einen anderen Namen wählen.
retterman Threadstarter
Hält's aus hier
Beiträge: 6

Win2k, WinXP
Delphi 1 bis 2006 Prof u. a.
BeitragVerfasst: Fr 10.08.07 18:33 
user profile iconhathor hat folgendes geschrieben:
Für "ATR.doc" den Schreibschutz aktivieren, dann MUSS man einen anderen Namen wählen.

Geht leider auch nicht so einfach bzw. löst das Problem nicht. Eine Datei namens "ATR.doc" existiert nicht (und soll auch nicht existieren). Es stimmt zwar, wenn ich eine Datei "ATR.doc" anlegen und schreibschützen würde, dann müsste der Benutzer einen anderen Dateinamen wählen. Ich möchte ihn aber nicht zwingen, den Namen zu ändern, sondern ich möchte ihm einen bestimmten Namen (z. B. "Test Report 1234-abc.doc") als Vorschlag anbieten. Ob er diesen vorgeschlagenen Namen dann nimmt oder etwas anderes eintippt, ist mir dann egal.

Trotzdem vielen Dank.
hathor
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 10.08.07 19:42 
Wenn die Möglichkeit besteht, in die 1.Zeile des Dokuments etwas einzufügen:

FontColor: = white;

Sieht man nicht - aber WinWord übernimmt diesen Text als FileName.
retterman Threadstarter
Hält's aus hier
Beiträge: 6

Win2k, WinXP
Delphi 1 bis 2006 Prof u. a.
BeitragVerfasst: Sa 11.08.07 09:50 
Ich hab's ausprobiert, es hat zunächst mal nicht geklappt. Sobald das Dokument aus der Dokumentenvorlage erzeugt wird, wird der Titel (und damit der vorgeschlagene Dateiname) aus dem Titel der Vorlage bzw. (falls der Titel leer ist) aus der ersten Zeile im Text übernommen wird. Ich müsste also in der DOT den Titel entsprechend einstellen, eine Kopie der DOT speichern und aus dieser Kopie mein Dokument erzeugen. Das funktioniert zwar, ist aber reichlich umständlich. Aber wenn es nicht anders geht, mache ich es so.

Inzwischen habe ich im Netz einen interessanten Hinweis zu diesem Thema gefunden. Als VBA-Makro funktioniert das zwar, aber die Umsetzung in Delphi bringt mir immer die Fehlermeldung "'Item' ist keine Eigenschaft". Hier ist mein Code dazu:

ausblenden volle Höhe 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:
procedure TForm2.CreateWordDocument;
var
  WinWord : Variant;
  Dialog : Variant;
  Cursor : TCursor;
const
  wdDialogFileSummaryInfo = 86;
begin
  if not FileExists(DotName) then
  begin
    ShowMessage('DOT file "'+DotName+'" not found.');
    Exit;
  end;

  Cursor := Screen.Cursor;
  try
    Screen.Cursor := crHourglass;

    try
      // Es wird zuerst versucht, eine laufende Word-Instanz zu verwenden
      WinWord := GetActiveOleObject('Word.Application');
    except
      try
        // Läuft Word noch nicht, wird eine neue Verbindung aufgebaut
        WinWord := CreateOleObject('Word.Application');
      except
        // Schlägt sie fehl (Word nicht installiert), gibt es eine Fehlermeldung
        ShowMessage('Microsoft Word can not be launched.');
        Exit;
      end;
    end;

    WinWord.Visible := true;
    WinWord.Documents.Add(Template:= DotName, NewTemplate:=False, DocumentType:=0);

    // -------------------------------------------------------------
    // HIER KOMMT ES: Dateinamen vorschlagen

    Dialog := WinWord.Application.Dialogs[wdDialogFileSummaryInfo];
    Dialog.Title := 'vorgeschlagener Dateiname';
    Dialog.Execute;
    Dialog := unassigned;

    // -------------------------------------------------------------

    // Hier wird wieder das Dokument ausgefüllt
    // (wieder ausgeblendet)

  finally
    Screen.Cursor := Cursor;
    WinWord := unassigned;
  end;
end;


Langsam taste ich mich schon an die Lösung ran. Zwei Notlösungen hab ich schon: Die temporäre DOT, oder ein VBA-Makro in der DOT. Beides funktioniert, aber so richtig sauber ist beides nicht.

@wwwDirk und Hathor: Ohne Eure Hilfe wäre ich aber nicht mal so weit gekommen, vielen Dank dafür.
retterman Threadstarter
Hält's aus hier
Beiträge: 6

Win2k, WinXP
Delphi 1 bis 2006 Prof u. a.
BeitragVerfasst: Sa 11.08.07 10:13 
Ich hab noch ein wenig weiter gesucht und probiert. So klappt es in Delphi:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
    Dialog := WinWord.Application.Dialogs.Item(wdDialogFileSummaryInfo);
    Dialog.Title := 'vorgeschlagener Dateiname';
    Dialog.Execute;
    Dialog := unassigned;


Allerdings mit ein paar Einschränkungen: Es dürfen keine Sonderzeichen (auch Unterstriche oder Bindestriche) im vorgeschlagenen Dateinamen vorkommen. Nach dieser Anmerkung ist das ein "schwer fassbarer BUG in MS Word", aber ich komme damit schon zurecht.

Nochmal vielen Dank für Eure Hilfe

Servus, Retterman