C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[3]: はがき作成 配列についてです。


(過去ログ 24 を表示中)

[トピック内 8 記事 (1 - 8 表示)]  << 0 >>

■10607 / inTopicNo.1)  はがき作成 配列についてです。
  
□投稿者/ ビンゴV (1回)-(2007/11/22(Thu) 12:02:52)

分類:[VB.NET/VB2005] 

初めまして、よろしくお願いします。
現在、はがきの裏側を作成するシステムを作っております。
言語はVB.NET2003です。

質問内容は初心者なりにいろいろと調べてやってみたのですがいまいち配列の作り方がわかりません。

@文章追加ボタンを押すとpictureboxが生成されるようになっています。
A生成したpictureboxはmousedown、up、move、clickなどたくさんのイベントがあります。
なのでFriend WithEventsで宣言しています。
B各イベント時にタグの値をとってきてSelect Caseで実行しています。
C二つ生成したら二つ目は動作するのですが一つ目が動作しなくなります。
Dよく考えたらタグ(iの値)が上書きされているから動作しなくなるんだ。までは分かりました。

そこで生成するpictureboxを配列化しようとしたのですがfriend witheventsでは配列化できない。
というエラーがでます。

あるところで Dictionary<string, PictureBox> crl = new Dictionary<string, PictureBox>(); を使ってみては?
とご教授いただいたのですが、まったく使い方がわからず困っています。

どなたかよい案はございませんでしょうか?よろしくお願いいたします。
引用返信 編集キー/
■10609 / inTopicNo.2)  Re[1]: はがき作成 配列についてです。
□投稿者/ もみ (2回)-(2007/11/22(Thu) 12:45:59)
2007/11/22(Thu) 12:47:44 編集(投稿者)
2007/11/22(Thu) 12:47:37 編集(投稿者)

こんにちは^^
Dictionaryの使い方は以下のようになります。

> Dictionary<string, PictureBox> crl = new Dictionary<string, PictureBox>(); 
Dictionary<string, PictureBox> crl = new Dictionary<string, PictureBox>(); 
PictureBox img1 = new PictureBox();
PictuerBox img2 = new PictureBox();

crl.Add("one", img1 );
crl.Add("two", img2 );

これを呼び出すときは、
crl["one"].image などなどです。

参考:http://www.atmarkit.co.jp/fdotnet/dotnettips/429dictionary/dictionary.html

No10607 (ビンゴV さん) に返信
> 初めまして、よろしくお願いします。
> 現在、はがきの裏側を作成するシステムを作っております。
> 言語はVB.NET2003です。
>
> 質問内容は初心者なりにいろいろと調べてやってみたのですがいまいち配列の作り方がわかりません。
>
> @文章追加ボタンを押すとpictureboxが生成されるようになっています。
> A生成したpictureboxはmousedown、up、move、clickなどたくさんのイベントがあります。
> なのでFriend WithEventsで宣言しています。
> B各イベント時にタグの値をとってきてSelect Caseで実行しています。
> C二つ生成したら二つ目は動作するのですが一つ目が動作しなくなります。
> Dよく考えたらタグ(iの値)が上書きされているから動作しなくなるんだ。までは分かりました。
>
> そこで生成するpictureboxを配列化しようとしたのですがfriend witheventsでは配列化できない。
> というエラーがでます。
>
> あるところで Dictionary<string, PictureBox> crl = new Dictionary<string, PictureBox>(); を使ってみては?
> とご教授いただいたのですが、まったく使い方がわからず困っています。
>
> どなたかよい案はございませんでしょうか?よろしくお願いいたします。
引用返信 編集キー/
■10611 / inTopicNo.3)  Re[2]: はがき作成 配列についてです。
□投稿者/ ビンゴV (2回)-(2007/11/22(Thu) 13:12:22)
No10609 (もみ さん) に返信
ご教授ありがとうございます。
以前もdictionaryを使おうとしたのですが、定義されていません。というエラーがでるんです…。
引用返信 編集キー/
■10612 / inTopicNo.4)  Re[3]: はがき作成 配列についてです。
□投稿者/ もみ (3回)-(2007/11/22(Thu) 13:50:47)
2007/11/22(Thu) 13:53:57 編集(投稿者)

