2011年1月28日金曜日

【VB.NET】フォームがコードのようなアイコン表示になりデザインが開けなくなった

ありますよね。時々。原因は不明ですが。

その時の原因はプロジェクトがクラスをフォームとして認識していない場合です。
VBからは直接直せないので、 vbproj のファイルをテキストエディタやメモ帳で開きましょう。

クラスはこのように記述されています、
  1. <compile Include="clsUpdate.vb" />  

フォームの場合は通常、このように記述されています。
  1. <compile Include="frmMain.vb">  
  2.       <subtype>Form</SubType>  
  3. </Compile>  

原因はこのフォームの中の

<subtype>Form</SubType>

がいつの間にか消えてしまうことが原因なんです。

確認してみてくださいね。

2011年1月24日月曜日

【VB.NET】Formを継承した場合にデザイン時でも継承元のLoadイベント実行への対処

Formを継承すると
なんと、継承元のFormに存在するLoadイベントが
継承したFormのデザイン時に自動実行されてしまいます。
これは私もハマりました。。


継承元のLoadイベントにて、ユーザー名の取得や画面名の取得、権限コードの取得など
データベースのデータを取得するコードを記述していると具合が悪いです。

その場合、デザイン時は処理したくないので、以下のコードを継承元FormのLoadイベントの最初に挿入します。

  1. Private Sub FormName_Load(ByVal sender As ObjectByVal e As System.EventArgs) Handles Me.Load  
  2.         'デザイン時は処理しない  
  3.         If AppDomain.CurrentDomain.FriendlyName = "DefaultDomain" Then  
  4.             Exit Sub  
  5.         End If  
  6. End Sub  

これで継承元のLoadイベントがデザイン時に動きません。

2011年1月23日日曜日

【VB.NET】プログラムリファレンス作成のSandCastle

Java でいう JavaDoc のようなプログラムリファレンスを作るためのソフト。
SandCastle





SandCastle を使用するために見ればいいリンクを羅列。

・まずSandcastle本体。

Sandcastle-June 2010 Release (Version 2.6.1062.1)
http://sandcastle.codeplex.com/releases/view/47665

・パッチをあてておこう

Sandcastle June 2010 (2.6.10621.1) Patch - Rev 1
http://sandcastlestyles.codeplex.com/releases/view/47767

・GUI環境を導入しよう

Sandcastle Help File Builder
http://shfb.codeplex.com/

・使い方を説明して頂いているリンク
http://blogs.wankuma.com/esten/archive/2007/09/12/95500.aspx
http://d.hatena.ne.jp/Wacky/20071007/1191782352


・通常に出力するとかなり時間がかかるのでMSDNへのリンクを切って高速化
http://narista.cocolog-nifty.com/gk/2007/06/sandcastle_f67f.html
※SdkLinkType が○○SdkLinkTypeとたくさんあるので注意


このソフトを使わない場合、プログラムのコメントはバラバラだわ、
プログラム内容の説明資料は作らないといけないだわ、
作った後も同期化しないといけないだわ、
と良いことなしですが、

メンバーにコメントをつける癖も付けられそうですし、すこぶる楽になりますね。

自分もリンクを忘れないようメモです。

GUIを使うやり方でやりましたが、CUIのコマンドラインでできるようになれば、
Windowsのタスクに組み込んで定期的に更新されるよう作れたりしますね。
非常に便利!

2011年1月22日土曜日

【VB.NET】PixivDownLoadBrowser ver.1.3 Update!

PixivDownLoadBrowser ver.1.3 を更新しました。
http://www.vector.co.jp/soft/winnt/net/se484370.html
【更新内容】
・R-18漫画のダウンロードエラーを修正
・画面レイアウトの修正
・コメント情報取得を修正
・イラストタイトルの最後にスペースが入っているダウンロード不具合を修正
・イラスト名に ? が入っている場合にエラーになる不具合修正
・Ctrl + D でダウンロードショートカット
・コピーや貼り付けなどのショートカット制限を解除
・自動ログインを修正


また全国誌である iP! 2月号に載りました!
小さいですが、これも一歩です!

2011年1月21日金曜日

【VB.NET】データテーブルのRowStateで変更されていないデータはUnChangedに設定する

DataTable にて、一度編集して、
また元の値に戻した場合RowStateが Modified になってしまいます。
一度編集したとはいえ、やはり全く同じ値ならばUpdateは走らせたくありませんよね!

