none
VB6.0でのPictureBoxのコピー RRS feed

  • 質問

  • VB6.0でピクチャーボックスをコピーするにはどうすればいいでしょうか
    メモリ上にPictureBoxの配列を確保し、画面上のPictureBoxを保存する関数を作成したのですが
    エラーになってしまいます。
    画面上からメモリ上のPictureBoxにコピーする場合は何か特殊な宣言が必要なのでしょうか。


    '構造体宣言
    Private Type TFListRec
        pF As PictureBox  'ピクチャーボックス
        sFnm As String    'ファイル名
    End Type
    Private LIST_PIC(10) As TFListRec

    'イメージを取得(するはずの関数)
    Public Sub GetPicture(iIndex As Integer, ByRef pImg As PictureBox)
        pImg = LIST_PIC(iIndex).pF
    End Sub

    'イメージをワークメモリに追加(するはずの関数)
    Public Function AddPicture(pImg As PictureBox, strFullPath As String) As Boolean
        Dim strFPath() As String
        Dim sFnm As String
       
        AddPicture = True
        g_strErr = ""
        On Error GoTo END_ERR:
        'ファイル名の取得
        strFPath = Split(strFullPath, "\")
        sFnm = strFPath(UBound(strFPath))
        LIST_PIC(1).sFnm = sFnm              'ファイル名
        LIST_PIC(1).pF = pImg.Image           'ピクチャーの保存(ここでエラー)

        LIST_PIC(1).pF.Picture = pImg.Image           'ピクチャーの保存(ここでエラー)
        LIST_PIC(1).pF = pImg.Picture                     'ピクチャーの保存(ここでエラー)
        LIST_PIC(1).pF.Image = pImg                       'ピクチャーの保存(ここでエラー)


        On Error GoTo 0
        Exit Function
    END_ERR:
        '失敗
        Dim er AS string
        er = Err.Description            'オブジェクト変数または With ブロック変数が設定されていません。
        AddPicture = False
    End Function

    2008年3月17日 1:57

回答

  •  いちろう さんからの引用

        Set g_Tpic(1).pF = New PictureBox
    「newキーワードの使用法が不正です」

     

    失礼しました。 なんとなく気にはしてましたが試さずに書いてしまいました。

    #なんかVB6は遠い昔になってしまった。。。

     

    インスタンスを作りたいなら、Me.Controls.Add メソッドでインスタンス作成と追加をする必要があります。

    その上で(n).pFに設定してください。

     

    Pictureプロパティのみでよいならインスタンス云々は無しにして、

    pF の型をStdPictureとして、PictureBoxを保存するのではなく、Picture プロパティを保存してみてください。

    2008年3月17日 4:06
  • 構造体メンバーのpFのインスタンス用のコントロール配列オブジェクトをフォームに準備します

    たとえば Picture2(0) といった具合の物です

    ピクチャーボックスをフォームなどに貼り付けて Indexプロパティを0に、VisibleプロパティをFalseに設定します

     

    Form_Loadイベントなどで

    Code Snippet

    dim n as integer

    for n=0 to 10

      if n > 0 then

        ' インデックス0は登録済みなので Loadしない

        Load Picture2(n)

      end if

      set List_PIC(n).pf = Picture2(n)

    next

     

     

     

    といった具合でインスタンスを 構造体のメンバーに代入しておきます

     

    データの設定関数では

    LIST_PIC(n).pF.Picture = pImg.Image

    のみでいいと思います

    2008年3月17日 4:57
  •  redfox63 さんからの引用

    Code Snippet

        Load Picture2(n)

     

    あぁ、これも忘れてました。。。

    2008年3月17日 5:44
  •  いちろう さんからの引用

    Set LIST_PIC(1).pF = New StdPicture
    を無しにするとやはり
    'オブジェクト変数または With ブロック変数が設定されていません。
    とやはりエラーになってしまいます。

     

    Set LIST_PIC(1).pF = New StdPicture
    Set LIST_PIC(1).pF = pImg.Picture

     

    このどちらも文法としては正しいですし、正しく動作するはずです。>確認済み

    後者のほうがエラーとなるならpImgがNothingなのでは?

     

    2008年3月17日 5:53

すべての返信

  •  いちろう さんからの引用

        er = Err.Description            'オブジェクト変数または With ブロック変数が設定されていません。

     

    そのまんま。

    pFのインスタンスを作成してください。

     

    2008年3月17日 2:16
  • インスタンス作成とはメモリの確保のことだと思うのですが
        Set g_Tpic(1).pF = New PictureBox
    とすると
    「newキーワードの使用法が不正です」
    というエラーになります

    他のクラスはこの記述でうまくいくのですが・・・
    PictureBoxは何か特殊な記述があるのでしょうか
    2008年3月17日 3:11
  •  いちろう さんからの引用

        Set g_Tpic(1).pF = New PictureBox
    「newキーワードの使用法が不正です」

     

    失礼しました。 なんとなく気にはしてましたが試さずに書いてしまいました。

    #なんかVB6は遠い昔になってしまった。。。

     

    インスタンスを作りたいなら、Me.Controls.Add メソッドでインスタンス作成と追加をする必要があります。

    その上で(n).pFに設定してください。

     

    Pictureプロパティのみでよいならインスタンス云々は無しにして、

    pF の型をStdPictureとして、PictureBoxを保存するのではなく、Picture プロパティを保存してみてください。

    2008年3月17日 4:06
  • 構造体メンバーのpFのインスタンス用のコントロール配列オブジェクトをフォームに準備します

    たとえば Picture2(0) といった具合の物です

    ピクチャーボックスをフォームなどに貼り付けて Indexプロパティを0に、VisibleプロパティをFalseに設定します

     

    Form_Loadイベントなどで

    Code Snippet

    dim n as integer

    for n=0 to 10

      if n > 0 then

        ' インデックス0は登録済みなので Loadしない

        Load Picture2(n)

      end if

      set List_PIC(n).pf = Picture2(n)

    next

     

     

     

    といった具合でインスタンスを 構造体のメンバーに代入しておきます

     

    データの設定関数では

    LIST_PIC(n).pF.Picture = pImg.Image

    のみでいいと思います

    2008年3月17日 4:57
  • 結論から言うとだめでした

    保存するのはPictureプロパティのみで良いので試してみたのですが・・・
    構造体宣言
    Private Type TFListRec
        pF As StdPicture  'ピクチャー
        sFnm As String    'ファイル名
    End Type
    Private LIST_PIC(10) As TFListRec
    と宣言し直し

        Set LIST_PIC(1).pF = New StdPicture
        LIST_PIC(1).pF = pImg.Picture         'ピクチャーの保存(プロパティの使い方が不正です)

    とすると、
    プロパティの使い方が不正です
    というエラーになります。
    Set LIST_PIC(1).pF = New StdPicture
    を無しにするとやはり
    'オブジェクト変数または With ブロック変数が設定されていません。

    とやはりエラーになってしまいます。

    色々ありがとうございます。
    StdPictureなど今まで試していないことも教えて頂いたので
    もう一度ちょっと整理して、また書き込んでみます。


    2008年3月17日 4:58
  •  redfox63 さんからの引用

    Code Snippet

        Load Picture2(n)

     

    あぁ、これも忘れてました。。。

    2008年3月17日 5:44
  •  いちろう さんからの引用

    Set LIST_PIC(1).pF = New StdPicture
    を無しにするとやはり
    'オブジェクト変数または With ブロック変数が設定されていません。
    とやはりエラーになってしまいます。

     

    Set LIST_PIC(1).pF = New StdPicture
    Set LIST_PIC(1).pF = pImg.Picture

     

    このどちらも文法としては正しいですし、正しく動作するはずです。>確認済み

    後者のほうがエラーとなるならpImgがNothingなのでは?

     

    2008年3月17日 5:53
  • こんにちは。中川俊輔 です。

     

    まどかさん、redfox63さん、回答ありがとうございます。

     

    いちろうさん、フォーラムのご利用ありがとうございます。

    その後いかがでしょうか?

    有用な情報と思われたため、まどかさん、redfox63さんの回答へ回答済みチェックをつけさせていただきました。

    追加の質問等ありましたら、是非投稿してください!

     

    回答済みチェックが付くことにより、有用な情報を探している方が情報を見つけやすくなります。
    有用な情報と思われる回答があった場合は、なるべく回答済みボタンを押してチェックを付けてください。

    いちろうさんはチェックを解除することもできますので、ご確認ください。

     

    それでは!

     

    2008年3月24日 8:14