
四角形を下方向にずらしながら繰り返し描きたい場合、
以下のソースのようにFor ~ Next の中での Dim宣言を
行うのは一般的でしょうか。
他にスマートな記述があれば教えてください。
よろしくお願いします。
---------------------------------------
'四角形を下方向にずらしながら描画
For i = 0 To 10
Dim rect As New Rectangle(x, y* i , w, h)
g.DrawRectangle(Pen.Black, rect)
Next
No.2ベストアンサー
- 回答日時:
RectangleのOffsetメソッドを使うという方向なら Rectangleオブジェクトの生成は1回でいいことになります
dim rect as new Rectangle( x, y, w, h )
for i = 0 to 10
g.DrawRectangle( Pens.Black. rect )
rect.Offset( 0, 1 )
next
といった具合です …
No.8
- 回答日時:
> そうなんです。
とてもできのいいプログラマの方は、グローバル変数だけでほとんどバグのでないただ、一般企業の業務に使うような数万行のプログラムになってくると、
プログラム全体を把握する必要のあるような手法は、やはり不利に
なるでしょう。
初見でも、引数や関数先頭の変数宣言で関数の全体像が分かるほうが
いいと思います。
Sub や Function のコード行数を1画面に収めるって考え方も
ありますよね。
(40行くらいまでに収めてしまって越える部分は別関数に)
そうなってくると変数宣言は1箇所にまとまってくれてた
方が、私は気分的にwスッキリします。
局所的な変数は名称を自由に決めがちだし、むしろそういった
扱いなので、私の周りでは「関数内の変数宣言は関数先頭にまとめる」
傾向が強く残ってます。
ということで、私は変数宣言だけ外出し派です。
# インスタンスの生成は分かり易さ重視で、使いまわしが
# できるのに使い捨て、毎回再作成でも許容範囲内ですね。
# もちろん、使いまわしできるならした方がいいですし、
# データ量が多く、目に見えるパフォーマンスに影響する
# 場合は優先順位が変わりますが。
No.7
- 回答日時:
#3ですが、
#4さんのいうように
>オブジェクト生成コストを減らすために#2さんのコードのように完全に外でnewして宣言する
というのはそのほうがいいと私も思います。
イメージを示すためには
dim rect0 as new Rectangle( x, y, w, h )
dim rect1 as new Rectangle( x, y*1, w, h )
・・・
として、for~next内を
rect = rect0
・・・と書いたほうがよかったかなと途中から思ってはいました。
(といいつつ、#2さんのOffsetを使ったほうがよっぽどいいですが。)
>というか、変数のスコープを絞ることがバグを減らすことに気づいていらっしゃらないようです
というか、バグを増やす結果に陥る現実が隠れています。
>絞る必要が無いならグローバル変数だけでバグの少ないコードが書けるはずですよね?
そうなんです。とてもできのいいプログラマの方は、グローバル変数だけでほとんどバグのでない
プログラムを作ってしまいます。
(できの悪いプログラマが引き継いで、ボロボロにされてしまうことが多く、本当は、
悪い作り方なので、今どきはそういうことをする人は少ないですが。)
一方で、スコープを絞ったがために同じ目的の同じような変数を山のように作られて
わけのわからないプログラムが出来上がってきたりすることが多々あるので、
下手にスコープを絞ることがバグの量産を導いてしまう現実がありました。
## 私は両極端のプログラマしか見ていないのかも。
個人的には、subやfunction、メソッドetcの最初に使う変数をすべて列記しておくほうが
みやすいソースであると思っていることも影響しているのかもしれません。
>複数使うことになったら関数化すべき
というのも正しいとは思いますが、そうしてくれない人が多くって。
プロジェクトにできのいいプログラマさんが多ければ、本当は、
「好きに作れ。但し、バラバラはいやだからちゃんと統一するようにコミュニケーションとってね」
で終わりにしたいのですけど、夢物語なので。
最後に質問者様へ
すみません。本来の質問から脱線してしまって申し訳ないです。
No.6
- 回答日時:
#4ですが、私が#3さんのコードを意味が無いといったのはループの中でnewしているオブジェクトの受け手となる変数をループの外で用意することです。
この場合、変数のスコープを絞るために質問者様のコードのように完全に中でnewして宣言するか、オブジェクト生成コストを減らすために#2さんのコードのように完全に外でnewして宣言するかの二択で、外で宣言して中でnewするという手法は変数スコープの局所化的にもパフォーマンス的にもどっちつかずです。
というか、変数のスコープを絞ることがバグを減らすことに気づいていらっしゃらないようです(絞る必要が無いならグローバル変数だけでバグの少ないコードが書けるはずですよね?)し、
> Rectangleを複数使うとかしたときにややこしい(別々の変数をdimで宣言しようとするのかな?)。
という発言を見るに、変数のスコープを本当に理解していらっしゃるのか疑問です(この場合、For ~ Nextのブロックごと持っていけばいい。rectという変数名をいじる必要も無い。……が、複数使うことになったら関数化すべき)。
> その部分を移動したときに思わぬところでエラーがでる
という問題点があるからこそ変数のスコープはなるべく絞るべきです。
まあ、私が#3さん主導のプロジェクトに所属していて
> 私ならプログラム規約で禁止するでしょうね。
というなら従いますが。
No.5
- 回答日時:
ANo3です。
ANo4の方によると
>For ~ Next の中での Dim宣言を行うのは
という気色の悪いバグの温床のような書き方が、一般的なようです。
ということで、
>お行儀の悪い書き方。
という部分は取り消しておいてください。
"変数のスコープが実際に使用する箇所のみにする"
という意図のようですが、
そもそも、1つのモジュール内で一部分のみにスコープしなければいけないこと自体、
プログラムの構造化に失敗しているしか思えませんし、
Rectangleを複数使うとかしたときにややこしい(別々の変数をdimで宣言しようとするのかな?)。
また、プログラム修正でその部分を移動したときに思わぬところでエラーがでる元になるだけ
(まともなプログラマならエラー表示でるのですぐ分かるレベルでしょうが。)。
と思うのでANo4の方には悪いのですが私ならプログラム規約で禁止するでしょうね。
No.4
- 回答日時:
時と場合によりますが、現在では一般的な書き方です。
なぜなら、変数のスコープが実際に使用する箇所のみにすることができるためです。
で、「時と場合」ですが、Rectangleが生成するのに非常に時間がかかる場合は生成をループ外に持っていく必要があります。
したがって、#3さんには悪いのですが、ループ内でnewしている#3さんの回答はそうする意味がない中途半端なものです。
生成以外には、ループ内では定数値になる計算や、同じファイルに追記するような場合のファイルオープン・クローズなど、時間とリソースを多分に使用してループ内では変化しないものに対する処理はループ外に持っていくのがパフォーマンス上一般的です。
No.3
- 回答日時:
>For ~ Next の中での Dim宣言を行うのは
お行儀の悪い書き方。
VB.net以降は動くみたいですけど、
Dim が「1 つまたは複数の変数を宣言し、記憶域を割り当てます。」
「」内はhttp://msdn.microsoft.com/ja-jp/library/7ee5a7s1 … より。
というのを考えると、
For ~ Nextの間をこの場合10回繰り返すので、
同じ変数を10回宣言し、記憶域を10回割り当てます。
となる。(実際にはそうならないと思うが。)
Dimは、ループの外で宣言すべきです。
Dim rect As Rectangle
For i = 0 To 10
rect = new Rectangle(x, y* i , w, h)
g.DrawRectangle(Pen.Black, rect)
Next
とか書くべきでは?
No.1
- 回答日時:
フォームにPictureBoxを1つ貼り付け。
またコマンドボタンを1つ貼り付け。コマンドボタンのクリックイベントにPrivate Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim x As Double = 10
Dim y As Double = 20
Dim w As Double = 20
Dim h As Double = 10
Dim g As Graphics = PictureBox1.CreateGraphics()
For i = 0 To 10
Dim rect As New Rectangle(x, y * (i - 1) + 30, w, h)
Dim p As New Pen(Color.Black, 1)
g.DrawRectangle(p, rect)
Next
End Sub
デバッグの開始
フォームのコマンドボタンをクリック、で
11個の四角(長方形)が縦に並んでできた。
質問のコードは大まか過ぎるでしよう。VB.Netは色々神経質な言語ですよね。
VBがよく判りすぎて、出来すぎて書くのを省略したのかな。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) ExcelVBAに関する質問 3 2023/02/17 10:47
- Visual Basic(VBA) ①ExcelVBAでカレンダーを作り、別のユザーフォームで日付を入力したいのですがエラーになります。 1 2023/02/17 18:39
- Excel(エクセル) エクセルシート中の全角英数字を半角に変換したい 4 2022/07/07 13:14
- Visual Basic(VBA) excel vbaでvlooupの変数がわかりません。 7 2022/05/30 09:35
- Visual Basic(VBA) 実行時エラー´5854´ 文字列型パラメーターが長すぎます。 3 2023/06/08 21:17
- Excel(エクセル) エクセルで同じ数字同士を自動で線で結ぶVBAを教えてください 6 2022/04/26 23:13
- Visual Basic(VBA) 数字が「0」の列を削除するため、下記のコードを実行しましたが、コンパイルエラーSubまたはFunct 3 2022/12/04 00:00
- Visual Basic(VBA) 前回ご教授いただいたコードに覚えたてのループ処理で品名りんごAから順に20回for nextでループ 7 2023/01/13 22:01
- Visual Basic(VBA) ExcelVBAで、index、match関数を使用して、指定範囲に出力したい 3 2022/10/18 21:53
- Visual Basic(VBA) For~Nextステートメントの終了条件について 1 2023/01/08 18:36
このQ&Aを見た人はこんなQ&Aも見ています
-
【お題】大変な警告
【大喜利】「今このパソコンは大変危険な状態です」という警告メッセージを無視してパソコンを開いたら、こんなことが起こった
-
「これはヤバかったな」という遅刻エピソード
寝坊だったり、不測の事態だったり、いずれにしても遅刻の思い出はいつ思い出しても冷や汗をかいてしまいますよね。
-
モテ期を経験した方いらっしゃいますか?
一生に一度はモテ期があるといいますが、みなさんどうですか? いまがそう! という方も、「思い返せばこの頃だったなぁ」という方も、よかったら教えて下さい。
-
AIツールの活用方法を教えて
みなさんは普段どのような場面でAIツール(ChatGPTなど)を活用していますか?
-
泣きながら食べたご飯の思い出
泣きながら食べたご飯の思い出を教えてください。
-
VBAでループ内で使う変数名を可変にできないか。
Visual Basic(VBA)
-
CloseとDisposeの違い
Visual Basic(VBA)
-
正整数の半角数字かどうか判定する
Visual Basic(VBA)
-
-
4
EXCELで特定のセルに表示された項目をヘッダーやフッターに出力するには
Excel(エクセル)
-
5
Excelでセル参照したとき、書式も一緒に持ってくるには?
Windows Vista・XP
-
6
エクセル関数で日付かどうかの確認?
Excel(エクセル)
-
7
データグリッドビューの一番最初の行に列を追加したい
Visual Basic(VBA)
-
8
変数名の付け方
Java
-
9
VB.NETでのイベントの途中終了
Visual Basic(VBA)
-
10
クラスに配列を渡す方法
Visual Basic(VBA)
-
11
VBの「As String * 128」とは?
Visual Basic(VBA)
-
12
「○○○.ldb」のAccess レコード ロック情報←このファイルが消えません
その他(データベース)
-
13
Integer変数をカラにしたいのですが
Visual Basic(VBA)
-
14
.NETアプリを作ったときの .manifest ファイルって必要なの
C言語・C++・C#
-
15
VB.net でトグルボタンを実現したい
Visual Basic(VBA)
-
16
VB.NET DataGridView 縦スクロールバーを常に表示
Visual Basic(VBA)
-
17
VB.NET getとsetの概念がわかりません。
Visual Basic(VBA)
-
18
tryの終了
Java
-
19
VBのReturnの使い方
Visual Basic(VBA)
-
20
VB.net 引数で配列変数を渡す際の要素数
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
今、見られている記事はコレ!
-
カスハラとクレームの違いは?カスハラの法的責任は?企業がとるべき対応は?
東京都が、客からの迷惑行為などを称した「カスタマーハラスメント」、いわゆる「カスハラ」の防止を目的とした条例を、全国で初めて成立させた。条例に罰則はなく、2025年4月1日から施行される。 この動きは自治体...
-
なぜ批判コメントをするの?その心理と向き合い方をカウンセラーにきいた!
今や生活に必要不可欠となったインターネット。手軽に情報を得られるだけでなく、ネットを介したコミュニケーションも一般的となった。それと同時に顕在化しているのが、他者に対する辛らつな意見だ。ネットニュース...
-
大麻の使用罪がなかった理由や法改正での変更点、他国との違いを弁護士が解説
ドイツで2024年4月に大麻が合法化され、その2ヶ月後にサッカーEURO2024が行われた。その際、ドイツ警察は大会運営における治安維持の一つの方針として「アルコールを飲んでいるグループと、大麻を吸っているグループ...
-
ピンとくる人とこない人の違いは?直感を鍛える方法を心理コンサルタントに聞いた!
根拠はないがなんとなくそう感じる……。そんな「直感がした」という経験がある人は少なくないだろう。ただ直感は目には見えず、具体的な説明が難しいこともあるため、その正体は理解しにくい。「教えて!goo」にも「...
-
中古物件転売時の節税対策にメス?不動産投資家は戦々恐々?元国税が解説
不動産の取引において、土地と建物を一括で売買する場合、土地に消費税はかからないが、建物には消費税がかかる。これを利用して、例えば土地と建物を合計1億円で売る場合、土地の値段を9999万9999円にし、建物を1円...
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一番好きなみそ汁の具材は?
- ・泣きながら食べたご飯の思い出
- ・「これはヤバかったな」という遅刻エピソード
- ・初めて自分の家と他人の家が違う、と意識した時
- ・いちばん失敗した人決定戦
- ・思い出すきっかけは 音楽?におい?景色?
- ・あなたなりのストレス発散方法を教えてください!
- ・もし10億円当たったら何に使いますか?
- ・何回やってもうまくいかないことは?
- ・今年はじめたいことは?
- ・あなたの人生で一番ピンチに陥った瞬間は?
- ・初めて見た映画を教えてください!
- ・今の日本に期待することはなんですか?
- ・集中するためにやっていること
- ・テレビやラジオに出たことがある人、いますか?
- ・【お題】斜め上を行くスキー場にありがちなこと
- ・人生でいちばんスベッた瞬間
- ・コーピングについて教えてください
- ・あなたの「プチ贅沢」はなんですか?
- ・コンビニでおにぎりを買うときのスタメンはどの具?
- ・おすすめの美術館・博物館、教えてください!
- ・【お題】大変な警告
- ・洋服何着持ってますか?
- ・みんなの【マイ・ベスト積読2024】を教えてください。
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・最強の防寒、あったか術を教えてください!
- ・歳とったな〜〜と思ったことは?
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
"判定"の英語表現について
-
DBマジック
-
Detected memory leaks!
-
フォートナイト Epic Games Lau...
-
ライブチャットのオンライン状況
-
一目惚れってどんな感覚?
-
他のアプリからVBのFormへフォ...
-
PICでライントレーサー(C言語)c...
-
aterm MR05LNのwifiルーターみ...
-
vba ListViewの選択色について...
-
ENTERキーでフォーカスを移動し...
-
Wacomのタッチ機能が反応しませ...
-
For ~ Next の中での Dim宣言...
-
大腿骨の骨梁
-
メッセージボックスを前面に表...
-
【至急】フォトショップの「自...
-
至急!! ノートパソコンを3年...
-
どこにもフォーカスを当てたくない
-
C# ReadOnlyのTextBoxで
-
SPREAD(GrapeCity)のセルにフォ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
"判定"の英語表現について
-
vba ListViewの選択色について...
-
Wacomのタッチ機能が反応しませ...
-
For ~ Next の中での Dim宣言...
-
X線CTにおけるコリメータの役割...
-
DBマジック
-
以前アクティブだったウィンド...
-
プログラム中の大カッコについて
-
Shellコマンドで別のexeを起動...
-
flex bisonの導入方法
-
マリオ風の2Dアクションゲー...
-
Detected memory leaks!
-
ライブチャットのオンライン状況
-
一目惚れってどんな感覚?
-
大腿骨の骨梁
-
iPhone 14 Pro 対 GNS3000 のGP...
-
SetTimer関数について。
-
CapsLock送信 キーストローク
-
要約の問題
-
非接触型icカードや電子マネー...
おすすめ情報