3

LuaInterfacefor.NETを使用してWindowsフォームオブジェクトを作成しています。これは、1つのことを除いて、かなりうまく機能します。

Anchorのプロパティを使用して、自動的にサイズを変更したいと思いControlます。アンカーの1つだけを設定した場合(たとえば、のみAnchorStyles.Top)、それは機能しますが、これは実際には意味がありません。複数のアンカーを設定する必要があります。これは、「ビット単位または」と組み合わせて(または数値で追加するだけで)実行されます。

VB.Netでは、両方が機能します。

Dim myLabel As New Label()
myLabel.Anchor = AnchorStyles.Top
myLabel.Anchor = AnchorStyles.Top + AnchorStyles.Left + _
                 AnchorStyles.Bottom + AnchorStyles.Right

Luaでは、これは機能します:

luanet.load_assembly("System.Windows.Forms")
local WinForms = luanet.System.Windows.Forms
local myLabel = WinForms.Label()
myLabel.Anchor = WinForms.AnchorStyles.Top

...しかし、この追加の行はそうではありません:

myLabel.Anchor = WinForms.AnchorStyles.Top + WinForms.AnchorStyles.Left + 
               WinForms.AnchorStyles.Bottom + WinForms.AnchorStyles.Right

次のエラーが発生します。

LuaInterface.LuaException: attempt to perform arithmetic on
field 'Top' (a userdata value)

これはある意味で正しいので、「LuaInterfaceは列挙値を対応する列挙型のフィールドとして扱います」(LuaInterface:.NET CLRをLuaでスクリプト化する)。


値を数値として割り当てることもできません。

myLabel.Anchor = 15    -- 15 = 8 + 4 + 2 + 1 = Top+Left+Right+Bottom

今回は、エラーメッセージはかなり不特定です。

LuaInterface.LuaException: function

どうすればこれを回避できますか?

Luaで番号を正しい列挙型に型キャストする可能性はありますか?

4

1 に答える 1

1

私はついにこれを行う方法を理解しました。ToObjectの方法を使用しましたSystem.Enum。変換したい列挙型と、使用する整数値が必要です。

以下は、私のヘルパーライブラリのコードスニペットです。

local EnumToObject, WinFormsAnchorStylesType = 
                luanet.get_method_bysig(luanet.System.Enum, "ToObject",
                                             "System.Type", "System.Int32"),
                luanet.System.Windows.Forms.AnchorStyles.Top:GetType()

AnchorTop, AnchorLeft, AnchorRight, AnchorBottom = 1, 4, 8, 2

function Anchor(flags)
  return EnumToObject(WinFormsAnchorStylesType, flags)
end

次のように使用します。

Label1 = luanet.System.Windows.Forms.Label()
Label1.Anchor = Anchor(AnchorLeft + AnchorTop + AnchorRight + AnchorBottom)
于 2012-02-24T19:27:35.110 に答える