No10611 (ビンゴV さん) に返信
> ■No10609 (もみ さん) に返信
> ご教授ありがとうございます。
> 以前もdictionaryを使おうとしたのですが、定義されていません。というエラーがでるんです…。

こんにちは^^

「定義されていません」とエラーが出るとの事ですが、
Dictionaryは、名前空間「System.Collections.Generic」に属するクラスですが、
プログラムの先頭で定義していますでしょうか?
もしくは、「System.Collections.Generic.Dictionary」のようにフル指定してみるのも
よろしいかもしれないですね。

今思えば、.NET2003なんですね^^;
Dictionaryは、.NET Framework 2.0からサポートされているクラスなので、
.NET Framework 1.1では使えないですね・・・。
すみません、条件を見落としてました;;

引用返信 編集キー/
■10613 / inTopicNo.5)  Re[1]: はがき作成 配列についてです。
□投稿者/ yamyam (7回)-(2007/11/22(Thu) 13:57:26)
No10607 (ビンゴV さん) に返信
> そこで生成するpictureboxを配列化しようとしたのですがfriend witheventsでは配列化できない。
動的にコントロールを作成・配置しているのなら、
作成した各コントロールに対してイベントを関連付ければ良いのでは?

1個のコントロールなら...
Addhandler hoge.Click, AddressOff hogehogeClick

配列なら...
Addhandler hoge(index).MouseMove, AddressOff hogehogeClick

イベントハンドラはこんな感じで。
(イベントに対するシグネチャを要確認)
Sub hogehogeClick(ByVal sender As Object, ByVal e As System.EventArgs)
   ...
End Sub
こいつの senderにイベントが発生したコントロールが来るので、
適当にキャストして使うとか。

> あるところで Dictionary<string, PictureBox> crl = new Dictionary<string, PictureBox>(); を使ってみては?
> とご教授いただいたのですが、まったく使い方がわからず困っています。
こちらですね?
http://dobon.net/cgi-bin/vbbbs/cbbs.cgi?mode=al2&namber=20849&no=0
http://dobon.net/cgi-bin/vbbbs/cbbs.cgi?mode=al2&namber=20897&no=0No10611 (ビンゴV さん) に返信
> 以前もdictionaryを使おうとしたのですが、定義されていません。というエラーがでるんです…

名前空間の指定がよろしくないのでは...。

VS2005のHelpより
Dictionary ジェネリック クラス
名前空間: System.Collections.Generic

Importsを使うか、全部書いてしまえば良いかと。

# pictureboxを使う理由を知りたいのですが。

引用返信 編集キー/
■10616 / inTopicNo.6)  Re[2]: はがき作成 配列についてです。
□投稿者/ ビンゴV (3回)-(2007/11/22(Thu) 14:54:38)
みなさまいろいろとご教授ありがとうございました。
自己解決しました!



> # pictureboxを使う理由を知りたいのですが。

これは縦書きをするときにpictureboxではないとできない為です。
他にやり方があるかもしれませんがpictureboxしか思いうかばなかったので…。
解決済み
引用返信 編集キー/
■10617 / inTopicNo.7)  Re[4]: はがき作成 配列についてです。
□投稿者/ yamyam (9回)-(2007/11/22(Thu) 15:32:40)
2007/11/22(Thu) 15:35:07 編集(投稿者)

なんか気になったので取りあえず。

No10616 (ビンゴV さん) に返信
> みなさまいろいろとご教授ありがとうございました。
> 自己解決しました!
>
その解決方法をみんなが探しているわけで...
何をもって解決したのか報告しましょう。

No10607 (ビンゴV さん) に返信
> @文章追加ボタンを押すとpictureboxが生成されるようになっています。
> A生成したpictureboxはmousedown、up、move、clickなどたくさんのイベントがあります。
> なのでFriend WithEventsで宣言しています。

