2017-01-13 5 views
0

Outlookアイテムのユーザープロパティの印刷をプログラムによってメールアイテムに追加しないようにする必要があります。私はdot.netのための解決策を持っている次の質問を見たSuppressing Outlook Field Printingしかし、私は問題をコードをデルファイに翻訳している。私の主な問題は、invokememberラインです。私は、デルファイで何らかの方法でuserproperty.invokeを使用する必要があると思いますが、invokeメソッドが必要とするパラメータをどのように使うべきかについてはわかりません。誰かがその質問からの解決策をデルファイのコードに翻訳するのを助けることができますか?Outlookのメールアイテムでユーザープロパティ印刷を抑制する

答えて

0

アドインエクスプレスの人々の助けを借りてありがとう、私は働くソリューションを持っています...それはOutlook2016のために働くようですが、まだ他のOutlookバージョンをテストする必要があります。問題は、私はinvoke関数に使用するパラメータがわからないことでした。

私は他のstackoverflowの答えからデルフォイが変換されたコードは、このような何か(テストしていない)でなければなりません

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; 

ここに私の機能を掲示しています:

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

デルファイでIDispatch.Invoke()を使用する必要があります。 Disp idは107で、値はvarInteger型の値と4の値の型でなければなりません。VCLソースコードでIDispatch.Invokeを呼び出す例がかなりあります。

Redemptionを使用する場合は、オプションでRDOUserProperty .Printableプロパティを明示的に公開します。

関連する問題