Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi [MathType API] Word-Formelfelder zu MathML konvertieren (https://www.delphipraxis.net/73879-%5Bmathtype-api%5D-word-formelfelder-zu-mathml-konvertieren.html)

Aenogym 25. Jul 2006 09:17


[MathType API] Word-Formelfelder zu MathML konvertieren
 
hi ihr,

mithilfe von MathType kann man in Word-Dokumenten ja so ganz tolle Mathematische Formeln erstellen und anzeigen (besser, als die einfachen selbstgetippten Formelfelder àlà EQ \F(2;3) oder der integrierte Formeleditor).
Ich möchte nun aus einem Worddokument sämtliche Formelfelder (nicht die OLE-Objekte des Formeleditors, sondern die einfachen WordEquations, die in Textform eingegeben werden) konvertieren, um sie in MathML auszeichnen zu können.
Das ganze Funktioniert auch prächtig mit dem Programm MathType von DesignScience. MathType bietet auch eine API, mit der ich das ganze über mein Programm automatisieren kann etc.
Nur leider funktionieren die API-Aufrufe nicht wirklich :(

Es gibt die Datei "MathPage.wll", die praktisch eine normale DLL mit Word-spezifischen Dinge ist. Ich habe die Funktion MTXFormEqn() aus dieser DLL in meinem Programm aufgerufen. Jedoch bekomme ich, anstelle des MathML-Codes, immer einen leeren String als Ergebnis.

Hier mal ein wenig Code:

Delphi-Quellcode:
//Deklaration der externen Funktion
function MTXFormEqn(src: Integer; srcFmt: Integer; srcData: PChar;
           srcDataLen: Cardinal; dst: Integer; dstFmt: Integer;
           out dstData: PChar; dstDataLen: Cardinal; dstPath: PChar;
           out dims: MTAPI_DIMS): Cardinal; external 'MathPage.wll';

//Aufruf in meinem Programm
var AWordEQ: string;
    pEqnOut: PChar;
    rDims: MTAPI_DIMS;
begin
  pEqnOut := '';
  AWordEQ := ' EQ \F(2;3) '; //entspricht dem Bruch 2/3

  MTXFormEqn(mtxfmLOCAL, mtxfmTEXT, PChar(AWordEQ), Length(AWordEQ), mtxfmLOCAL,
             mtxfmTEXT, pEqnOut, 1, nil, rDims);
  //in pEqnOut sollte jetzt der MathML-Code stehen.....
end;
Die Deklaration und den Aufruf habe ich nach bestem Wissen und Gewissen dem SDK nachempfunden (welches leider nur VBA behandelt).
Hier mal ein Auszug:

Zitat:

MTXFormEqn

Code:
Public Function MTXFormEqn (
    src As Integer,
    srcFmt As Integer,
    srcData As String,
    srcDataLen As Long,
    dst As Integer,
    dstFmt As Integer,
    dstData As String,
    dstDataLen As Long,
    dstPath As String,
    dims As MTAPI_DIMS
) As Long
Transforms an equation (uses options specified via MTXFormAddVarSub, MTXFormSetTranslator, and MTXFormSetPrefs)

Note: Variations involving mtxfm_PICT or dstFmt=mtxfm_HMTEF are not callable from VBA.
Parameterssrc [in] Equation data source, either:
mtxfmPREVIOUS => data from previous result
mtxfmCLIPBOARD => data on clipboard
mtxfmLOCAL => data passed (i.e. in srcData)

Note: srcFmt, srcData, and srcDataLen are used only if src is mtfxmLOCAL
srcFmt [in] Equation source data format (mtxfmXXX, see next)
srcData [in] Depends on data source (src)
mtxfmMTEF => MTEF-binary
mtxfmPICT => PICT
mtxfmTEXT => either MTEF-text or plain text
srcDataLen [in] # of bytes in srcData
dst [in] Equation data destination, either
mtxfmCLIPBOARD => transformed data placed on clipboard
mtxfmFILE => transformed data in the file specified by dstPath
mtxfmLOCAL => transformed data in dstData

Note: dstFmt, dstData, and dstDataLen are used only if dst is mtfxmLOCAL (data placed on the clipboard is either an OLE object or translator text)
dstFmt [in] Equation data format (mtxfmXXX, see next)
dstData

[out] Depends on data destination (dstFmt)
mtxfmMTEF => MTEF-binary
mtxfmHMTEF => handle to MTEF-binary
mtxfmPICT => PICT data
mtxfmTEXT => translated text or, if no translator, MTEF-text
mtxfmHTEXT => handle to translated text or, if no translator, MTEF-text

Note: If translator specified dstFmt must be either mtxfmTEXT or mtxfmHTEXT for the translation to be performed
dstDataLen [in] # of bytes in dstData (used for mtxfmLOCAL only)
dstPath [in] destination pathname (used if dst == mtxfmFILE only, may be NULL if not used)
dims [out] pict dimensions, may be NULL (valid only for dst = mtxfmPICT). See MTAPI_DIMS definition above in Types section.
Habt ihr vielleicht schon einmal mit der MathType-API gearbeitet und könnt mir weiterhelfen? Oder habt ihr vielleicht nützliche Links, die einem da helfen können (ich hab mich schon dämlich gesucht :()

danke, wie immer, im voraus,
aeno

Flocke 25. Jul 2006 09:42

Re: [MathType API] Word-Formelfelder zu MathML konvertieren
 
Code:
Public Function MTXFormEqn (
    src As Integer,
    srcFmt As Integer,
    srcData As String,
    srcDataLen As Long,
    dst As Integer,
    dstFmt As Integer,
    dstData As String,
    dstDataLen As Long,
    dstPath As String,
    dims As MTAPI_DIMS
) As Long
Ein paar Anmerkungen:
1. Die Funktion ist bestimmt stdcall.
2. VB Parameter ohne ByVal sind normalerweise var oder out.
3. Ein Integer in VB hat nur 16 Bit und ist ein damit SmallInt in Delphi.

Es wäre einfacher wenn's für das SDK auch eine C-Header-Datei gäbe.

Aenogym 25. Jul 2006 10:36

Re: [MathType API] Word-Formelfelder zu MathML konvertieren
 
Zitat:

Zitat von Flocke
Ein paar Anmerkungen:
1. Die Funktion ist bestimmt stdcall.
2. VB Parameter ohne ByVal sind normalerweise var oder out.
3. Ein Integer in VB hat nur 16 Bit und ist ein damit SmallInt in Delphi.

Danke für die Tipps! Ich probier's gleich mal aus.

Zitat:

Zitat von Flocke
Es wäre einfacher wenn's für das SDK auch eine C-Header-Datei gäbe.

Richtig. Es gibt aber nur *.dot-Dateien (MS Word-Vorlage), in denen VBA-Code ist :(

Edit: es hat leider nichts geholfen. Der zurückgegebene String ist noch immer leer :(

aeno

Aenogym 26. Jul 2006 08:54

Re: [MathType API] Word-Formelfelder zu MathML konvertieren
 
hi nochmal,

es will einfach nicht klappen :(
ich habe schon etliche dinge versucht, doch mein resultierender string bleibt immer leer. sogar den weg, die ausgangsformel in die zwischenablage zu kopieren, der DLL dies per parameter mitzuteilen und das konvertierte ergebnis wieder aus der zwischenablage zu holen, bin ich gegangen. doch der string in der zwischenablage bleibt im ausgangszustand... :(

so sieht das ganze im VBA-original-source aus:
Code:
//deklaration
Public Declare Function MTXFormEqn Lib "MathPage.WLL" ( _
   ByVal src As Integer, ByVal srcFmt As Integer, ByVal srcData As String, ByVal srcDataLen As Long, _
   ByVal dst As Integer, ByVal dstFmt As Integer, ByVal dstData As String, ByVal dstDataLen As Long, _
   ByVal dstPath As String, ByRef dims As MTAPI_DIMS) As Long

//aufruf
stat = MTXFormEqn(mtxfmCLIPBOARD, mtxfmTEXT, dummyStr1, 1, _
        dest, destFormat, dummyStr2, 1, path, dummyDims)
und so sieht mein delphi-code jetzt aus:
Delphi-Quellcode:
//deklaration
function MTXFormEqn(src: SmallInt; srcFmt: SmallInt; srcData: PChar;
           srcDataLen: Cardinal; dst: SmallInt; dstFmt: SmallInt;
           var dstData: PChar; dstDataLen: Cardinal; dstPath: PChar;
           var dims: MTAPI_DIMS): Cardinal; stdcall; external 'MathPage.wll';

//aufruf
  iFormResult := MTXFormEqn(mtxfmCLIPBOARD, mtxfmTEXT, ' ', 1, mtxfmCLIPBOARD,
                           mtxfmTEXT, ' ', 1, ' ', rDims);
ist das so wenigstens richtig übersetzt?

aeno

Flocke 26. Jul 2006 09:09

Re: [MathType API] Word-Formelfelder zu MathML konvertieren
 
Wieso sieht die Deklaration in VB denn auf einmal so anders aus als vorher (ByVal), hast du sie einfach umgestellt (das geht nicht) oder hast du sie vorher nicht richtig abgeschrieben? Funktioniert das Ganze denn in VBA, also z.B. in Word?

Mein Prototyp für deine ursprüngliche Funktion wäre:
Delphi-Quellcode:
function MTXFormEqn(var src, srcFmt: SmallInt; var srcData: PChar; var srcDataLen: LongInt;
  var dst, dstFmt: SmallInt; var dstData: PChar; var dstDataLen: LongInt;
  var dstPath: PChar; var dims: MTAPI_DIMS):LongInt; stdcall; external 'MathPage.wll';
Wenn jedoch deine zweite Variante richtig ist, dann musst du das "var" vor "dstData" wegmachen.

Sofern du nicht über das Clipboard gehst, muss du den Inhalt von "dstData" natürlich vorher z.B. mit AllocMem holen und nachher mit FreeMem wieder freigeben. Wieviele Bytes du alloziiert hast, musst du in dstDataLen angeben.

Aenogym 26. Jul 2006 09:14

Re: [MathType API] Word-Formelfelder zu MathML konvertieren
 
Danke für deine Antwort!

Zitat:

Zitat von Flocke
Wieso sieht die Deklaration in VB denn auf einmal so anders aus als vorher (ByVal), hast du sie einfach umgestellt (das geht nicht) oder hast du sie vorher nicht richtig abgeschrieben? Funktioniert das Ganze denn in VBA, also z.B. in Word?

Die erste Variante habe ich aus der Dokumentation des SDK. Und die zweite Variante ist direkt aus dem VBA-Code kopiert. Und diese zweite Variante funktioniert ja auch so in Word.

Zitat:

Zitat von Flocke
Mein Prototyp für deine ursprüngliche Funktion wäre:
Delphi-Quellcode:
function MTXFormEqn(var src, srcFmt: SmallInt; var srcData: PChar; var srcDataLen: LongInt;
  var dst, dstFmt: SmallInt; var dstData: PChar; var dstDataLen: LongInt;
  var dstPath: PChar; var dims: MTAPI_DIMS):LongInt; stdcall; external 'MathPage.wll';
Wenn jedoch deine zweite Variante richtig ist, dann musst du das "var" vor "dstData" wegmachen.

Sofern du nicht über das Clipboard gehst, muss du den Inhalt von "dstData" natürlich vorher z.B. mit AllocMem holen und nachher mit FreeMem wieder freigeben. Wieviele Bytes du alloziiert hast, musst du in dstDataLen angeben.

Ich probiere mal deinen Prototyp (minus var vor dstData - ich nehme den Weg übers Clipboard).

Edit: Hm, aufgrund des ByVal wäre es doch richtiger, die ganzen var wegzulassen, oder nicht?

aeno

Flocke 26. Jul 2006 09:25

Re: [MathType API] Word-Formelfelder zu MathML konvertieren
 
Zitat:

Zitat von Aenogym
Hm, aufgrund des ByVal wäre es doch richtiger, die ganzen var wegzulassen, oder nicht?

Genau das habe ich ja auch geschrieben:
Zitat:

Zitat von Flocke
Wenn jedoch deine zweite Variante richtig ist, dann musst du das "var" vor "dstData" wegmachen.


Aenogym 26. Jul 2006 10:25

Re: [MathType API] Word-Formelfelder zu MathML konvertieren
 
Leider noch keine Verbesserung :(
Die Formel bleibt unangerührt....

Ich glaube, ich schreibe ein abgewandeltes Makro dafür, dass ich dann benutzte... (Mpf, das heißt dann VBA aneignen :shock:)

Aber danke für deine Hilfe! :)
aeno


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:45 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz