none
VB特有の現象 RRS feed

  • 質問

  • どうもYORIGONです。
    DirectX.Direct3D.Font.DrawTextメソッドについてですが
    他の言語(C#.NET, C++.NETなど)では普通にオーバーロードされていて使うことが出来るのですが、なぜかVS.NET2005 Academicでプログラミングをしていたところ

    『エラー 1 class 'Microsoft.DirectX.Direct3D.Font' に同じ名前のメンバが多種類存在するため、'DrawText' があいまいです。 D:\プログラム総合\VSプログラム\DirectXテストプログラムVol4\Form1.vb

    と怒られてしまって緊急対処をしているところです。
    このようなエラーのヘルプを参照したところ

    『このエラーの最も可能性の高い原因は、大文字と小文字の区別です。~・・・
    以降は次のURLでご確認お願いします。
    http://msdn2.microsoft.com/ja-jp/library/ms235408(d=ide).aspx

    対処法が二つほど載っていたので見てみたところ元の定義されているプログラムが変更できることが可能であれば変更の検討をしてくださいとあります。
    しかし、DirectXではこのようなことは出来ないのではないかと思います。

    もうひとつは、その問題のコードを削除するとあるのですが、これはDirectXプログラミングテストしているので、削除したら意味がありません、ということは
    VB.NET2005 Academicで、DirectX.Direct3D.Font.DrawTextメソッドの利用は不可能になるのでしょうか?

    このような事はどうすればよいのでしょうか?

    自分の今の対処方としては別の言語(C#.NET or C++.NET)で例のメソッドを使うように再定義しクラスライブラリ化してそれをVBで呼び出している現状です。

    他にVBで使えるような対処はないのでしょうか?

    2006年7月3日 13:51

回答

  • YORIGONです。
    ishisakaさん返信送れてすみませんでした。
    実際にishisakaさんの言われたどおりやってみましたが、何も変わらないまま
    同じエラーが起きます。

    やはり、VBでは使うことが出来ないのでしょうか・・・・・

    2006年7月17日 8:44

すべての返信

  • とりあえず、その近辺のソースコードくらいは出しましょう。

    現象が理解できても、そう出るのが適切かどうかは計れません。

    2006年7月3日 23:15
  • 返信送れて大変申しわけございません
    またソースコードの提示忘れもすみませんでした。

    例の問題のソースコードです。

    =======グローバル変数
     Dim dev As Device     ’Direct3DのDeviceクラス
     Dim bmp As Bitmap    ’画像読み込みよう
     Dim spr As Sprite      ’スプライト変数
     Dim Tex As Texture     ’テクスチャー変数
     Dim p As New Point(320, 240)
     Dim s As Integer = 0
     Dim Fon As Microsoft.DirectX.Direct3D.Font ’Direct3Dフォントクラス


    =======Drawsという描画メソッドを定義
     Private Sub Draws(ByVal v As Integer)
      dev.Clear(ClearFlags.Target, Color.Black, 0, 0)
      dev.BeginScene()
      spr.Begin(SpriteFlags.AlphaBlend)

      spr.Draw2D(Tex, New Point(0, 0), Geometry.DegreeToRadian(v), New Point(-50, -50), Color.White)
      Fon.DrawText(spr, "test", 0, 0, System.Drawing.Color.White)

      spr.End()
      dev.EndScene()

      dev.Present()
     End Sub

    ======コンストラクタを定義
     Public Sub New()
      InitializeComponent()

      Me.ClientSize = New Size(640, 480) ’クライアントサイズを640*480に

      Dim pp As New PresentParameters ’デバイスのパラメータを定義する変数
      pp.Windowed = True   ’ウィンドウモードにする
      pp.SwapEffect = SwapEffect.Discard ’スワップエフェクトはデバイスカードにお任せする
     ’デバイスのインスタンスを生成(すべてハードウェア処理にする)
      dev = New Device(0, DeviceType.Hardware, Me, CreateFlags.HardwareVertexProcessing, pp)
     ’スプライトのインスタンスを生成
      spr = New Sprite(dev)
     ’画像を読み込みテクスチャーにセット
      bmp = New Bitmap("line.bmp")
      Tex = Texture.FromBitmap(dev, bmp, Usage.None, Pool.Managed)
     ’Direct3Dフォントインスタンスを生成
      Fon = New Microsoft.DirectX.Direct3D.Font(dev, New System.Drawing.Font("MS ゴシック", 14, FontStyle.Regular, GraphicsUnit.Pixel))

     End Sub


    =======キーダウンイベントを定義
     Private Sub Form1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
      Select Case e.KeyCode
       Case Keys.Up       ’上キーが押されたとき
        s += 1
        If s = 361 Then s = 0

       Case Keys.Down     ’下キーが押されたとき
        s -= 1
        If s = -1 Then s = 360

      End Select
      Me.Text = s
      Draws(s)
     End Sub

    コメントを詳しく記述していなくて申し訳ございませんm(_ _)m
    そしてVS.NETに怒られるラインはDrawsメソッドの7行目です。
    ここで『エラー 1 class 'Microsoft.DirectX.Direct3D.Font' に同じ名前のメンバが多種類存在するため、'DrawText' があいまいです。』
    といわれてしまいます。

    2006年7月9日 14:15
  • Fon.DrawText(spr, "test", 0I, 0I, System.Drawing.Color.White)

    上のように引数の整数値にInteger型を示すリテラル”I(アイ)”を負荷してもだめでしょうか。もしくはInteger型の変数を宣言しておき渡してあげるとか。

    Dim x As Integer = 0

    Dim y As Integer = 0

    Fon.DrawText(spr, "test", x, y, System.Drawing.Color.White)

    VisualBasicでは通常0はInteger型であると見なされますが、変数型にセンシティブなところ(プロシージャのオーバーロード)では、明示的にコンパイラに対して型がわかるようにしておいた方が良いと思います。

     

    2006年7月13日 21:53
  • YORIGONです。
    ishisakaさん返信送れてすみませんでした。
    実際にishisakaさんの言われたどおりやってみましたが、何も変わらないまま
    同じエラーが起きます。

    やはり、VBでは使うことが出来ないのでしょうか・・・・・

    2006年7月17日 8:44
  •  検索したらこの記事を発見したので書き込んでおきます。

     たしかにこの現象は VB.NET で起こり、ほかの言語では(C# しか知らないですが)起こらないようです。

     どうやらこれは DLL のバグで、Microsoft.DirectX.Direct3DX の DLL のバージョンが 1.0.2902.0 で起こり、1.0.2903.0 以降では起こらないようです。お試しください。

    2006年8月14日 4:23
  • YORIGONです。
    オノデラさん、どうもご返答ありがとうございます。
    こちらの応答が遅すぎてもうしわけございませんでした。
    オノデラさんの言うとおりバージョンを変えただけで全てのエラーが解消されました。

    本当にありがとうございます。
    返答の遅れを本当に申し訳ございませんでした。
    これから注意するようにします。

    2006年8月22日 16:57