その場合は、以下の関数をコピペして使ってみてください。

  1. Public Sub RowStateSetUnChanged(ByVal dt As DataTable)  
  2.   
  3.         If IsNothing(dt) Then  
  4.             Return  
  5.         End If  
  6.   
  7.         For RowIdx As Integer = 0 To dt.Rows.Count - 1  
  8.             Dim dr As DataRow = dt.Rows(RowIdx)  
  9.   
  10.             If dr.RowState <> DataRowState.Modified Then  
  11.                 Continue For  
  12.             End If  
  13.   
  14.   
  15.             Dim IsUnChanged As Boolean  
  16.             IsUnChanged = True  
  17.   
  18.   
  19.             For ColIdx As Integer = 0 To dt.Columns.Count - 1  
  20.                 If Not dr.Item(ColIdx, DataRowVersion.Current).Equals(dr.Item(ColIdx, DataRowVersion.Original)) Then  
  21.                     IsUnChanged = False  
  22.                     Exit For  
  23.                 End If  
  24.   
  25.             Next ColIdx  
  26.   
  27.             ' 変更されていなかった場合、UnChangedに設定する  
  28.             If IsUnChanged Then  
  29.                 dr.AcceptChanges()  
  30.             End If  
  31.         Next RowIdx  
  32.     End Sub  

よろしくどうぞー。

【VB.NET】DataGridViewのTextBoxCellで入力バイト数制限をする

今回はDataGridViewについてです。

DataGridView は通常文字数での入力制限です。
しかし、対してデータベースはバイト数の桁数となっていますので、
バイト数の入力制限がDataGridViewにも必要です。

その場合、以下のコードでバイト数制限が可能です。

  1. #Region "バイト数文字制限"  
  2.     ''' <summary>  
  3.     ''' テキスト変更時のイベントハンドラを追加  
  4.     ''' </summary>  
  5.     ''' <param name="sender">''' <param name="e">''' <remarks>EditingControlが表示された時の処理</remarks>  
  6.     Private Sub CommonDataGridView_EditingControlShowing(ByVal sender As ObjectByVal e As System.Windows.Forms.DataGridViewEditingControlShowingEventArgs) Handles Me.EditingControlShowing  
  7.         Select Case True  
  8.             Case TypeOf e.Control Is DataGridViewTextBoxEditingControl, TypeOf e.Control Is DataGridViewComboBoxEditingControl  
  9.                 'TextChangedイベントハンドラを追加  
  10.                 AddHandler EditingControl.TextChanged, AddressOf EditingControl_TextChanged  
  11.   
  12.   
  13.         End Select  
  14.     End Sub  
  15.   
  16.     Private Sub EditingControl_TextChanged(ByVal sender As ObjectByVal e As System.EventArgs)  
  17.   
  18.         Select Case True  
  19.             ' TextBox  
  20.             Case TypeOf Me.FindForm.ActiveControl Is DataGridViewTextBoxEditingControl  
  21.                 Dim EditingControl As DataGridViewTextBoxEditingControl  
  22.                 EditingControl = DirectCast(Me.FindForm.ActiveControl, DataGridViewTextBoxEditingControl)  
  23.                 Dim CurrentCell As DataGridViewTextBoxCell  
  24.                 CurrentCell = DirectCast(Me.CurrentCell, DataGridViewTextBoxCell)  
  25.                 Dim ValueByteCount As Integer  
  26.   
  27.                 ValueByteCount = System.Text.Encoding.GetEncoding("Shift_JIS").GetByteCount(EditingControl.Text)  
  28.                 If ValueByteCount > CurrentCell.MaxInputLength Then  
  29.                     EditingControl.Text = LeftB(EditingControl.Text, CurrentCell.MaxInputLength)  
  30.                     EditingControl.SelectionStart = EditingControl.TextLength  
  31.                 End If  
  32.   
  33.                 ' ComboBox  
  34.             Case TypeOf Me.FindForm.ActiveControl Is DataGridViewComboBoxEditingControl  
  35.                 ' 必要の都度、型ごとに増やしていく  
  36.         End Select  
  37.   
  38.     End Sub  
  39.   
  40.     ' 左からバイト数で文字列を取得 これは他の共通クラスで持たせてください。  
  41.     Private Function LeftB(ByVal value As StringByVal length As IntegerAs String  
  42.         Dim enc As System.Text.Encoding  
  43.         enc = System.Text.Encoding.GetEncoding("Shift_JIS")  
  44.         Dim bytes As Byte()  
  45.         bytes = enc.GetBytes(value.PadRight(length))  
  46.         Return enc.GetString(bytes, 0, length)  
  47.     End Function  
  48. #End Region  

動きとしては、DataGridViewで、編集状態に入った時に
EditingControl が生成(?)されます。
その時のイベントでEditingControlにテキストチェンジのイベントを与えます。
そこで入力制限をすれば各セルにバイト制限持たせられます。

2011年1月17日月曜日

【Android】AdMobが表示されない場合にAdMakerを表示するクラス

前に使ったクラスを晒します。

  1. package jp.dd0125.common;  
  2.   
  3. import jp.co.nobot.libYieldMaker.libYieldMaker;  
  4. import android.app.Activity;  
  5. import android.util.Log;  
  6. import android.view.ViewGroup.LayoutParams;  
  7. import android.widget.LinearLayout;  
  8. import android.widget.ProgressBar;  
  9. import android.widget.RelativeLayout;  
  10.   
  11. import com.admob.android.ads.AdListener;  
  12. import com.admob.android.ads.AdView;  
  13.   
  14. public class CommonAdMob_AdMaker {  
  15.  private static final String TAG = "CommonAdvertisement";  
  16.   
  17.  ProgressBar pb;  
  18.  AdView adView;  
  19.  libYieldMaker adMaker;  
  20.  Activity act;  
  21.  public CommonAdMob_AdMaker(Activity act){  
  22.   this.act = act;  
  23.   
  24.   pb = new ProgressBar(act);  
  25.   pb.setVisibility(ProgressBar.VISIBLE);  
  26.   
  27.   
  28.   //pb.setGravity(android.view.Gravity.RIGHT);  
  29.   pb.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));  
  30.   
  31.  }  
  32.   
  33.   
  34.   
  35.   
  36.  public void createAdMob(int align){  
  37.         adView = new AdView(act);  
  38.         adView.setVisibility(android.view.View.VISIBLE);  
  39.         adView.requestFreshAd();  
  40.   
  41.         adView.setGravity(align);  
  42.         adView.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));  
  43.   
  44.   
  45.         adView.setAdListener(new AdListener() {  
  46.   
  47.             public void onReceiveRefreshedAd(AdView adView) {  
  48.                 Log.d(TAG, "AdListener.onReceiveRefreshedAd called!");  
  49.             }  
  50.   
  51.             public void onReceiveAd(AdView adView) {  
  52.                 Log.d(TAG, "AdListener.onReceiveAd called!");  
  53.                 // 広告が表示できたのでProgressBarを消す  
  54.                 pb.setVisibility(ProgressBar.GONE);  
  55.             }  
  56.   
  57.             public void onFailedToReceiveRefreshedAd(AdView adView) {  
  58.                 Log.d(TAG, "AdListener.onFailedToReceiveRefreshedAd called!");  
  59.             }  
  60.   
  61.             public void onFailedToReceiveAd(AdView adView) {  
  62.                 Log.d(TAG, "AdListener.onFailedToReceiveAd called!");  
  63.                 // プログレスバーを消す  
  64.                 pb.setVisibility(ProgressBar.GONE);  
  65.   
  66.   
  67.                 // AdMaker の広告を設定している場合、AdMakerの広告を表示するのでAdViewの更新を行わせない  
  68.                 if(adMaker != null){  
  69.                     adView.setRequestInterval(0);  
  70.                     adView.setVisibility(AdView.GONE);  
  71.   
  72.                     // AdMakerの広告を表示させる  
  73.                     adMaker.setVisibility(libYieldMaker.VISIBLE);  
  74.                     adMaker.startView();  
  75.   
  76.                 }  
  77.             }  
  78.         });  
  79.  }  
  80.   
  81.  public void createAdMaker(String url){  
  82.   adMaker = new libYieldMaker(act);  
  83.         adMaker.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.WRAP_CONTENT));  
  84.   
  85.         adMaker.setActivity(act);  
  86.         adMaker.setUrl(url);  
  87.   
  88.  }  
  89.  public RelativeLayout getAdMob_AdMaker(){  
  90.   RelativeLayout layout = new RelativeLayout(act);  
  91.   layout.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.WRAP_CONTENT));  
  92.   
  93.   layout.setGravity(android.view.Gravity.CENTER);  
  94.   layout.addView(pb);  
  95.   if(adView != null){  
  96.    layout.addView(adView);  
  97.   }  
  98.   if(adMaker != null){  
  99.    layout.addView(adMaker);  
  100.    if(adView == null) {  
  101.     pb.setVisibility(ProgressBar.GONE);  
  102.     adMaker.setVisibility(libYieldMaker.VISIBLE);  
  103.     adMaker.startView();  
  104.    }  
  105.   }  
  106.   return layout;  
  107.  }  
  108. }  

