Announcement

Collapse
No announcement yet.

WLL ? Fehler.....

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

  • WLL ? Fehler.....

    Habe eine WLL mit Delphi, die ich in den Startup Ordner von Word gepackt habe. Die WLL startet also, wenn ich Word starte.
    Die WLL erstellt ein Menü-Eintrag in Word. Wenn ich auf diesen Klicke, rufe ich einen Dialog auf (dialog ist ins Delphi-Projekt eingebunden).
    Nun bringt mir Word ein Zugriffs-Fehler, wenn ich auf den erstellten Menüeintrag klicke. Dieser muß irgendwie an der Zeile
    frmGeschichtsEintrag.Show;
    liegen.
    Wieso geht das nicht? Was mache ich falsch?
    <pre>
    Library xword32;
    uses
    windows,
    sysutils,
    word32 in 'word32.pas',
    worddef in 'worddef.pas',
    GeschichtsEintrag in 'GeschichtsEintrag.pas' {frmGeschichtseintrag};

    Var
    WordBasic:TWordBasic;

    Procedure xwTest; export; stdcall;
    begin
    frmGeschichtsEintrag.Execute;
    end;

    Function wdAutoOpen(docId : integer) : integer; export; stdcall;
    Begin
    Result:=1;
    WordBasic:=TWordBasic.Create(docID);
    WordBasic.RegisterFunction('xwTest','XWord32 DLL');
    WordBasic.AddMenu('Travel Master SLK',7,0);
    WordBasic.AddMenuItem('Travel Master SLK','Geschichts-Eintrag','xwTest',1,0);
    end;

    procedure wdAutoRemove; export; stdcall;
    begin
    WordBasic.Free;
    end;

    exports
    wdAutoOpen INDEX 1,
    wdAutoRemove INDEX 2,
    xwTest INDEX 3;

    begin
    end.
    </pre>
    Die aufgerufenen Prozedur sieht so aus:
    <pre>
    procedure TfrmGeschichtseintrag.Execute;
    begin
    if (TfrmGeschichtsEintrag = nil) then begin
    TfrmGeschichtsEintrag.Create(Application);
    end;
    frmGeschichtsEintrag.Show;
    frmGeschichtsEintrag.free;
    end;
    </pre>

  • #2
    Hallo,

    das Problem tritt auf, weil <i>frmGeschichtsEintrag</i> beim Aufruf von Show <b>nicht initialisiert</b> ist und somit auf keine gültige Speicheradresse zeigt.

    Mit der Anweisung <i>if (TfrmGeschichtsEintrag = nil) then TfrmGeschichtsEintrag.Create(Application)</i> wird zwar eine Instanz erzeugt, aber <b>keiner</b> Variablen zugewiesen, so dass diese Instanz als "Leiche" im Arbeitsspeicher unerreichbar ist.

    Mit der Zeile <i>frmGeschichtsEintrag := TfrmGeschichtsEintrag.Create(nil)</i> sollte sich das Problem lösen lassen - allerdings taucht dann ein anderes Problem auf :-)

    Da das Formular über Show als <b>nichtmodales</b> Formular aufgerufen wird, sorgt die letzte Zeile (Free) dafür, dass das Formular sofort wieder verschwindet.

    P.S: Mit welcher Word-Version wird gearbeitet? Eine WLL ist "veraltet" und wird ab Word 2000 durch das <b>COM AddOn</b> ersetzt. In meinem Buch <i>COM/DCOM/COM+ mit Delphi</i> ist ein Beispielprojekt (COM-Objekt, dass die von Word bereitgestellte IDTExtensibility-Schnittstelle implementiert), das zeigt, wie man auf dem neuen Weg einen eigenen Button in der Word-Toolbar unterbringt und als Reaktion auf das Anklicken ein eigenes Delphi-Formular aufrufen kann, das Daten im Dokument ändert.

    Comment


    • #3
      Eine WLL funktioniert dafuer aber auch mit Word97 (wird noch viel eingesetzt).<br>
      Ansonsten ist bei wdAutoOpen das COM-Interface von Word noch nicht initialisiert (zumindest bei Word97)

      Comment


      • #4
        Es wird mit Word 97 und Word 2000 gearbeitet...was ist dann am besten ? COM oder WLL ? Oder muss ich dann beides machen - für 97 WLL und für 2000 COM ?

        Comment

        Working...
        X