2017-01-13 1 views
0

Ich muss das Drucken von Outlook-Benutzereigenschaften unterdrücken, die programmatisch zu einer E-Mail-Nachricht hinzugefügt wurden. Ich hatte die folgende Frage gesehen, die eine Lösung für dot.net hier Suppressing Outlook Field Printing hat, aber ich habe Probleme, den Code nach Delphi zu übersetzen. Mein Hauptproblem ist die invokeMember Zeile, die ich rate, ich muss userproperty.invoke irgendwie in Delphi verwenden, aber ich bin ratlos darauf, wie ich die Parameter verwenden sollte, die die Aufrufmethode erfordert. Kann mir jemand helfen, die Lösung von dieser Frage in Delphi-Code zu übersetzen?Unterdrücken von Benutzereigenschaften Drucken mit Outlook-Nachrichten

Antwort

0

Dank mit Hilfe der Menschen von Addin-Express habe ich eine funktionierende Lösung ... das scheint für Outlook 2016 noch andere Outlook-Versionen zu testen. Das Problem war, dass ich nicht wusste, welche Parameter für die Aufruffunktion zu verwenden sind.

Ich poste meine Funktion hier

function TAddInModule.RemoveUserPropertyPrintFlag( 
    var aUserProperty: UserProperty): Boolean; 
const 
    propID: integer = 107; 
    removePrinterFlag: integer = $4; 
var 
    res: OleVariant; 
    disp : TDispParams; 
    flags: Integer; 

    dispIDs: array[0..0] of TDispID; 
    args: array [0..0] of TVariantArg; 
begin 
    Result := False; 
    disp.cNamedArgs:= 0; 
    disp.cArgs:= 0; 
    if aUserProperty.Invoke(propID, GUID_NULL, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYGET, disp, @res, nil, nil) = S_OK then 
    begin 
    if TVarData(res).VType = varInteger then 
    begin 
     flags := TVarData(res).VInteger; 
     args[0].vt := VT_INT; 
     args[0].intVal := flags and (not removePrinterFlag); 
     disp.cArgs := 1; 
     disp.cNamedArgs := 1; 
     dispIDs[0]:= DISPID_PROPERTYPUT; 
     disp.rgdispidNamedArgs := @dispIDs; 
     disp.rgvarg := @args; 
     Result:= aUserProperty.Invoke(propID, GUID_NULL, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYPUT, disp, nil, nil, nil) = S_OK; 
    end; 
    end; 
end; 

Der übersetzte Code aus der Antwort des anderen Stackoverflow delphi sollte so etwas wie diese (nicht getestet):

function TAddInModule.SuppressUserPropertyPrinting(mailItem: _MailItem) : HResult; 
const 
    propID: integer = 107; 
    removePrinterFlag: integer = $4; 
var 
    props: UserProperties; 
    prop: UserProperty; 
    i: integer; 
    res: OleVariant; 
    disp : TDispParams; 
    flags: Integer; 
    dispIDs: array[0..0] of TDispID; 

    args: array [0..0] of TVariantArg; 
begin 
    props := mailItem.UserProperties; 
    if props.Count > 0 then begin 
    for i := 1 to props.Count do begin 
     prop := props.Item(i); 

     disp.cNamedArgs:= 0; 
     disp.cArgs:= 0; 
     Result:= prop.Invoke(propID, GUID_NULL, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYGET, disp, @res, nil, nil); 

     if TVarData(res).VType = varInteger then begin 
     flags := TVarData(res).VInteger; 

     args[0].vt := VT_INT; 
     args[0].intVal := flags and (not removePrinterFlag); 
     disp.cArgs := 1; 
     disp.cNamedArgs := 1; 
     dispIDs[0]:= DISPID_PROPERTYPUT; 
     disp.rgdispidNamedArgs := @dispIDs; 
     disp.rgvarg := @args; 
     Result:= prop.Invoke(propID, GUID_NULL, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYPUT, disp, nil, nil, nil); 
     end; 

     prop := nil; 
    end; 
    end; 
    props := nil; 
end; 
0

Sie müssen IDispatch.Invoke() in Delphi verwenden. Disp-ID ist 107 und der Wert muss eine Variante des Typs varInteger und der Wert 4 sein. Es gibt einige Beispiele für das Aufrufen von IDispatch.Invoke im VCL-Quellcode.

Wenn die Option Redemption eine Option ist, wird die Eigenschaft RDOUserProperty .Printable explizit verfügbar gemacht.

Verwandte Themen