このように使います。

  1. // 広告  
  2.  //AdManager.setTestDevices( new String[] {  
  3.  //  AdManager.TEST_EMULATOR,  
  4.  //  //"XXXXXXXXXXXXXXXXXXXX",  
  5.  //  });  
  6.  LinearLayout l_ad = (LinearLayout)findViewById(レイアウトID);  
  7.  CommonAdMob_AdMaker Ad;  
  8.  Ad = new CommonAdMob_AdMaker(this);  
  9.  Ad.createAdMob(RelativeLayout.ALIGN_TOP); // AdMobを生成  
  10.  Ad.createAdMaker("http://stg-images.ad-maker.info/sample-test.html"); // AdMakerを生成  
  11.   
  12.  l_ad.addView(Ad.getAdMob_AdMaker()); // 広告を持ったレイアウトが返ってきますので addViewします  

ただし、
・res/values/attr.xml
・AdMob と AdMaker の jarライブラリ組み込み
は必要です。

【Android】HandMemo 0.5 をアップデートしました。

HandMemo 0.5

機能としては、中断時に自動保存機能を追加しました。
これで気軽にメモを中断し、その後、またメモの続きを行うことができます。

HandMemo : かんたん手書きメモ!Androidアプリ1215
http://octoba.net/archives/20101129-handmemo-android-1215.html

【Windows】IEの右クリックに自作アプリケーションの起動の登録

レジストリの
HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\MenuExt
に新しいキーを登録する。

キー名に右クリックに表示される名称になります。
規定の値に実行するhtmlファイル。

ContextsというDWORD値により、リンクで開くかページ内で開くか画像で開くかを設定できます。


実行するものは直接アプリケーションでは動かないようです。
htmlにスクリプトを記述し、その中でexeファイルなどを起動します。







【スクリプト】
  1. <script type="text/javascript">  
  2. var parentwin = external.menuArguments;  
  3. var parentwinPoint = external.menuArguments.document.elementFromPoint(parentwin.event.clientX, parentwin.event.clientY);  
  4.   
  5. var strTitle = new String();  
  6. var strURL = new String();  
  7. strTitle = parentwin.document.title;  
  8. strURL = parentwin.location.href;  
  9. //alert(strTitle);  
  10. alert("現URL:" + strURL);  
  11.   
  12. // リンク先  
  13. //alert("先URL:" + parentwinPoint.parentElement.href     );  
  14. //alert("先URL:" + parentwinPoint.href     );  
  15.   
  16. // もし現在の選択タグがAの場合は、現在タグのリンク先  
  17. if(parentwin.event.srcElement.tagName == "A"){  
  18.  alert("先URL:" + parentwin.event.srcElement.href     );  
  19. // それ以外の場合は、そのひとつ上のタグのリンク先  
  20. }else{  
  21.  alert("先URL:" + parentwin.event.srcElement.parentElement.href     );  
  22. }  
  23.   
  24.    
  25.   
  26.   
  27. // ファイル実行  
  28. //var WshShell = new ActiveXObject("WScript.Shell");  
  29. //WshShell.run("C:\\osero.exe");  
  30.   
  31. // ナビゲート  
  32. //parentwin.location.href ="http://yahoo.co.jp"  
  33.   
  34. // InnerHTML  
  35. //alert(parentwin.event.srcElement.document.body.innerHTML      );  
  36.   
  37. // tagName  
  38. //alert(parentwin.event.srcElement.tagName      );  
  39.   
  40. // 選択文字  
  41. //alert(external.menuArguments.document.selection.createRange().text);  
  42.   
  43.   
  44. </script>  
・ファイル実行
・ページ遷移
・InnerHTML取得
・右クリックしたリンク先の取得
・選択文字取得
・タグ名取得

などできるようです。

何かに応用利くかどうか考え中。

【VB.NET】ExitException

今回はエラー処理のお話です。


  1. Public Function A()  
  2.         Try  
  3.             If Not AA() Then  
  4.                 Return False  
  5.             End If  
  6.   
  7.             ' なんらかの処理  
  8.   
  9.         Catch ex As Exception  
  10.             MessageBox.Show("A にてエラーが発生しました。""エラー発生", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)  
  11.             Return False  
  12.         End Try  
  13.   
  14.         Return True  
  15.     End Function  
  16.   
  17.     Public Function AA() As Boolean  
  18.         Try  
  19.             If Not AAA() Then  
  20.                 Return False  
  21.             End If  
  22.   
  23.             ' なんらかの処理  
  24.   
  25.         Catch ex As Exception  
  26.             MessageBox.Show("AA にてエラーが発生しました。""エラー発生", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)  
  27.             Return False  
  28.         End Try  
  29.   
  30.         Return True  
  31.     End Function  
  32.   
  33.     Public Function AAA() As Boolean  
  34.         Try  
  35.   
  36.             ' なんらかの処理  
  37.   
  38.         Catch ex As Exception  
  39.             MessageBox.Show("AAA にてエラーが発生しました。""エラー発生", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)  
  40.             Return False  
  41.         End Try  
  42.   
  43.         Return True  
  44.     End Function  
つまりこんな感じの処理です。
  1. A関数処理  
  2.  AA関数処理  
  3.   AAA関数処理  
  4.  AA関数処理  
  5. A関数処理  
AAA関数でエラーが発生した場合、AAの後の処理は行ってはいけないわけです。 行わないように
  1. If Not AAA() Then  
  2.                 Return False  
  3.             End If  
と記述し、エラーの場合は即座に親関数に戻しています。

私はこの記述が面倒くさいと考えました。

面倒な理由は

・ If Not ~ という記述を毎回行わないといけない。
・ エラーメッセージの記述が面倒。メンテナンスも面倒。


そこで考案した方法は、
  1. Public Class ExitException  
  2.         Inherits Exception  
  3.         Public Sub New(Optional ByVal ErrMsg As String = "エラーが発生しました。")  
  4.             MyBase.New(ErrMsg)  
  5.         End Sub  
  6.         Public Sub New(ByVal ErrMsg As StringByVal ex As Exception)  
  7.             MyBase.New(ErrMsg, ex)  
  8.         End Sub  
  9.     End Class  
  10.   
  11.     Public Function A()  
  12.         Try  
  13.             Call AA()  
  14.   
  15.             ' なんらかの処理  
  16.   
  17.         Catch ex As Exception  
  18.             ErrMsg(ex, "A にてエラーが発生しました。")  
  19.             Throw New ExitException  
  20.         End Try  
  21.   
  22.         Return True  
  23.     End Function  
  24.   
  25.     Public Function AA() As Boolean  
  26.         Try  
  27.             Call AAA()  
  28.   
  29.             ' なんらかの処理  
  30.   
  31.         Catch ex As Exception  
  32.             ErrMsg(ex, "AA にてエラーが発生しました。")  
  33.             Throw New ExitException  
  34.         End Try  
  35.   
  36.         Return True  
  37.     End Function  
  38.   
  39.     Public Function AAA() As Boolean  
  40.         Try  
  41.   
  42.             ' なんらかの処理  
  43.   
  44.         Catch ex As Exception  
  45.             ErrMsg(ex, "AAA にてエラーが発生しました。")  
  46.             Throw New ExitException  
  47.         End Try  
  48.   
  49.         Return True  
  50.     End Function  
  51.   
  52.     Public Sub ErrMsg(ByVal ex As Exception, Optional ByVal Message As String = "")  
  53.         If TypeOf ex Is ExitException Then  
  54.             Exit Sub  
  55.         Else  
  56.             If Message = "" Then  
  57.                 ' メッセージを指定していない場合  
  58.                 Message = "不正なエラーが発生しました。"  
  59.   
  60.                 ' 実行関数名取得してメッセージに含める。これに関してはまた改めて・・  
  61.             End If  
  62.   
  63.             MessageBox.Show(Message, "エラー発生", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)  
  64.   
  65.         End If  
  66.   
  67.     End Sub  
です。 まず、 if Not ~ の記述がなくなっています。

そして共通エラークラスとして ExitException というのが増えており、 ErrMsgという共通関数が増えています。

ExitException ・・・ 発生した場合、エラーメッセージを表示しないエラー。素通りのエラー。
ErrMsg     ・・・ エラーメッセージを表示する関数。ログ書き込みとかもここで実装していいかもしれません。
クラス化してログ書き込みパラメータとかにするともっといいかもしれませんね。

Throw New ExitException を実行するとエラーメッセージを出さずに親の関数にエラーを通知できると考えれば良いと思います。

また、ErrMsgなどで呼び出し元の実行関数名を取得することもできるので、エラーメッセージやログに活用することもできます。


とりあえず少し走り書きで書きましたが、ここまで。