Paintイベントが実行できません
- 開発環境Vista+VB2008において、Label_E_2.Paintイベントが実行できません。
- Label_E_2.Invalidate()からのPaintイベントが常に停止し、別のイベント中の行が緑色になります。
- コード中のFor Eachループが毎回の行でイベントを停止させている可能性があります。
- ベストアンサー
Paintイベントが実行できません。。。
Paintイベントが実行できません。。。 こんにちは、いつも勉強させていただいております。 質問させていただきます。どうぞよろしくお願いいたします。 新年早々とんちんかんな質問でしたら申し訳ございません^^; 開発環境Vista+VB2008になります。 デバッグ開始(再生ボタン)後、Label_E_2.Invalidate()からの Label_E_2.Paintイベントがしょっちゅう実行できなくなるので、 一時停止ボタンを押してみると毎回、別のイベント(Label_E_1.Paint)中の 決まった行が緑色になり、 「このスレッドによって現在の関数が実行された後、次に実行されるステートメントです。」 と表示されます(←理解できておりませんorz) For Each コントロール In Panel1.Controls If InStr(コントロール.name, "_E_") Then コントロール.Image = My.Resources.Btn_E_OFF End If ↑この行でございます Next 毎回この行でPaintイベントが止まっているようなイメージを受けております。 「コントロール」という変数の使い方がまずいのでしょうか。。。? もしかすると解放作業か何か必要になるのかな?などと試行錯誤いたしております。 以前別のプログラムで同じようなコードを作成したときは問題なかったのですが。。。 Googleで検索などいたしましても出てこず、悩んでおります。 どのような現象なのかだけでもアドバイスいただくことができれば嬉しいです。 もしお詳しい方がいらっしゃいましたら,アドバイスいただきたく どうぞよろしくお願いいたします。
- MKT_
- お礼率99% (329/330)
- Visual Basic
- 回答数1
- ありがとう数1
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
Invalidate実行 ↓ Paintイベントが発生する ↓ イベントハンドラで画像を更新する ↓ Paintイベントが発生する ↓ イベントハンドラで画像を更新する ↓ Paintいべんt・・・以下無限にループ といった状況になっているのではないでしょうか?? Paintイベント内でImageプロパティを変更すると、このような無限ループに陥ることになるので、Paintイベントによる描画処理と画像の設定は別々に扱ったほうがよいと思います。 例:画像を設定してからInvalidaを呼び出す、など。 設計が変更できない状況であれば、フラグを用いて、Paintイベントの処理中に同じイベントが呼び出されたら即座に脱出するような仕組みを組み込めばよいかと。 Private blnPainting As Boolean = False Private Sub Control_Paint(ByVal sender As Object...(略) If blnPainting Then Return blnPainting = True ' 描画処理 ' この処理中にControl_Paintが呼び出されても大丈夫。 blnPainting = False End Sub
関連するQ&A
- repaint()が実行されません。
repaint()が実行されません。 もともとあるJEditorPane上に画像表示させるために、他のクラスからrepaint()をよびだしてpaint()を実行させようとしているのですが、実行されません……。 以下にプログラムを表示します。 import java.net.*; import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.awt.image.BufferedImage; import java.io.File; import javax.imageio.ImageIO; import java.io.IOException; public class Open extends JFrame { public Open(){ } public void paint(Graphics g){ System.out.println("paint開始"); Graphics2D g2 = (Graphics2D)g; BufferedImage readImage = null; try { readImage = ImageIO.read(new File("sample.png")); } catch (Exception e) { e.printStackTrace(); readImage = null; } if (readImage != null){ g2.drawImage(readImage, 0, 0, this); } } public void Fileload(){ System.out.println("再描写"); repaint(); } } 外部のクラスからFileload()を呼び出して実行すると"再描写"はコマンドプロンプト上に表示されるのですが"paint開始"は表示されません。なのでpaint()の呼び出しができていないのだと思うのですが……。 原因がわかりません……。 javaも質問も初心者なのでわかりづらいところがあるとは思いますが、どうぞよろしくお願いします。
- ベストアンサー
- Java
- AccessVBA全てのコントロールのイベントを取得したいです。
AccessVBA全てのコントロールのイベントを取得したいです。 フォーム上にコントロールが20個ほどあります。 現在は抽出ボタンを使用し、抽出実行イベントを行っています。 出来れば、すべてのAfterUpdate()で抽出実行させたいのですが、 コードの書き方がわかりません。 全てのコントロールに対しAfterUpdate()のイベントを書くしか方法はないでしょうか? フォーム内どのコントロールでも抽出実行Functionさせたいです。 ExcelVBAの様にシート内の全てのChangeイベントの様な取得方法はないものでしょうか? ご存じの方がおられましたら、アドバイスよろしくお願いいたします。 m(_ _)m
- ベストアンサー
- その他(プログラミング・開発)
- firefoxとjavascriptとeventと。
firefoxで、javascript内からeventを渡す時についての質問です。 制作環境はdreamweaver 8です。 dreamweaverで、ボタンのロールオーバー時に画像を変化させる時に自動的にMM_swapImage()というfunctionが作られますが、 ボタンのロールオーバー時に、もう一つ、吹き出しの出るfunctionを実行したいので、このようにしました。 function MM_swapImage() { //v3.0 var i,j=0,x,a=MM_swapImage.arguments; document.MM_sr=new Array; for(i=0;i<(a.length-2);i+=3) if ((x=MM_findObj(a[i]))!=null){ document.MM_sr[j++]=x; if(!x.oSrc) x.oSrc=x.src; x.src=a[i+2]; } var chkName=MM_swapImage.arguments[0]; if(chkName == 'Image4') showTooltip(event,'リンクの内容1'); if(chkName == 'Image5') showTooltip(event,'リンクの内容2'); if(chkName == 'Image6') showTooltip(event,'リンクの内容3'); if(chkName == 'Image7') showTooltip(event,'リンクの内容4'); } showTooltip()では、event.clientX等を取得して、表示に反映させます。 これまでの経過は、 ・safariでは正常に表示される。 ・単純にhtmlの「onmouseover=showTooltip(event,'リンクの内容1');」では、firefoxでも正常に表示される。 原因を色々調べたところ、 ・「chkName」は取得できていて、if文も問題ない。 ・eventを数字等に変えるとshowTooltip自体は一応実行される。 といった状況です。 おそらくfirefoxでは、eventをjavascriptから取得するにはなにか別の方法があるのでは?と思い、調べてみたのですが、 window.event document.event と表記してみるくらいしか分かりませんでした。 (両方とも試しましたが、変化無しです) もし何か分かる方がいらっしゃいましたらご教示頂けると幸いです。
- ベストアンサー
- JavaScript
- KeyDownイベントで数字以外は発生しません。なぜでしょうか。
KeyDownイベントで数字以外は発生しません。なぜでしょうか。 電卓を作っているのですが、キーボードからの対応をしているさなか大きな壁に当たりました。 フォームのKeyDownイベントでキーボードからの入力をキャッチする。 数字や演算、エンターキー。 フォームには、電卓を作るのに必要なボタンなどの配置はしてあります。 数字を表示する部分はLabel1にしています。 試験的に下記のソースで実験したところ、テンキーの数字以外、例えば演算キーをキーボードから入力すると、下記のソース通りならば、○算と表示されるはずです。しかし、なぜか数字と表示されます。 つまり、演算キーを押したにも関わらず、数字が入力されたとして処理されたということです。 なぜでしょうか。 そして、試験的にそれぞれが入力成功した時はLabelに表示されるようにしました。 Private Sub Form6_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown //↓エンターキーが押されたとき If e.KeyCode = Keys.Enter Then Label1.Text = "Enter" //↓演算キー及び点が入力されたとき ElseIf &H6A <= e.KeyCode <= &H6F Then Select Case e.KeyCode Case &H6A Label1.Text = "乗算" Case &H6B Label1.Text = "加算" Case &H6D Label1.Text = "減算" Case &H6E Label1.Text = "小数点" Case &H6F Label1.Text = "除算" End Select End If //↓delキーが押されたときの場合 If e.KeyCode = Keys.Delete Then Label1.Text = "Del" End If // ↓は数字1から9までが対象に入ります。 If &H60 <= e.KeyCode <= &H69 Then Label1.Text = "数字" End If End Sub keycode表はマイクロソフトのキーコード定数を見て作りました。 僕がお伺いしたいのは、これらすべてを正常に対応させたいわけです。 数字、演算キー、その他のキーボード入力が正常にできるようにしたいのですが、どうもうまくできません。 なせかずべて数字ほうに行ってしまいます。これでは話にならないので、対処法はありませんか? 環境は Win7 Ultimate 64bit Visual Studio 2010 (VB) です。 何卒、よろしくお願い申し上げます。
- ベストアンサー
- Visual Basic
- Page_Load時にボタンクリックイベントを実行するには?
ASP.NETでPage_Load時にボタンクリックイベントを実行するにはどのようにすればいいのでしょうか? 具体的には、HTTPクエリ文字列のresultが"1"の場合はbutton1_Clickイベントを実行したいのですが、やりかたが分かりません。 サンプルソースの★の部分に button1_Click(sender, System.Web.UI.ImageClickEventArgs.Empty) と入れたら、 「型 'System.EventArgs' のオブジェクトを型 'System.Web.UI.ImageClickEventArgs' にキャストできません。」 というエラーメッセージが表示されてしまいます。 ■■■■■■サンプルソース■■■■■■ Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 'クエリー取得(数値チェック) If Request.QueryString("result").ToString = "1" Then '検索ボタン押下処理を表示する ★button1_Clickイベントを実行したい。 End If End Sub '検索ボタン押下 Protected Sub button1_Click(ByVal sender As Object, ByVal e As System.Web.UI.ImageClickEventArgs) Handles button1.Click '検索結果を表示する : End Sub
- 締切済み
- Microsoft ASP
- 【.NET】Rexourcesのファイル名をStringや変数で指定..
こんばんは.いつも勉強させていただいております. 質問させていただきます.どうぞよろしくお願いいたします. VB2008でコントロールの画像をResourcesの中のファイルから呼び出して切り替えております. ただコントロールの数が非常に多く, Button_1.BackgroundImage = My.Resources.Button_1 Button_2.BackgroundImage = My.Resources.Button_2 : : : : と毎回書くのが手間なので, For Each コントロール In GroupBox_1.Controls コントロール.BackgroundImage = My.Resources.・・・(コントロール.Name) '↑適当です..^^; Next のように,ボタン名の文字列(String)から画像ファイルを指定したいのですが, うまくいきません... フルパス指定でしたら””で囲まれた文字列なので コントロール.BackgroundImage = Image.FromFile(Path & コントロール.Name & ".JPG") のようにできると思うのですが,これだとビルドしたExeファイルを 他のPCで実行すると「ファイルが見つかりません」みたいなエラーが 出るので使えません.... もしお詳しい方がいらっしゃいましたら,是非ともアドバイスを いただきたくお願い申し上げます. どうぞよろしくお願いいたします.
- ベストアンサー
- Visual Basic
- イベント処理
javaでプログラムを作り始めて間がないのですが、イベント処理に関して行き詰ってしまいました。望む動作は、メニュー→ゲーム→じゃんけんと選択すると、初期の状態として「じゃんけん・・・・」という文字とボタンが表示され、どれかボタンを押すと対応して「~ボタンが押されました」と表示させたいのですが、作ったプログラムだと、ボタンを押しても反応しません。後々メニューにもいくつかアイテムを追加したり、最終的にはコンピュータとじゃんけんをするプログラムを書きたいと思っています。ifを使った方法しか思いつかないのですが、どこがおかしいのでしょうか? import javax.swing.*; import java.awt.event.*; import java.awt.BorderLayout; public class question extends JFrame implements ActionListener{ JLabel label1; JPanel p2; public static void main(String[] args){ question test = new question("質問"); test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); test.setVisible(true); } question(String title){ setTitle(title); setBounds( 10, 10, 300, 250); JMenuBar menuBar = new JMenuBar(); JMenu menu = new JMenu("メニュー"); JMenu submenu = new JMenu("ゲーム"); JMenuItem subitem1 = new JMenuItem("じゃんけん"); subitem1.addActionListener(this); subitem1.setActionCommand("Start"); submenu.add(subitem1); menu.add(submenu); menuBar.add(menu); setJMenuBar(menuBar); JPanel p1 = new JPanel(); p2 = new JPanel(); label1 = new JLabel(""); JButton btn1 = new JButton("グー"); btn1.addActionListener(this); btn1.setActionCommand("goo"); JButton btn2 = new JButton("チョキ"); btn2.addActionListener(this); btn2.setActionCommand("cyoki"); JButton btn3 = new JButton("パー"); btn3.addActionListener(this); btn3.setActionCommand("paa"); p1.add(label1); p2.add(btn1); p2.add(btn2); p2.add(btn3); getContentPane().add(p1, BorderLayout.PAGE_START); getContentPane().add(p2, BorderLayout.PAGE_END); p2.setVisible(false); } public void actionPerformed(ActionEvent e){ String cmd = e.getActionCommand(); if (cmd.equals("Start")){ p2.setVisible(true); label1.setText("じゃんけん・・・・"); if (cmd.equals("goo")){ label1.setText("グーが押されました"); }else if (cmd.equals("cyoki")){ label1.setText("チョキが押されました"); }else if (cmd.equals("paa")){ label1.setText("パーが押されました"); } } } }
- ベストアンサー
- Java
- C# panelのなかのpctureBox
panel1のなかのpictureBox1 QNo.8077421の続き http://okwave.jp/qa8077421.html Form1にPicturBox1をはりつけてダブルクリックでイベントハンドラを作る Properties.Resources.IconH;は、*.bmp private void pictureBox1_Click(object sender, EventArgs e) { pictureBox1.Image = Properties.Resources.IconH; } これは、OK private void pictureBox1_Click(object sender, EventArgs e) { int a = 1; Control c = this.Controls["PictureBox"+a.ToString()]; ((PictureBox)c).Image = Properties.Resources.IconH; } これも、OK ここからがうまくいきません。 panel1を貼り付けPicturBox1をpanel1のなかに。 pictureBox1.Image = Properties.Resources.IconH; これは、OK ここからです。 int a = 1; Control c = this.Controls["PictureBox"+a.ToString()]; ((PictureBox)c).Image = Properties.Resources.IconH; これは、 NG NullReferenceException はハンドルされませんでした。 オブジェクト参照がオブジェクト インスタンスに設定されていません。 ((PictureBox)c).Image = Properties.Resources.IconH;これ これをつかいたい。 アドバイスをお願いできませんでしょうか。
- ベストアンサー
- C・C++・C#
- ASP.Net GridView Select
大変お世話になっております。 GridView のテンプレートにボタンを2つ配置しております。 A と B どちらのボタンのCommandName にも Select を記述して 選択された行のあるフィールドの値を取得したいのですが、 GridView1_SelectedIndexChanging で、e.NewSelectedIndex を使い該当セルを見つけることはできるのですが、AとBのボタンそれぞれで違うことをしたいのです。 イメージ的にいいますと If CommnadButton.Name = "A" then Aでやりたいこと else If CommandButton.Name = "B" then Bでやりたちこと end if CommnadButton.Name なんてメソッドもプロパティも存在しないものですが、 SelectedIndexChanging イベントの中で どのボタンが押されてこのイベントが実行されるのかが、わかる方法がございましたら、ぜひご教授いただけますと大変助かる次第でございます。 何卒よろしくお願い申し上げます。
- ベストアンサー
- Microsoft ASP
- C# 画面のちらつきを解消したい
C#でウィンドウズアプリケーションを作っています。 ある処理範囲内でRefreshやInvalidateが大量にあり、画面がちらついてしまいます。 このRefreshやInvalidateの処理を一時的に無効にすることはどのようにすれば良いのでしょうか? アドバイスよろしくお願いします。 private void button1_Click(object sender, System.EventArgs e) { Console.WriteLine("何かの処理実行中・・・"); //ここから for(int i=1; i<=1000; i++) { System.Threading.Thread.Sleep(1); label1.Text=i.ToString(); this.Refresh(); this.Invalidate(true); } //ここまで のちらつきを防止したい //(実際の処理は単純なループではない) label1.Text="end"; Console.WriteLine("引き続き何かの処理実行中・・・"); }
- 締切済み
- その他(プログラミング・開発)
お礼
うぃず先生`ー´ゞ どうもありがとうございます!!! 明けましておめでとうございますm(_ _)m >Paintイベント内でImageプロパティを変更すると、このような無限ループに陥ることになるので おっしゃられます通り、コードの整理目的でImageプロパティ 変更コードをPaintイベント内に移動いたしました^^; この2日で他にも一気にいろんなことをやってしまいましたので 原因が掴めておりませんでしたが、おそらくビンゴでございます。 過去に他のコードで別サブルーチンを呼び出してしまうことに 気がついた経験がありましたので、今回もバグ取り中に注意していた つもりでございましたが、まさか自身のサブルーチンを 呼び出してしまいますとは。。。今すぐ直してきます! 本当にいつもどうもありがとうございます。お陰でまた今から コーディングの続きを楽しむことができます。 (いろいろとアドバイスいただけますお陰で、いろんな工夫が できるようになりました。 年末年始も結構いろんな機能を作製できました^^ まだバグ取りタイムがほとんどですが。。。orz) 今回も勉強になりました!どうもありがとうございました!!!