この文章から考えると、フォーム上に動的に生成されたPictureBoxを
マウスによって位置を動かせる様な感じですか?

そうではなく、複数の文章を描画するだけなら
1. 必要な情報(座標、文章、フォント、etc)を管理するクラスか構造体を定義
2. ボタンクリックでこいつを新規に作成し、情報を設定
3. 配列(or List)に追加
4. 描画対象フォーム(or コントロール)のPaintイベント内で描画

みたいな流れを妄想してみたり。
PictureBoxの機能を使ってなければですけどね。

> B各イベント時にタグの値をとってきてSelect Caseで実行しています。
配列としてグルグル回さずにSelect Caseを使うのであれば
TagプロパティよりもNameプロパティに入れた方が、個人的には良いかと。(String型ですけど)
継承してIndexプロパティを追加するとか。
#魔法の箱 <-> Tagプロパティ

> Dよく考えたらタグ(iの値)が上書きされているから動作しなくなるんだ。までは分かりました。
#上書きされているのはタグではなくて、対象コントロールの参照の方だと思う...たぶん。


No10616 (ビンゴV さん) に返信
>># pictureboxを使う理由を知りたいのですが。
>
> これは縦書きをするときにpictureboxではないとできない為です。
> 他にやり方があるかもしれませんがpictureboxしか思いうかばなかったので…。

http://dobon.net/cgi-bin/vbbbs/cbbs.cgi?mode=al2&namber=20849&no=0
こっちを見るとDrawTextを使っているのでPictureBoxである必要はないはず。
別にLabelでもいいのではないかと。AutoSizeプロパティのからみでは?
解決済み
引用返信 編集キー/
■10628 / inTopicNo.8)  Re[3]: はがき作成 配列についてです。
□投稿者/ カンタービレ (80回)-(2007/11/22(Thu) 20:10:37)
ま・・間に合わなかった・・デス。。

2005で動かしちゃいましたが、せっかくなので解決例の代わりにテストしたコードを載せてみマス。
とりあえず動的にPictureBoxを追加しつつ、
それぞれのコントロールでマウス移動イベント拾ってマス。
なんかカッコ悪いコード・・。

    Dim mIndex As Integer = 0
    Dim pbArray() As PictureBox     '// 動的PictureBoxコントロール配列

    '// ボタン押ささったらコントロールを追加しマス!
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim pb As New PictureBox()               '// 追加するコントロール
        Dim gr As Graphics                       '// 書き込むグラフィック
        Dim fn As New Font("MS ゴシック", 14)  '// ふぉとん(雑字がベスト)
        Dim sf As New StringFormat()             '// 縦書き
        Dim rc As RectangleF                     '// れくたんF

        Try
            '// とりあえず適当に値セットデス
            With pb
                .Tag = mIndex
                .Top = 0
                .Left = 40 * mIndex
                .Width = 40
                .Height = Me.Height
                .Image = New Bitmap(pb.Width, pb.Height)
            End With

            gr = Graphics.FromImage(pb.Image)
            '// 縦書きの指定
            sf.FormatFlags = StringFormatFlags.DirectionVertical
            rc = New RectangleF(0, 0, pb.Width, pb.Height)
            gr.FillRectangle(Brushes.WhiteSmoke, rc)
            gr.DrawString("カンタービレ", fn, Brushes.Red, rc, sf)

            '// イベントを関連させマス
            AddHandler pb.MouseMove, AddressOf PictureBox_MouseMove

            '// なんかカッコ悪いのは気にしないで配列追加
            If pbArray Is Nothing Then
                ReDim pbArray(0)
            Else
                ReDim Preserve pbArray(pbArray.Length)
            End If
            pbArray(mIndex) = pb

            '// フォームに追加配置デス
            Me.SuspendLayout()
            Me.Controls.Add(pb)
            Me.ResumeLayout(False)

            mIndex += 1

        Finally
            If Not fn Is Nothing Then fn.Dispose()
            If Not gr Is Nothing Then gr.Dispose()
        End Try
    End Sub

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -