Announcement

Collapse
No announcement yet.

OleVariant als TWordDocument ansprechen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • OleVariant als TWordDocument ansprechen

    Hallo zusammen,<br><br>
    ich arbeite mit Delphi 6 und den Word2000-Komponenten. Ich möchte im Ereignis OnDocumentBeforeSave prüfen, ob das zu speichernde Dokument eine bestimmte benutzerdefinierte Variable hat. <br>
    Damit ich den Übergabeparameter Doc (vom Typ OleVariant) als TWordDocument ansprechen kann, muss ich ihn irgendwie wieder in ein TWordDocument "verwandeln", ich weiss aber nicht wie. Alle Versuche mit irgendwelchen Typumwandlungen oder Assign schlagen schon beim Übersetzen fehl. Kann mir dabei jemand helfen ?<br><br>
    Mir ist aufgefallen, dass in der Unit Word2000.pas bei TWordApplication.InvokeEvent die Parameter für OnDocumentBeforeSave in der verkehrten Reihenfolge weiter gegeben werden. Kann das sein ?<br><br>
    Schöne Grüße und besten Dank in Voraus, Dagmar.

  • #2
    Hallo,

    &gt;..in der verkehrten Reihenfolge weiter gegeben werden. Kann das sein ?

    Ja - das ist ein bekannter Delphi-Bug (6/6.01/6.02), der erst in Delphi 7 beseitigt wird. Bei älteren Delphi-Versionen muss man von Hand eingreifen. Außerdem werden var-Paramter falsch behandelt, ein vom Client neu gesetzter Wert wird nicht an den Automation-Server weitergegeben.

    &gt;..muss ich ihn irgendwie wieder in ein TWordDocument "verwandeln", ...

    Das folgende Beispiel demonstriert das Prinzip:
    <pre>
    <b>var</b>
    Quelle : _Document;
    vPar : OleVariant;
    Ziel : _Document;
    <b>begin</b>
    Quelle := WordDocument1.DefaultInterface;
    vPar := Quelle;
    Ziel := IDispatch(vPar) <b>as</b> _Document;
    WordDocument1.ConnectTo(Ziel)
    <b>end</b>;
    </pre&gt

    Comment


    • #3
      Hallo Herr Kosch,<br><br>
      leider funktioniert das von Ihnen gezeigte Beispiel bei mir nicht. Mein Ereignis sieht jetzt so aus:
      <pre>
      procedure TMainFrm.OnDocumentBeforeSave(Sender: TObject;
      var Doc, SaveAsUI, Cancel: OleVariant);
      var
      Dok : _Document;
      ovParam : OleVariant;
      begin
      Dok := IDispatch(Cancel) as _Document; // Cancel wegen der verkehrten Reihenfolge
      ovParam := 'Irgendwas';
      If Dok.Variables.Item(ovParam).Value = 'True' Then
      Begin
      ...
      // Anweisungen zum Speichern in die DB
      ...
      End;
      end;
      </pre>

      Schon bei der ersten Zuweisung <b>Dok := IDispatch(Cancel) as _Document;</b> kracht es. Es öffnet sich das CPU-Fenster, mit dem ich nun wirklich nichts anfangen kann. Ich habe es auch mit dem Doc-Parameter versucht, gleiches Ergebnis. Was mache ich falsch ?<br><br>
      Schöne Grüße Dagmar

      Comment


      • #4
        Natürlich knallt es. Bevor Andreas die TypUmwandlung auf (vPar/Cancel) anwendet, initialisiert er diese Variable. Den Teil hast Du einfach weggelassen.<p>
        Schöne Grüße, Mario Noac
        Schöne Grüße, Mario

        Comment


        • #5
          Hallo Mario,<br><br>
          Cancel kommt doch als Parameter beim Ereignis mit. Wenn ich das initialisiere, ist doch der Inhalt der Variablen weg, oder nicht? <br>
          Schöne Grüße Dagmar

          Comment


          • #6
            OK, dass habe ich übersehen. Natürlich hast Du in diesem Falle recht. Aber wenn ich das so sehe, würde ich Cancel als eine Art boolschen Wert erwarten. Du willst es aber als Dokument ansprechen?<p>
            Mari
            Schöne Grüße, Mario

            Comment


            • #7
              Hallo Mario,<br><br>
              ich nehme Cancel, weil die Parameter von Delphi vertauscht werden (siehe meine ursprüngliche Frage und Antwort 1 von Andreas Kosch). Aber auch mit dem Parameter Doc vom Ereignis funktioniert es nicht.<br><br>
              Du hast Dich sicher schon mehr als ich mit der Automation von Word beschäftigt (wegen der beiden Artikel im Entwickler). Hast Du nicht ein funktionierendes Beispiel für diesen Fall ? <br>Das Problem: Ich muss ja bei OnBeforeSave erst mal prüfen, ob das zu speichernde Dokument überhaupt in die Datenbank soll. Es könnte ja auch eins sein, das der Benutzer einfach so mit Word angelegt hat, das soll ja dann nicht in Datenbank. Ich füge dazu eben beim Anlegen eines Dokument von meinem Clientprogramm aus eine benutzerdefinierte Variable ins Dokument ein. Wie könnte man denn das sonst unterscheiden ?<br><br>
              Schöne Grüße Dagmar

              Comment


              • #8
                Also bei mir ging es problemlos:<br>
                <i> ShowMessage((IDispatch(Doc) as _Document).Name);</i><p>
                Es wurde der Dokumentenname angezeigt. Nur Vertauschen war nicht notwendig. Lade Dir mal das Beispiel hier herunter:<p>
                http://www.entwickler.com/itr/ausgaben/psfile/datei/78/noack_word3f2e2edacd879.zip<p>
                Die Unit 1 habe ich wie folgt geändert. Ich verwende Delphi 6, Update 2.<p>
                <pre class="sourcecode"><code>
                <b>unit</b> Unit1;

                <b>interface</b>

                <font color="#003399"><i>{$i delphi.inc}</i></font>

                <b>uses</b>
                Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
                StdCtrls, ComCtrls, ExtCtrls, WinSpool, Printers,
                <font color="#003399"><i>{$IFDEF DELPHI6_UP}</i></font> Variants, <font color="#003399"><i>{$ENDIF}</i></font>
                Word2000;

                <b>type</b>
                TFormWord1 = <b>class</b>(TForm)
                PageControlWord: TPageControl;
                TabSheet1: TTabSheet;
                TabSheet2: TTabSheet;
                ButtonStartWord: TButton;
                ButtonStartWord2: TButton;
                LabelStatusWord: TLabel;
                Bevel1: TBevel;
                Label1: TLabel;
                Label2: TLabel;
                ButtonCloseWord: TButton;
                ButtonOpenNewDoc: TButton;
                Label3: TLabel;
                LabelStatusDokument: TLabel;
                Label4: TLabel;
                ButtonCloseDoc: TButton;
                ButtonOpenExistDoc: TButton;
                Bevel2: TBevel;
                ButtonPrint: TButton;
                ButtonSaveAs: TButton;
                TabSheet3: TTabSheet;
                ButtonNewDokFromTemplate: TButton;
                Label5: TLabel;
                LabelStatusTemplate: TLabel;
                Label7: TLabel;
                ButtonFillTable1: TButton;
                ButtonFillTextEnd: TButton;
                Bevel3: TBevel;
                ComboBoxPrinter: TComboBox;
                ButtonPrintTo: TButton;
                ButtonProtect: TButton;
                Bevel4: TBevel;
                Bevel5: TBevel;
                Button1: TButton;
                <b>procedure</b> ButtonStartWordClick(Sender: TObject);
                <b>procedure</b> ButtonStartWord2Click(Sender: TObject);
                <b>procedure</b> ButtonCloseWordClick(Sender: TObject);
                <b>procedure</b> ButtonOpenNewDocClick(Sender: TObject);
                <b>procedure</b> ButtonCloseDocClick(Sender: TObject);
                <b>procedure</b> ButtonOpenExistDocClick(Sender: TObject);
                <b>procedure</b> ButtonPrintClick(Sender: TObject);
                <b>procedure</b> ButtonSaveAsClick(Sender: TObject);
                <b>procedure</b> ButtonNewDokFromTemplateClick(Sender: TObject);
                <b>procedure</b> ButtonFillTable1Click(Sender: TObject);
                <b>procedure</b> ButtonFillTextEndClick(Sender: TObject);
                <b>procedure</b> FormCreate(Sender: TObject);
                <b>procedure</b> ButtonPrintToClick(Sender: TObject);
                <b>procedure</b> ButtonProtectClick(Sender: TObject);
                <b>private</b>
                FWordDoc: TWordDocument;
                FWordApp: TWordApplication;
                <b>public</b>
                <b>procedure</b> OnWordAppClose(Sender: TObject);
                <b>procedure</b> OnWordDocClose(Sender: TObject);
                <b>procedure</b> OnWordAppBeforeSave(Sender: TObject; <b>var</b> Doc, SaveAsUI, Cancel: OleVariant);
                <b>end</b>;

                <b>var</b>
                FormWord1: TFormWord1;

                <b>implementation</b>

                <font color="#003399"><i>{$R *.dfm}</i></font>

                </code></pre&gt
                Schöne Grüße, Mario

                Comment


                • #9
                  <pre class="sourcecode"><code>
                  <b>procedure</b> TFormWord1.ButtonStartWordClick(Sender: TObject);
                  <b>begin</b>
                  <b>if</b> <b>not</b> Assigned(FWordApp)
                  <b>then</b> FWordApp := TWordApplication.Create(Self);
                  <b>try</b>
                  FWordApp.Connect;
                  FWordApp.Visible := True;
                  <b>finally</b>
                  FreeAndNil(FWordApp);
                  <b>end</b>;
                  <b>end</b>; <font color="#003399"><i>// proc ButtonWordStart.OnClick</i></font>
                  <font color="#003399"><i>//-----------------------------------------------------------</i></font>

                  <b>procedure</b> TFormWord1.ButtonStartWord2Click(Sender: TObject);
                  <b>begin</b>
                  <b>if</b> <b>not</b> Assigned(FWordApp) <b>then</b> FWordApp := TWordApplication.Create(Self);
                  <b>try</b>
                  FWordApp.Connect;
                  <b>except</b>
                  <b>on</b> E: Exception <b>do</b> <b>begin</b>
                  FreeAndNil(FWordApp);
                  LabelStatusWord.Caption := <font color="#9933CC">'Die Verbindung zu Word konnte nicht '</font> +
                  <font color="#9933CC">'hergestellt werden:'</font> + #10#13 +
                  E.Message;
                  <b>Raise</b>;
                  <b>end</b>; <font color="#003399"><i>// on E</i></font>
                  <b>end</b>; <font color="#003399"><i>// try except</i></font>
                  FWordApp.Visible := True;
                  FWordApp.WindowState := wdWindowStateMinimize;
                  FWordApp.OnDocumentBeforeSave := OnWordAppBeforeSave;
                  FWordApp.OnQuit := OnWordAppClose;
                  LabelStatusWord.Caption := <font color="#9933CC">'Word wurde gestartet und minimiert.'</font>;
                  <b>end</b>; <font color="#003399"><i>// proc ButtonWordStart2.OnClick</i></font>
                  <font color="#003399"><i>//-----------------------------------------------------------</i></font>

                  <b>procedure</b> TFormWord1.OnWordAppClose(Sender: TObject);
                  <b>begin</b>
                  FreeAndNil(FWordApp);
                  LabelStatusWord.Caption := <font color="#9933CC">'Word wurde geschlossen.'</font>;
                  <b>end</b>;
                  <font color="#003399"><i>//-----------------------------------------------------------</i></font>

                  <b>procedure</b> TFormWord1.ButtonCloseWordClick(Sender: TObject);
                  <b>begin</b>
                  <b>if</b> Assigned(FWordApp) <b>then</b> <b>begin</b>
                  <font color="#003399"><i>// Evtl. kommen bei Quit Rueckfragen,</i></font>
                  <font color="#003399"><i>// dazu darf unsere Anwendung nicht</i></font>
                  <font color="#003399"><i>// stoeren, wird also minimieren</i></font>
                  <b>if</b> FWordApp.Documents.Count &gt; 0
                  <b>then</b> Application.Minimize;
                  FWordApp.Quit;
                  <b>end</b>; <font color="#003399"><i>// if Assigned(FWordApp)</i></font>
                  <b>end</b>; <font color="#003399"><i>// proc ButtonCloseWord.OnClick</i></font>
                  <font color="#003399"><i>//-----------------------------------------------------------</i></font>

                  <b>procedure</b> TFormWord1.ButtonOpenNewDocClick(Sender: TObject);
                  <b>begin</b>
                  <font color="#003399"><i>// Word starten (falls noch nicht geschehen)</i></font>
                  <font color="#003399"><i>// und sicherstellen, das die Verbindung zu FWordApp i.O. ist</i></font>
                  ButtonStartWord2.Click;

                  <b>if</b> <b>not</b> Assigned(FWordDoc) <b>then</b> <b>begin</b>
                  FWordDoc := TWordDocument.Create(Self);
                  FWordDoc.ConnectTo(FWordApp.Documents.Add(EmptyPar am,EmptyParam,EmptyParam,EmptyParam));
                  FWordDoc.OnClose := OnWordDocClose;
                  LabelStatusDokument.Caption := <font color="#9933CC">'Ein neues Dokument wurde ge&#246ffnet.'</font>;
                  <b>end</b>;
                  <b>end</b>; <font color="#003399"><i>// proc ButtonOpenNewDoc.OnClick</i></font>
                  <font color="#003399"><i>//-----------------------------------------------------------</i></font>

                  <b>procedure</b> TFormWord1.OnWordDocClose(Sender: TObject);
                  <b>begin</b>
                  FreeAndNil(FWordDoc);
                  LabelStatusDokument.Caption := <font color="#9933CC">'Dokument wurde geschlossen.'</font>;
                  LabelStatusTemplate.Caption := <font color="#9933CC">'Dokument wurde geschlossen.'</font>;
                  <b>end</b>;
                  <font color="#003399"><i>//-----------------------------------------------------------</i></font>

                  <b>procedure</b> TFormWord1.ButtonCloseDocClick(Sender: TObject);
                  <b>begin</b>
                  <b>if</b> Assigned(FWordDoc) <b>then</b> <b>begin</b>
                  <font color="#003399"><i>// Evtl. kommen bei Close Rueckfragen,</i></font>
                  <font color="#003399"><i>// dazu darf unsere Anwendung nicht</i></font>
                  <font color="#003399"><i>// stoeren, wird also minimieren</i></font>
                  Application.Minimize;
                  FWordDoc.Close;
                  <b>end</b>; <font color="#003399"><i>// if Assigned(FWordDoc)</i></font>
                  <b>end</b>; <font color="#003399"><i>// proc ButtonCloseDoc.OnClick</i></font>
                  <font color="#003399"><i>//-----------------------------------------------------------</i></font>

                  <b>procedure</b> TFormWord1.ButtonOpenExistDocClick(Sender: TObject);
                  <b>var</b> OleStrFileName,
                  OleFalse: OleVariant;
                  aDocument: _Document;
                  <b>begin</b>
                  OleStrFileName := <font color="#9933CC">''</font>;
                  OleFalse := False;

                  <b>with</b> TOpenDialog.Create(Self) <b>do</b>
                  <b>try</b>
                  Filter := <font color="#9933CC">'Word-Dokumente|*.doc'</font>;
                  <b>if</b> Execute <b>then</b> OleStrFileName := FileName;
                  <b>finally</b>
                  Free;
                  <b>end</b>; <font color="#003399"><i>// with OpenDialog</i></font>

                  <b>if</b> OleStrFileName = <font color="#9933CC">''</font> <b>then</b> Exit;

                  <font color="#003399"><i>// Word starten, falls noch nicht geschehen</i></font>
                  ButtonStartWord2.Click;

                  <b>if</b> <b>not</b> Assigned(FWordDoc) <b>then</b> <b>begin</b>
                  aDocument := FWordApp.Documents.Open(OleStrFileName,
                  EmptyParam,
                  EmptyParam,
                  OleFalse, <font color="#003399"><i>// Recent</i></font>
                  EmptyParam,
                  EmptyParam,
                  EmptyParam,
                  EmptyParam,
                  EmptyParam,
                  EmptyParam,
                  EmptyParam,
                  EmptyParam);
                  FWordDoc := TWordDocument.Create(Self);
                  FWordDoc.ConnectTo(aDocument);
                  FWordDoc.OnClose := OnWordDocClose;
                  LabelStatusDokument.Caption := <font color="#9933CC">'Ein bestehendes Dokument wurde ge&#246ffnet.'</font>;
                  <b>end</b>;
                  <b>end</b>; <font color="#003399"><i>// proc ButtonOpenExistDoc.OnClick</i></font>
                  <font color="#003399"><i>//-----------------------------------------------------------</i></font>

                  </code></pre&gt
                  Schöne Grüße, Mario

                  Comment


                  • #10
                    <pre class="sourcecode"><code>
                    <b>procedure</b> TFormWord1.ButtonPrintClick(Sender: TObject);
                    <b>var</b> OleFalse: OleVariant;
                    <b>begin</b>
                    OleFalse := False;
                    <b>if</b> Assigned(FWordDoc) <b>then</b> <b>begin</b>
                    FWordDoc.PrintOut(OleFalse);
                    LabelStatusDokument.Caption := <font color="#9933CC">'Das mit dieser Anwendung ge&#246ffnet Dokument wurde gedruckt.'</font>;
                    <b>end</b>; <font color="#003399"><i>// if Assigned(FWordDoc)</i></font>
                    <b>end</b>; <font color="#003399"><i>// proc ButtonPrint.OnClick</i></font>
                    <font color="#003399"><i>//-----------------------------------------------------------</i></font>

                    <b>procedure</b> TFormWord1.ButtonSaveAsClick(Sender: TObject);
                    <b>var</b> OleStrFileName : OLEVariant;
                    <b>begin</b>
                    <b>if</b> Assigned(FWordDoc) <b>then</b> <b>begin</b>
                    OleStrFileName := <font color="#9933CC">''</font>;

                    <b>with</b> TSaveDialog.Create(Self) <b>do</b>
                    <b>try</b>
                    Filter := <font color="#9933CC">'Word-Dokumente|*.doc'</font>;
                    DefaultExt := <font color="#9933CC">'.doc'</font>;
                    Options := Options + [ofOverwritePrompt];
                    <b>if</b> Execute <b>then</b> OleStrFileName := FileName;
                    <b>finally</b>
                    Free;
                    <b>end</b>; <font color="#003399"><i>// with SaveDialog</i></font>

                    <b>if</b> OleStrFileName = <font color="#9933CC">''</font> <b>then</b> Exit;

                    FWordDoc.SaveAs(OleStrFileName);
                    LabelStatusDokument.Caption := <font color="#9933CC">'Das Dokument wurde gespeichert.'</font>;
                    <b>end</b>; <font color="#003399"><i>// if Assigned(FWordDoc)</i></font>
                    <b>end</b>; <font color="#003399"><i>// proc ButtonOpenExistDoc.OnClick</i></font>
                    <font color="#003399"><i>//-----------------------------------------------------------</i></font>

                    <b>procedure</b> TFormWord1.ButtonNewDokFromTemplateClick(Sender: TObject);
                    <b>var</b> OleStrFileName,
                    OleFalse: OleVariant;
                    aDocument: _Document;
                    <b>begin</b>
                    OleStrFileName := IncludeTrailingPathDelimiter(ExtractFilePath(Param Str(0))) +
                    <font color="#9933CC">'office2.dot'</font>;
                    OleFalse := False;

                    <b>if</b> <b>not</b> FileExists(OleStrFileName) <b>then</b> <b>begin</b>
                    MessageDlg(Format(<font color="#9933CC">'Die Vorlagendatei%0:s&quot;%1:s&quot;%0:swurde nicht gefunden.'</font>,
                    [#10#13,OleStrFileName]),
                    mtError,
                    [mbOK],
                    0);
                    Exit;
                    <b>end</b>; <font color="#003399"><i>// Vorlagendatei nicht gefunden</i></font>

                    <font color="#003399"><i>// Word starten, falls noch nicht geschehen</i></font>
                    ButtonStartWord2.Click;

                    <b>if</b> <b>not</b> Assigned(FWordDoc) <b>then</b> <b>begin</b>
                    aDocument := FWordApp.Documents.Add(OleStrFileName, EmptyParam,EmptyParam,EmptyParam);
                    FWordDoc := TWordDocument.Create(Self);
                    FWordDoc.ConnectTo(aDocument);
                    FWordDoc.OnClose := OnWordDocClose;
                    LabelStatusDokument.Caption := <font color="#9933CC">'Ein Vorlage wurde ge&#246ffnet.'</font>;
                    LabelStatusTemplate.Caption := <font color="#9933CC">'Ein Vorlage wurde ge&#246ffnet.'</font>;
                    <b>end</b>;
                    <b>end</b>; <font color="#003399"><i>// proc ButtonNewDokFromTemplate.OnClick</i></font>
                    <font color="#003399"><i>//-----------------------------------------------------------</i></font>

                    <b>procedure</b> TFormWord1.ButtonFillTable1Click(Sender: TObject);
                    <b>const</b> strTableName = <font color="#9933CC">'TabelleWerte'</font>;
                    <b>var</b> OleStr: OleVariant;
                    OleRow: OleVariant;
                    OleRange: OleVariant;
                    TableWerte: Table;
                    i: Integer;
                    <b>begin</b>
                    <b>if</b> Assigned(FWordDoc) <b>then</b> <b>begin</b>
                    <font color="#003399"><i>// Tabelle, die beim Bookmark</i></font>
                    <font color="#003399"><i>// &quot;TabelleWerte&quot; steht w&#228hlen</i></font>
                    OleStr := strTableName;
                    TableWerte := FWordDoc.Bookmarks.Item(OleStr).Range.Tables.Item( 1);

                    <font color="#003399"><i>// Table um 20 Zeilen erweitern</i></font>
                    OleRow := TableWerte.Rows.Item(1);
                    <b>for</b> i := 1 <b>to</b> 20 <b>do</b> TableWerte.Rows.Add(OleRow);

                    <font color="#003399"><i>// Kopfzeile bef&#252llen</i></font>
                    TableWerte.Cell(1,1).Range.Text := <font color="#9933CC">'Wert'</font>;
                    TableWerte.Cell(1,2).Range.Text := <font color="#9933CC">'Quadratzahl'</font>;

                    <font color="#003399"><i>// Wertezeilen bef&#252llen</i></font>
                    <b>for</b> i := 1 <b>to</b> 20 <b>do</b> <b>begin</b>
                    TableWerte.Cell(i+1, 1).Range.Text := IntToStr(i);
                    TableWerte.Cell(i+1, 2).Range.Text := IntToStr(i*i);
                    <b>end</b>; <font color="#003399"><i>// for i</i></font>

                    <font color="#003399"><i>// Kopfzeile mit Formatvorlage hervorheben</i></font>
                    OleStr := <font color="#9933CC">'Hervorhebung'</font>;
                    TableWerte.Rows.Item(1).Range.Set_Style(OleStr);

                    <font color="#003399"><i>// Wenn das Bookmark &quot;TableWerte&quot; noch existiert,</i></font>
                    <font color="#003399"><i>// wird es gel&#246scht, bevor es neu gesetzt werden</i></font>
                    <font color="#003399"><i>// kann</i></font>
                    OleStr := strTableName;
                    <b>if</b> FWordDoc.Bookmarks.Exists(strTableName)
                    <b>then</b> FWordDoc.Bookmarks.Item(OleStr).Delete;

                    <font color="#003399"><i>// Setzen eines Bookmarks</i></font>
                    OleRange := TableWerte.Range;
                    FWordDoc.Bookmarks.Add(strTableName, OleRange)
                    <b>end</b>;
                    <b>end</b>; <font color="#003399"><i>// proc ButtonFillTable1.OnClick</i></font>
                    <font color="#003399"><i>//-----------------------------------------------------------</i></font>

                    <b>procedure</b> TFormWord1.ButtonFillTextEndClick(Sender: TObject);
                    <b>var</b> Range1: Word2000.Range;
                    OleDirection: OleVariant;
                    <b>begin</b>
                    <b>if</b> Assigned(FWordDoc) <b>then</b> <b>begin</b>
                    Range1 := FWordDoc.Content;
                    OleDirection := wdCollapseEnd;
                    Range1.Collapse(OleDirection);
                    Range1.InsertAfter(<font color="#9933CC">'Ein kleiner Text am Ende des Dokumentes'</font>);
                    <b>end</b>; <font color="#003399"><i>// if Assigned(FWordDoc)</i></font>
                    <b>end</b>; <font color="#003399"><i>// proc ButtonFillTextEnd.OnClick</i></font>
                    <font color="#003399"><i>//-----------------------------------------------------------</i></font>

                    <b>procedure</b> TFormWord1.FormCreate(Sender: TObject);

                    <font color="#003399"><i>// ermittelt alle installierten Drucker ohne den</i></font>
                    <font color="#003399"><i>// Anschlusstyp im Namen zu integrieren</i></font>
                    <b>PROCEDURE</b> GetPrinterList(Printerlist: TStrings);
                    <b>VAR</b>
                    Buffer, PrinterInfo: PChar;
                    Count, NumInfo: DWORD;
                    I: Integer;
                    <b>begin</b>
                    Count := 0;

                    EnumPrinters(PRINTER_ENUM_LOCAL + PRINTER_ENUM_CONNECTIONS, <b>nil</b>, 1, <b>nil</b>, 0, Count, NumInfo);
                    <b>if</b> Count = 0 <b>then</b> Exit;
                    GetMem(Buffer, Count);
                    <b>try</b>
                    <b>if</b> <b>not</b> EnumPrinters(PRINTER_ENUM_LOCAL + PRINTER_ENUM_CONNECTIONS, <b>nil</b>, 1, PByte(Buffer), Count, Count, NumInfo)
                    <b>then</b> Exit;
                    PrinterInfo := Buffer;
                    <b>for</b> I := 0 <b>to</b> NumInfo - 1 <b>do</b>
                    <b>with</b> PPrinterInfo1(PrinterInfo)^ <b>do</b>
                    <b>begin</b>
                    Printerlist.Add(pName);
                    Inc(PrinterInfo, sizeof(TPrinterInfo1));
                    <b>end</b>;
                    <b>finally</b>
                    FreeMem(Buffer, Count);
                    <b>end</b>;
                    <b>END</b>; <font color="#003399"><i>// SubProc GetPrinterList</i></font>

                    <b>begin</b> <font color="#003399"><i>// proc OnCreate</i></font>
                    GetPrinterList(ComboBoxPrinter.Items);
                    ComboBoxPrinter.ItemIndex := Printer.PrinterIndex;
                    <b>end</b>; <font color="#003399"><i>// proc OnCreate</i></font>
                    <font color="#003399"><i>//-----------------------------------------------------------</i></font>

                    <b>procedure</b> TFormWord1.ButtonPrintToClick(Sender: TObject);
                    <b>var</b> OleFalse: OleVariant;
                    strOldPrinter: <b>String</b>;
                    <b>begin</b>
                    OleFalse := False;
                    <b>if</b> Assigned(FWordApp) <b>and</b> Assigned(FWordDoc) <b>then</b> <b>begin</b>
                    strOldPrinter := FWordApp.ActivePrinter;
                    <b>try</b>
                    FWordApp.ActivePrinter := ComboBoxPrinter.Text;
                    FWordDoc.PrintOut(OleFalse);
                    LabelStatusTemplate.Caption := <font color="#9933CC">'Das mit dieser '</font> +
                    <font color="#9933CC">'Anwendung ge&#246ffnet Dokument wurde gedruckt.'</font>;
                    <b>finally</b>
                    FWordApp.ActivePrinter := strOldPrinter;
                    <b>end</b>; <font color="#003399"><i>// try</i></font>
                    <b>end</b>; <font color="#003399"><i>// if Assigned(FWordApp) and Assigned(FWordDoc)</i></font>
                    <b>end</b>; <font color="#003399"><i>// proc ButtonPrintTo.OnClick</i></font>
                    <font color="#003399"><i>//-----------------------------------------------------------</i></font>

                    <b>procedure</b> TFormWord1.ButtonProtectClick(Sender: TObject);
                    <b>var</b> OleEnum,
                    OleStr,
                    OleFalse: OleVariant;
                    <b>begin</b>
                    <b>if</b> Assigned(FWordDoc) <b>then</b> <b>begin</b>
                    FWordDoc.Sections.Item(1).ProtectedForForms := True;
                    FWordDoc.Sections.Item(2).ProtectedForForms := False;

                    OleEnum := wdAllowOnlyFormFields;
                    OleFalse := False;
                    OleStr := <font color="#9933CC">'testpsw'</font>;
                    FWordDoc.Protect(OleEnum, OleFalse, OleStr);
                    <b>end</b>; <font color="#003399"><i>// if Assigned(FWordDoc) then begin</i></font>
                    <b>end</b>; <font color="#003399"><i>// proc ButtonProtect.OnClick </i></font>
                    <font color="#003399"><i>//-----------------------------------------------------------</i></font>

                    <b>procedure</b> TFormWord1.OnWordAppBeforeSave(Sender: TObject; <b>var</b> Doc,
                    SaveAsUI, Cancel: OleVariant);
                    <b>begin</b>
                    ShowMessage((IDispatch(Doc) <b>as</b> _Document).Name);
                    <b>end</b>;

                    <b>end</b>.

                    </code></pre&gt
                    Schöne Grüße, Mario

                    Comment


                    • #11
                      Hallo Mario,<br><br>
                      Dein Beispiel funktioniert bei mir auch und es hat mir die Augen geöffnet.<br>
                      Die Variablen, die ich testen wollte, werden nämlich nicht mit Document.Variables angesprochen, sondern mit <b>CustomDocumentProperties</b>. Wenn Du jetzt den Quellcode siehst, lachst Du Dich kaputt (hoffentlich nicht), denn CustomDocumentProperties muss man über die späte Bindung ansprechen, und somit brauche ich an der Stelle gar kein _Document.
                      <pre>
                      procedure TMainFrm.OnDocumentBeforeSave(Sender: TObject;
                      var Doc, SaveAsUI, Cancel: OleVariant);
                      var
                      ovParam : OleVariant;
                      begin
                      ovParam := 'Irgendwas';
                      Try
                      If Doc.CustomDocumentProperties[ovParam].Value = 'True' Then
                      Begin
                      ...
                      // Anweisungen zum Speichern in die DB
                      ...
                      End;
                      Except
                      End;
                      end;
                      </pre>
                      Also vielen Dank an Dich und Andreas, ich hab wieder was dazugelernt.<br><br>
                      Schöne Grüße Dagmar

                      Comment


                      • #12
                        Und wenn Du dann noch mit <p>
                        <i>(IDispatch(Doc) as _Document).CustomDocumentProperties</i><p>
                        weiterarbeitest, kannst Du auch noch auf die Vorteile der Code-Vervollständigung zurückgreifen. Effektiv arbeitest Du nämlich mit _Document. Ich habe es jetzt aber nicht getestet, bin aber ziemlich sicher, dass es so geht...<p>
                        Schöne Grüße, Mari
                        Schöne Grüße, Mario

                        Comment


                        • #13
                          Das geht nun wieder nicht. Lies Dir mal die Antwort 8 von Andreas in folgendem Thread durch:<br>
                          <a href="http://www.entwickler-forum.de/WebX?13@@.ee8535a"><a href="/WebX?13@@.ee8535a">Patrick Weisser "Word Dokname direkt über Documentproperties vergeben?" 15.07.2001 13:27</a></a><br><br>
                          Schöne Grüße Dagmar

                          Comment


                          • #14
                            Ah, auch wieder einen Schritt weiter. Stimmt, dass mit der späten Bindung ist dann ein Rettungsanker, der zum Glück noch übrig bleibt<p>
                            Schöne Grüße, Mari
                            Schöne Grüße, Mario

                            Comment

                            Working...
                            X