「VB.net」の編集履歴(バックアップ)一覧はこちら
VB.net - (2008/06/16 (月) 18:02:47) の1つ前との変更点
追加された行は緑色になります。
削除された行は赤色になります。
PageLastUpdate:&date()/today:&counter(today)/yesterday:&counter(yesterday)
#openclose(show=クリックすると見出し一覧を表示します){
#contents()
}
オブジェクト指向から勉強中。ヘタレた内容だけど笑わないでね。
*&aname(自作クラスとか){自作クラスとか}
|[[DataGridViewEx]]|2007/11/19|拡張DataGridView。列位置や幅のユーザー別の保存とか|
|[[DataGridViewSynchronizer]]|2007/11/13|上下に並べたふたつのDataGridViewの列表示を同期させるクラス。|
|[[WorkStationLockController]]|2007/07/16|PCのロックをしたりロック状態を取得するクラス|
|[[DebugTimer]]|2007/07/23|デバッグ時に処理ごとのパフォーマンスを計測するクラス|
*&aname(ESCキーで行の変更をキャンセルするDataGridView){ESCキーで行の変更をキャンセルするDataGridView}
2008/06/16 検索語:キーボード ショートカット エスケープ DataTable
DataGridViewはESCキーで編集のキャンセルができないので、とりあえず作ってみた。
Bindしている行がDataRowViewにDirectCastできるのが前提条件です。
#highlight(vb.net){
Public Class DataGridViewEx
Inherits DataGridView
Private _rejectbyescape As RejectEscapeType = RejectEscapeType.None
Public Enum RejectEscapeType As Integer
None = 0
CurrentRow = 1
SelectedRows = 2
End Enum
Public Property RejectByEscape() As RejectEscapeType
Get
Return _rejectbyescape
End Get
Set(ByVal value As RejectEscapeType)
_rejectbyescape = value
End Set
End Property
Private Sub DataGridViewEx_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
Try
If e.KeyCode = Keys.Escape Then
'編集モードではなくReadOnlyでもなければRejectChangesを実行
'(グリッドがReadOnlyのときはCurrentRowも自動的にReadOnlyになるのでCurrentRowだけで判定してOK)
If (IsCurrentCellInEditMode = False) And (CurrentRow.ReadOnly = False) Then
Select Case _rejectbyescape
Case RejectEscapeType.CurrentRow
DirectCast(Me.CurrentRow.DataBoundItem, DataRowView).Row.RejectChanges()
Case RejectEscapeType.SelectedRows
For Each dgvr As DataGridViewRow In SelectedRows
DirectCast(dgvr.DataBoundItem, DataRowView).Row.RejectChanges()
Next
End Select
End If
End If
Catch ex As Exception
MessageBox.Show(ex.ToString & ex.Message)
End Try
End Sub
End Class
}
*&aname(Microsoft Visual Studio International Pack 1.0){Microsoft Visual Studio International Pack 1.0}
2008/04/11 http://www.microsoft.com/downloads/details.aspx?FamilyID=f9cfc884-1f00-45fa-b2fb-303d9e110bc7&DisplayLang=ja
|East Asia Numeric Formatting Library|数値データを日本語、繁体字中国語、簡体字中国語および韓国語における漢数字の文字列に変換します。|
|Japanese Kana Conversion Library|ひらがな、カタカナ、半角カタカナの相互変換、およびローマ字の変換をします。|
|Japanese Text Alignment Library|日本語固有の均等割付を用いて文字列を描画します。|
|Japanese Yomi Auto-Completion Library|日本語IME における読みの入力に対応したオートコンプリート機能を提供するライブラリとサンプルのTextBox コントロールを提供します。|
*&aname(My.Settingsの構成ファイルの場所を取得する。){My.Settingsの構成ファイルの場所を取得する。}
2008/03/25 検索語:exe.config、user.config、ApplicationSettingBase
アプリケーション構成ファイル
#highlight(vb.net){System.AppDomain.CurrentDomain.SetupInformation.ConfigurationFile}
ユーザー構成ファイル
#highlight(vb.net){ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal).FilePath}
ネタ元:http://www.atmarkit.co.jp/fdotnet/dotnettips/558appsettings/appsettings.html
ちなみに同一記事にもかかれているが、2005ではローミングユーザーであってもローカルユーザーのユーザー構成ファイルが使われてしまうようだ。せっかくローミングにも対応するように設計したつもりだったけど意味無い・・・。
別課題:過去の設定ファイル消せないと気持ち悪い。
*&aname(Partial Classをメインのクラスのツリー下に配置する){Partial Classをメインのクラスのツリー下に配置する}
2008/03/24
projファイルの中から目的の分割クラスの記述を見つけ、DependentUpon行を追加すればOK。
#highlight(vb.net){<Compile Include="MainForm.Menu.vb">
<DependentUpon>MainForm.vb</DependentUpon> '←この行を追加
<SubType>Form</SubType>
</Compile>}
SubTypeは消してもVisual Stdio上で一回開いて保存すると元に戻る。
*&aname(C#→VB.netへのコード変換サービス){C#→VB.netへのコード変換サービス}
2008/03/24 http://codeconverter.sharpdevelop.net/Convert.aspx
使ってみた中ではコレが一番だった。
*&aname(Visual Studio 2005 SP1 統合 installer の作成方法){Visual Studio 2005 SP1 統合 installer の作成方法}
2008/01/30
http://blogs.wankuma.com/tyappi/archive/2008/01/05/116016.aspx
*&aname(再帰的にコントロールの親をたどって、ピリオド区切りでパスを返す関数){再帰的にコントロールの親をたどって、ピリオド区切りでパスを返す関数}
2008/01/21
例えばForm1のPanel1に乗っているTextbox1なら Form1.Panel1.TextBox1 と帰ってきます。
#highlight(vb.net){
Public Function ControlPath(ByVal ctl As Control) As String
Try
If ctl.Parent Is Nothing Then
Return ctl.Name
Else
Return ControlPath(ctl.Parent) & "." & ctl.Name
End If
Catch ex As Exception
MessageBox.Show(ex.ToString)
Return ""
End Try
End Function}
*&aname(VBScriptのエラーコードメモ){VBScriptのエラーコードメモ}
2007/12/25 Descriptionが定義されていないものがある。一覧が見つけられない・・・。誰か教えて。
|エラーコード|内容|h
|-2147024843|たぶんネットワークパスが見つからないとき。|
*&aname(Visual Studio 2008 Express Edition){Visual Studio 2008 Express Edition}
2007/12/18
ついにきました。まあいきなりインストールするわけにもいかないから、遊ぶのは正月休みですね。不具合情報の様子見でw
なんと窓の杜から落とせるよ。
http://www.forest.impress.co.jp/lib/stdy/program/progdevenv/vbexedition.html
……と思ったら違いました。ダウンロード先は「作者サイト」になってるのね。
*&aname(チェックボックスでスプリットコンテナのパネルの表示をOn/Offする){チェックボックスでスプリットコンテナのパネルの表示をOn/Offする}
2007/12/06
検索語:CheckBoxでSplitContainerのPanelをOn/Off、反転、True、False
SplitContainerのパネルを片側消したかったけど、Visibleでスプリッタが動いてくれないので「なんで?」と探したらPanel1Collapsed/Panel2Collapsedというわかりにくいプロパティでした。ヘルプには「縮小または展開するかどうかを決定する値を取得または設定します。」と書いてある。表現がわかりにくいっちゅうの。
で、チェックボックスをOnにしたときに表示、Offにしたときに非表示にしたいんだけど、CheckedとCollapsedの単純バインディングだと逆になってしまうので、Bindingオブジェクトの拡張クラスをつくってみた。
#highlight(vb.net){Private Class BindingReverseBoolean
Inherits Binding
Public Sub New(ByVal propertyName As String, ByVal dataSource As Object, ByVal dataMember As String)
MyBase.New(propertyName, dataSource, dataMember, False, Windows.Forms.DataSourceUpdateMode.OnPropertyChanged)
End Sub
Private Sub BindingReverseBoolean_Format(ByVal sender As Object, ByVal e As System.Windows.Forms.ConvertEventArgs) Handles Me.Format
e.Value = Not e.Value
End Sub
Private Sub BindingReverseBoolean_Parse(ByVal sender As Object, ByVal e As System.Windows.Forms.ConvertEventArgs) Handles Me.Parse
e.Value = Not e.Value
End Sub
End Class}
で、FormのLoadでこんな感じに使います。
#highlight(vb.net){myCheckBox.DataBindings.Add(New BindingReverseBoolean("Checked", mySplitContainer, "Panel2Collapsed"))}
どうもバインディングオブジェクトは
[Checked]⇒True=Format=False⇒[Collapsed]⇒False=Parse=True⇒[Checked]
こういう感じに動くようだ。2回値がセットされる感じ。
今回は自分で使うだけで、絶対にBoolean以外がこないのはわかっているのでエラー処理はなし。
余裕があれば汎用的なクラスにしたいので、プロパティの型チェックとかいれる予定。
*&aname(配列をリストに変換する){配列をリストに変換する}
2007/11/18
リストを配列に変換するのはToArrayで簡単。配列をリストに変換する方法がわからない・・・3時間ぐらい調べてやっと見つけた。
http://d.hatena.ne.jp/Seasons/searchdiary?word=*%5BC%23%5D
わかってみれば簡単でリストのコンストラクタに渡せばよいだけでした・・・
Dim myArray As String() = {"A","B","C"}
Dim myList As List(Of String) = New List(Of String)(myArray)
固定値の入ったリストを作るときもこのほうがラク。
つか、ちょっとデキる人は絶対わかってるよな。「リストを配列に変換する」で検索してどうにもひっかからないっていうのは何故。
*&aname(型比較でハマる){型比較でハマる}
2007/11/18
オブジェクトのプロパティを列挙する処理を書いていたら、PropertyTypeの型のチェックで
エラー 5 型 'System.Type' の式を型 'String' にすることはできません。
のエラーが出て、いろいろ書き換えてみてもどうにも通らない。
原因は「型の比較はTypeOfだ」という思い込みでした。
#highlight(vb.net){For Each pi As PropertyInfo In target.GetType.GetProperties
Select Case True
Case TypeOf pi.PropertyType Is String '←ここがダメ
...
Case Else
...
End Select
Next}
↓
#highlight(vb.net){For Each pi As PropertyInfo In target.GetType.GetProperties
Select Case True
Case pi.PropertyType Is GetType(System.Byte) '←これでOK
...
Case Else
...
End Select
Next}
TypeOfはオブジェクトと型を比較するのね。型どうしの直接比較ならIsだけでよい。
気づかなかったのが恥ずかしい・・・。
*&aname(NewGUIDを文字列にするときの引数){NewGUIDを文字列にするときの引数}
2007/11/10
よくわからなくなるのでメモ。xは16進数なので[0-9A-F]。
|GUID.NewGUID.ToString("N")|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|32桁|
|GUID.NewGUID.ToString("D")|xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx|ハイフンで区切られた 32 桁|
|GUID.NewGUID.ToString("B")|{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}|中かっこで囲まれ、ハイフンで区切られた 32 桁|
|GUID.NewGUID.ToString("P")|(xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)|丸かっこで囲まれ、ハイフンで区切られた 32 桁|
*&aname(My.Settingsに連結したコントロール間でChangedイベントで値をやり取りすると値が書き戻されることがある){My.Settingsに連結したコントロール間でChangedイベントで値をやり取りすると値が書き戻されることがある}
2007/11/08
実際に起こったのはチェックボックスのChackedChangedでテキストボックスに値を書き込んだら、チェックボックスの値が再度My.Settingから読み出されて変更する前に戻ってしまう。
検索したらMy.Settingsの挙動不審がいくつか見つかるので、バインドしたコントロール間でやり取りはしないほうが無難。
2007/11/15 Microsoftにも正式文書がありました。
http://msdn2.microsoft.com/ja-jp/library/a65txexh(VS.80).aspx
現在、Windows フォームの一部のプロパティはバインドできません。わかりやすい例は ClientSize プロパティです。
このプロパティにバインディングすると、実行時に予期できない動作が発生します。
通常、設定をプログラムで保存して読み込むことでこの問題を解決できます。
*&aname(DataSet中の複数のテーブルをAccessのように連結して扱う){DataSet中の複数のテーブルをAccessのように連結して扱う}
2007/10/26
アクセスがクエリを元にフォームをつくれるので、同じことがVB.netでもできないかなと探していたら、DataTable間にリレーションを設定し、DataColumnのExpressionを設定することで実現できました。
#highlight(vb.net){
Private relationTest As System.Data.DataRelation
Me.relationTest = New System.Data.DataRelation( _
"relationTest",
New System.Data.DataColumn() {Me.tableA.ShohinCDColumn}, _
New System.Data.DataColumn() {Me.tableB.ShohinCDColumn}, _
false)
Me.Relations.Add(Me.relationTest)
Me.tableA.ShohinNameColumn.Expression = "Parent(rerarionTest).ShohinName"
}
DataGridViewの列で処理することばかり考えていて、DataTableそのものに列を追加するというのは、ちょっと思いつかなかったな。
いままでコードに対応する名称をDataGridView上で表示するのにわざわざコンボボックスを使っていたので、これでとてもラクになりました。
DataTableはアクセスのクエリの役目も果たしてくれるのですね。
ちなみにここにはコードで載せていますが、これはDataSetのDesiner.vbから拾ってきたもので、実際にはデザイナオンリー、ノンコーディングで実現できています。
*&aname(継承コントロールをデザイナで削除すると「インデックスが範囲を超えています」のエラー){継承コントロールをデザイナで削除すると「インデックスが範囲を超えています」のエラー}
2007/10/10
検索語:コンストラクタ
Newの中でAddHandlerしたテキストボックスの継承コントロールで、デザイナで削除するときに
インデックスが範囲を超えています。負でない値で、コレクションのサイズよりも小さくなければなりません。
パラメータ名: index
のエラーメッセージが出るようになってしまった。いろいろ調査した結果、原因はAddHandlerだと判明。
#highlight(vb.net){AddHandler DataBindings.CollectionChanged, AddressOf DataBindings_CollectionChanged}
最終的にはDisposeの中でRemoveHandlerを書くことで解決。
#highlight(vb.net){RemoveHandler DataBindings.CollectionChanged, AddressOf DataBindings_CollectionChanged}
似たようなことをやっている他の継承コントロールでは起きないので、解放するリソースの種類や内部処理に依存しそう。
まあ「Disposeするときにきちんとすべてのリソースを解放しましょう」というのは当たり前のことだから、いままでAddHandlerの後始末をやっていなかったのがダメなんでしょう。たぶん。
「AddHandlerしたら必ずRemoveHandlerしましょう」とか、教えてくれる人もいなかったし、どこかに書いてあるのかなぁ。
*&aname(継承したテキストボックスをフォームから削除しようとすると、エラーが出て削除されない。){継承したテキストボックスをフォームから削除しようとすると、エラーが出て削除されない。}
2007/08/27
インデックスが範囲を超えています。負でない値で、コレクションのサイズよりも小さくなければなりません。
プロジェクトを開きなおすときちんと消えている。
継承したコントロールの中でやっている処理の問題だった。詳細な内容は後でかこう。
*&aname(ComboBoxに連結したDataTableが意図せずに変更される){ComboBoxに連結したDataTableが意図せずに変更される}
2007/10/04 検索語:コンボボックス/DataTable/DataView/DataSource/Bind/データが変わる
DataTableにコンボボックスを連結したときに、既存データにコンボボックスに存在しない値が入っていると、レコードのCurrent時にコンボボックスの先頭の値に書き換えられてしまう。
FormattingEnabled をTrueにすることで解消できる。FormatString を設定する必要はない。
*&aname(Express Edition ではセットアップ用のmsiはつくれない){Express Edition ではセットアップ用のmsiはつくれない}
2007/08/07 確実な情報が見つからないけど、つくれないっぽい。
↓こういうの見つけた。んー、個人でここまで踏み込むかどうするか。会社でやる分にはVS.net使えるからなぁ。
[[WiXではじめるWindows Installer作成入門>http://codezine.jp/a/article/aid/428.aspx]]
*&aname(ComboBoxにはDoubleClickイベントがないのね){ComboBoxにはDoubleClickイベントがないのね}
2007/08/24 コンボボックスでDoubleClickイベントを使おうかと思ったらありませんでした。
*&aname(CSVの読み込み){CSVの読み込み}
日本語の露出が少ないけどXmlCsvReaderというのがよさそう。テストしてみよう。
*&aname(相手先別に添付ファイルを変更するメール送信ソフトを作ってみよう){相手先別に添付ファイルを変更するメール送信ソフトを作ってみよう}
2007/07/26
VB.netでメール送信するのは簡単そう。相手のアドレスと添付ファイルのリストから、メール送信するソフトを作ってみよう。
&strike(){http://www.atmarkit.co.jp/fdotnet/dotnettips/017sendmail/sendmail.html}
↑このアドレスは2003で、2005からはクラスが変わっていました。
http://www.microsoft.com/japan/msdn/vbasic/migration/tips/netmail/
2007/07/28 うーん、SmtpClient はいろいろ問題がありそうな。POP before SMTPとかも自作しなきゃいかんし。
http://support.microsoft.com/default.aspx/KB/927858
2007/07/28 商用利用も含めてフリーライセンスのよさそうなライブラリを発見。
[[.NET用メール送受信クラスライブラリ (TKMP.DLL)>http://uwa.potetihouse.com/library/tkmpdll.html]]
ライセンスについて http://uwa.potetihouse.com/bbs/patio.cgi?mode=view&no=139
自分で組めるようにもなりたいけど、とりあえず利用させていただいて、少しづつ力をつけよう。
*&aname(コンボボックスに高速にデータをBindする){コンボボックスに高速にデータをBindする}
2007/07/24
DataSourceよりもValueMemberとDisplayMemeberを先に指定したほうが速いようです。
設定するたびにリクエリがかかる感じですね。
特に件数の多いテーブルをBindするときに効果的です。
**DataSourceを先に設定した場合
#highlight(vb.net){
DebugTimer.WriteLine("Testスタート")
cboSample.DataSource = New DataView(dt) '←先に設定
DebugTimer.WriteLine("DataSourceをセット")
cboSample.ValueMember = "連結したい列名"
DebugTimer.WriteLine("ValueMemberをセット")
cboSample.DisplayMember = "表示したい列名"
DebugTimer.WriteLine("DisplayMemberをセット")
}
|MEMO|00:00:000|00:00:000|Testスタート|
|MEMO|00:00:272|00:00:272|DataSourceをセット|
|MEMO|00:00:540|00:00:268|ValueMemberをセット|
|MEMO|00:00:808|00:00:268|DisplayMemberをセット|
**DataSourceを後に設定した場合
#highlight(vb.net){
DebugTimer.WriteLine("Testスタート")
cboSample.ValueMember = "連結したい列名"
DebugTimer.WriteLine("ValueMemberをセット")
cboSample.DisplayMember = "表示したい列名"
DebugTimer.WriteLine("DisplayMemberをセット")
cboSample.DataSource = New DataView(dt) '←後に設定
DebugTimer.WriteLine("DataSourceをセット")
}
|MEMO|00:00:000|00:00:000|Testスタート|
|MEMO|00:00:000|00:00:000|ValueMemberをセット|
|MEMO|00:00:000|00:00:000|DisplayMemberをセット|
|MEMO|00:00:296|00:00:296|DataSourceをセット|
*&aname(Microsoft Win32 と Microsoft .NET Framework API との対応){Microsoft Win32 と Microsoft .NET Framework API との対応}
2007/07/16 http://www.microsoft.com/japan/msdn/net/general/win32map.aspx
*&aname(2005でデザイナから自動生成されるDataTableでのDBNull){2005でデザイナから自動生成されるDataTableでのDBNull}
2007/07/16
XというフィールドにDBNullが来るよねと思ってIsDBNull(X)で判定しようとしたら蹴られた。
なんで?と思ってクラスを見たら、テーブルのメソッドにIsXNullっていうのが作られてた。
なるほど。Nullの可能性のあるフィールドはこれで判断しろと。
*&aname(タイマーとメッセージボックス){タイマーとメッセージボックス}
2007/07/16
メッセージボックスが出ているあいだもタイマーは動き続けているので、処理によっては固まる。注意。
*&aname(ワークステーションのロック){ワークステーションのロック}
2007/07/16 カンタンだった。
System.Diagnostics.Process.Start("rundll32.exe", "user32.dll,LockWorkStation")
2007/07/16 ロックかけるのは簡単だけど、ロックされているかどうかの判断が難しい。つか標準ではできない。
http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200612/06120018.txt
Microsoft.Win32.SystemEventsのSessionSwitchを使うことで、
ロック開始のイベントとロック終了のイベントを受け取ることができます。
との情報を発見したので、ロック状態を管理しつつ、ロックをかけてくれるクラスを作成。 → [[WorkStationLockController]]
念のためsingletonをとっておく。singletonについては → http://hccweb1.bai.ne.jp/tsune-1/VisualBasic/singleton.html
ちなみにsingletonをグローバル変数的に使うのはよくないというのは心しておく。
ワークステーションのロックについて調べていたら突き当たったサイト → http://www7a.biglobe.ne.jp/~lshen/EternalWindows/
GINAとか珍しいあたりをわかりやすく書いてくれてる。
フォアグラウンドウインドウを判定するのってAPI使うしかないのかなぁ。 → http://iseebi.half-done.net/?TechDoc%2FDetectionFullscreen
*&aname(LDAPとActive Directoryの要素の比較){LDAPとActive Directoryの要素の比較}
2007/07/13
参考:http://publib.boulder.ibm.com/tividd/td/ITAME/SC32-1358-00/ja_JA/HTML/am51_webseal_devref101.htm
|最大長|LDAP|Active Directory|
|名 (LDAP CN)|256|64|
|ミドル・ネーム|128|64|
|姓|128|64|
|レジストリー UID (LDAP DN)|1024|2048|
|ユーザー・パスワード|制限無し|256|
|ユーザー記述|1024|1024|
|グループ名|256||
|グループ記述|1024|1024|
|シングル・サインオン・リソース名|240|256|
|シングル・サインオン・リソース記述|1024|1024|
|シングル・サインオン・ユーザー ID|240|256|
|シングル・サインオン・パスワード|制限無し|256|
|シングル・サインオン・グループ名|240|256|
|シングル・サインオン・グループ記述|1024|1024|
|アクション名|1|1|
|アクション記述、アクション・タイプ|制限無し|制限無し|
|オブジェクト名、オブジェクト・スペース名、ACL 名、POP 名|制限無し|制限無し|
|オブジェクト記述、オブジェクト・スペース記述、ACL 記述、POP 記述|制限無し|制限無し|
*&aname(DirectorySearcher手ごわい){DirectorySearcher手ごわい}
2007/07/13
http://www.microsoft.com/japan/msdn/community/gdn/ShowPost-33574.htm
グループとユーザーの階層をノード的に取得しようとしたけど、手ごわい。
なんだよMemberofプロパティとかPrimaryGroupが取れないとか。
Microsoftのヘルプじゃまったくダメで、LDAPの仕様とか理解しないといけないところがツラい・・・
*&aname(System.DirectoryServices.DirectoryEntry.SchemaClassNameの一覧){System.DirectoryServices.DirectoryEntry.SchemaClassNameの一覧}
2007/07/12
※とりあえず私が使ったものをメモっていきます。
|ユーザー|User|
|グループ|Group|
|コンピュータ|Computer|
|サービス|Service|
検索をかけても一覧が見つからない・・・誰か教えて。
*&aname(SelectCommandでデータ書き込むストアド指定するとコミットされない・・・んー){SelectCommandでデータ書き込むストアド指定するとコミットされない・・・んー}
2007/07/10
DataAdapterのSelectCommandにデータの更新ありのストアドを投げると、戻ってきた結果は正しいのにデータベースには反映されてないみたい。
んー、いちいちコミットいれなきゃダメ?
→mdfファイルが毎回コピーされてしまうためでした。
http://www.atmarkit.co.jp/fdotnet/dotnettips/532dbfilecopy/dbfilecopy.html
*&aname(2005のヘルプにCrystal Reportのヘルプを追加とか){2005のヘルプにCrystal Reportのヘルプを追加とか}
2007/07/09
http://salv.miscnotes.com/2005/01/tips5_vsnethelphelp.php
*&aname(TreeView使ってみた){TreeView使ってみた}
2007/07/04
便利。同じTreeNodeオブジェクトを別のツリーに追加することはできなかった。
*&aname(アップキャストとダウンキャスト){アップキャストとダウンキャスト}
2007/06/14
|アップキャスト|派生クラス→基本クラス|常にOK|
|ダウンキャスト|基本クラス→派生クラス|やらないほうがよい。できないこともある。|
ダウンキャストについてはちょっと勉強したほうがよさそうだ。
*&aname(IIFとdecimalでハマる){IIFとdecimalでハマる}
2007/06/12
DataTable.ColumnのExpressionを使用していて、floatだったフィールドをdecimalに変更したら何故か0除算のエラー。
IIF([分母]=0,0,[分子]/[分母])
とやって0除算をしてないはずなのに・・・・・・と半日ハマる。結論は
IIFは真も偽も計算してから値を返すから
IIFは普段は危険だから使わないんだけど、floatのときにエラーにならなかったので見落としました。
floatは0除算でエラーを返さないのね。
でもExpressionの中ってIIFしか条件式が使えない。やむをえず
[分子]/CAST([分母],'System.Double')
として回避。
*&aname(GrapeCity FlexGrid for .NET 2.0J){GrapeCity FlexGrid for .NET 2.0J}
ダメだこれ。もうイヤ。
何がダメって、ColumnオブジェクトのNameプロパティが連結先のDataTableの列名。
で、複数のColumnに同じNameが設定できる。だからIndex以外で列を特定する術がない。
なのに、列位置を移動するとIndexが変わる。
頼むからNameは固有値にしてMappingName を指定させてくれ。
誰だこんなコントロール使うことにしたのは。二度と使わない。
いや、最新は4.0Jだから、よくなってるのかもしれないけれど。
*&aname(VB.Netに関する資料){VB.Netに関する資料}
2007/04/22 オブジェクト倶楽部 http://www.objectclub.jp/
ここのトレーニングテキストが死ぬほど役立つ。入門用とリファレンスのちょうど中間あたりの本になりにくいあたりが解説されている。
2007/05/13 ちょっと見ようと思ったら見つけられない。C#のページにありました。
http://www.objectclub.jp/technicaldoc/c/training.pdf
2007/04/29 .NETでの正規表現の使用法 http://japan.internet.com/column/developer/20050822/28.html
2007/05/01 コンテキストメニューまわり http://vbdotnet.fc2web.com/vbnet/control/ContextMenuMenu.htm
*&aname(ArrayListとList){ArrayListとList}
2007/04/22
自作クラスのコレクションを作れるに違いないと思って、ArrayListを調べて2時間。
どうしても型指定したコレクションがつくれないよー(。´Д⊂)
と、泣きそうになったところでListに気がつく。
あまりにも最初にArrayListに慣れ親しんだために、それ以外思い浮かばなかった失敗。
2007/05/24
Listって.net 2005(Framework 2.0)からなので。自宅は2005、会社は2003なので、会社で使おうとして使えなくてがっかり。
*&aname(プロパティにオブジェクトを設定したときにNewのタイミング){プロパティにオブジェクトを設定したときにNewのタイミング}
2007/04/22
プロパティ用のローカル変数に
Private _objectname As Objecttype
と宣言していてハマる。
Private _objectname As New Objecttype
きちんとインスタンス意識しないとね。
*&aname(自分自身と同じ型のコレクションをプロパティに持つ){自分自身と同じ型のコレクションをプロパティに持つ}
Private _childnodes As New List(Of LogNode)
Public Property ChildNodes() As List(Of LogNode)
Get
Return _childnodes
End Get
Set(ByVal value As List(Of LogNode))
_childnodes = value
End Set
End Property
----
2007/04/22 とりあえず2日間ざっくり勉強して2日間ざくざく組んだら、少し勘が働いてきた。
言語って、あるレベルまでいかないと、目の前が開けないよね。一回開けてくると調査スピードも速くなる。
*&aname(DateTimeメモ){DateTimeメモ}
2007/04/27
DateTimeの中身は#1/1/0 00:00:00#(西暦0年1月1日)からの経過ミリ秒
javascriptと値がずれるなと思ったら、javascriptは#1970/01/01 00:00:00#からの経過ミリ秒でした。
で、それでも誤差が32400ミリ秒出るので何かと思ったら、32400/60/60=9、ということで標準時との差。
*&aname(再帰型のクラスでちょっとはまったこと){再帰型のクラスでちょっとはまったこと}
クラスを通過するたびにカウントアップするような引数は参照渡しすること。
*&aname(ライブラリメモ){ライブラリメモ}
|ファイルパスの分解|System.Io.Path|ディレクトリ名はディレクトリを指定すればFileNameで取得できる|
||.GetExtension|戻り値はピリオド付き|
|ファイルの検索|System.Io.Directory|戻り値はString()|
|ファイル情報|My.Computer.FileSystem.GetFileInfo||
||.Length|ファイルサイズの単位はバイト|
|正規表現|System.Text.RegularExpressions|Regex.Match(Path.GetFileNameWithoutExtension(file), "^\d{1,5}$").ToString|
|後方参照で置換||.Replace(対象文字列,"<a href="http://~">(.*?)</a>","$1")|
|ファイル名に使えない文字を置換||mystring=Regex.Replace(mystring, "[\\\/:,;*?""<>|]", "_")|
|文字コード|System.Text.Encoding.GetEncoding("SHIFT-JIS")||
*&aname(LinkLabel){LinkLabel}
なんかハイパーリンクを使いたかったのでざくっと調べたらLinkLabelっていうコントロールがある。
テキストいれればクリックで勝手にブラウザ呼んでくれるのかと思ったら、呼び出しも書かなきゃいけないし、訪問済みかどうかも自分で設定しなきゃいけないみたい。不便。自分で変更できるのはありがたいとして、最初からブラウザと同期してくれてもいいと思うんだけど、なんでだろう。
まあ複数リンクも扱えるけど、もっとこう、さくっと。
*&aname(ハッシュテーブル){ハッシュテーブル}
2007/05/16
Addは使わなくても良い。
>指定したキーがハッシュテーブルに存在しない場合には、新しい要素として登録される。
>キーがすでに存在する場合には、インデクサではそのキーに対応する値が置き換えられるが、Addメソッドでは例外が発生する。
*&aname(With Nothingを使って変数を局所化){With Nothingを使って変数を局所化}
2007/05/16
http://blogs.wankuma.com/jeanne/archive/2006/11/07/43926.aspx
Sub Hoge
With Nothing
dim i as integer
処理
End With
With Nothing
dim i as integer
処理
End With
End Sub
みたいな形で変数のスコープを短くして使いまわせるという話。
*&aname(共有メンバ){共有メンバ}
2007/05/17 ヘルプより
>既定では、クラスのデータはクラスの各インスタンスに固有になります。ただし、1 つのクラスから作成したすべてのオブジェクト間で、1 つのデータ項目を共有する方が都合のよい場合もあります。このような場合には、Shared 修飾子を使用して、変数の同じ値をクラス内のすべてのインスタンスで共有できるようにします (共有メンバは、他のプログラミング言語では "静的メンバ" と呼ばれる場合もあります)。共有メソッドは、事前にクラスのインスタンスを作成しなくても、クラス名を使用して直接呼び出すことができます
参考:http://blogs.wankuma.com/torikobito/archive/2007/04/04/70121.aspx
*&aname(よくつかうリンク){よくつかうリンク}
2007/05/29 [[Visual Studio User Group>http://vsug.jp/]]
----
*comment
このページの記述で聞きたいこととか間違ってることとかありましたらコメントを。
#comment_num2
----
PageLastUpdate:&date()/today:&counter(today)/yesterday:&counter(yesterday)
#openclose(show=クリックすると見出し一覧を表示します){
#contents()
}
オブジェクト指向から勉強中。ヘタレた内容だけど笑わないでね。
*&aname(自作クラスとか){自作クラスとか}
|[[DataGridViewEx]]|2007/11/19|拡張DataGridView。列位置や幅のユーザー別の保存とか|
|[[DataGridViewSynchronizer]]|2007/11/13|上下に並べたふたつのDataGridViewの列表示を同期させるクラス。|
|[[WorkStationLockController]]|2007/07/16|PCのロックをしたりロック状態を取得するクラス|
|[[DebugTimer]]|2007/07/23|デバッグ時に処理ごとのパフォーマンスを計測するクラス|
*&aname(ESCキーで行の変更をキャンセルするDataGridView){ESCキーで行の変更をキャンセルするDataGridView}
2008/06/16 検索語:キーボード ショートカット エスケープ DataTable
DataGridViewはESCキーで編集のキャンセルができないので、とりあえず作ってみた。
Bindしている行がDataRowViewにDirectCastできるのが前提条件です。
#highlight(vb.net){
Public Class DataGridViewEx
Inherits DataGridView
Private _rejectbyescape As RejectByEscapeType = RejectByEscapeType.None
Public Enum RejectByEscapeType As Integer
None = 0
CurrentRow = 1
SelectedRows = 2
End Enum
Public Property RejectByEscape() As RejectByEscapeType
Get
Return _rejectbyescape
End Get
Set(ByVal value As RejectByEscapeType)
_rejectbyescape = value
End Set
End Property
Private Sub DataGridViewEx_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
Try
If e.KeyCode = Keys.Escape Then
'編集モードではなくReadOnlyでもなければRejectChanges
'(グリッドがReadOnlyのときはCurrentRowも自動的にReadOnlyになるのでCurrentRowだけで判定してOK)
If (IsCurrentCellInEditMode = False) And (CurrentRow.ReadOnly = False) Then
Select Case _rejectbyescape
Case RejectByEscapeType.CurrentRow
DirectCast(Me.CurrentRow.DataBoundItem, DataRowView).Row.RejectChanges()
Case RejectByEscapeType.SelectedRows
For Each dgvr As DataGridViewRow In SelectedRows
DirectCast(dgvr.DataBoundItem, DataRowView).Row.RejectChanges()
Next
End Select
End If
End If
Catch ex As Exception
MessageBox.Show(ex.ToString & ex.Message)
End Try
End Sub
End Class
}
*&aname(Microsoft Visual Studio International Pack 1.0){Microsoft Visual Studio International Pack 1.0}
2008/04/11 http://www.microsoft.com/downloads/details.aspx?FamilyID=f9cfc884-1f00-45fa-b2fb-303d9e110bc7&DisplayLang=ja
|East Asia Numeric Formatting Library|数値データを日本語、繁体字中国語、簡体字中国語および韓国語における漢数字の文字列に変換します。|
|Japanese Kana Conversion Library|ひらがな、カタカナ、半角カタカナの相互変換、およびローマ字の変換をします。|
|Japanese Text Alignment Library|日本語固有の均等割付を用いて文字列を描画します。|
|Japanese Yomi Auto-Completion Library|日本語IME における読みの入力に対応したオートコンプリート機能を提供するライブラリとサンプルのTextBox コントロールを提供します。|
*&aname(My.Settingsの構成ファイルの場所を取得する。){My.Settingsの構成ファイルの場所を取得する。}
2008/03/25 検索語:exe.config、user.config、ApplicationSettingBase
アプリケーション構成ファイル
#highlight(vb.net){System.AppDomain.CurrentDomain.SetupInformation.ConfigurationFile}
ユーザー構成ファイル
#highlight(vb.net){ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal).FilePath}
ネタ元:http://www.atmarkit.co.jp/fdotnet/dotnettips/558appsettings/appsettings.html
ちなみに同一記事にもかかれているが、2005ではローミングユーザーであってもローカルユーザーのユーザー構成ファイルが使われてしまうようだ。せっかくローミングにも対応するように設計したつもりだったけど意味無い・・・。
別課題:過去の設定ファイル消せないと気持ち悪い。
*&aname(Partial Classをメインのクラスのツリー下に配置する){Partial Classをメインのクラスのツリー下に配置する}
2008/03/24
projファイルの中から目的の分割クラスの記述を見つけ、DependentUpon行を追加すればOK。
#highlight(vb.net){<Compile Include="MainForm.Menu.vb">
<DependentUpon>MainForm.vb</DependentUpon> '←この行を追加
<SubType>Form</SubType>
</Compile>}
SubTypeは消してもVisual Stdio上で一回開いて保存すると元に戻る。
*&aname(C#→VB.netへのコード変換サービス){C#→VB.netへのコード変換サービス}
2008/03/24 http://codeconverter.sharpdevelop.net/Convert.aspx
使ってみた中ではコレが一番だった。
*&aname(Visual Studio 2005 SP1 統合 installer の作成方法){Visual Studio 2005 SP1 統合 installer の作成方法}
2008/01/30
http://blogs.wankuma.com/tyappi/archive/2008/01/05/116016.aspx
*&aname(再帰的にコントロールの親をたどって、ピリオド区切りでパスを返す関数){再帰的にコントロールの親をたどって、ピリオド区切りでパスを返す関数}
2008/01/21
例えばForm1のPanel1に乗っているTextbox1なら Form1.Panel1.TextBox1 と帰ってきます。
#highlight(vb.net){
Public Function ControlPath(ByVal ctl As Control) As String
Try
If ctl.Parent Is Nothing Then
Return ctl.Name
Else
Return ControlPath(ctl.Parent) & "." & ctl.Name
End If
Catch ex As Exception
MessageBox.Show(ex.ToString)
Return ""
End Try
End Function}
*&aname(VBScriptのエラーコードメモ){VBScriptのエラーコードメモ}
2007/12/25 Descriptionが定義されていないものがある。一覧が見つけられない・・・。誰か教えて。
|エラーコード|内容|h
|-2147024843|たぶんネットワークパスが見つからないとき。|
*&aname(Visual Studio 2008 Express Edition){Visual Studio 2008 Express Edition}
2007/12/18
ついにきました。まあいきなりインストールするわけにもいかないから、遊ぶのは正月休みですね。不具合情報の様子見でw
なんと窓の杜から落とせるよ。
http://www.forest.impress.co.jp/lib/stdy/program/progdevenv/vbexedition.html
……と思ったら違いました。ダウンロード先は「作者サイト」になってるのね。
*&aname(チェックボックスでスプリットコンテナのパネルの表示をOn/Offする){チェックボックスでスプリットコンテナのパネルの表示をOn/Offする}
2007/12/06
検索語:CheckBoxでSplitContainerのPanelをOn/Off、反転、True、False
SplitContainerのパネルを片側消したかったけど、Visibleでスプリッタが動いてくれないので「なんで?」と探したらPanel1Collapsed/Panel2Collapsedというわかりにくいプロパティでした。ヘルプには「縮小または展開するかどうかを決定する値を取得または設定します。」と書いてある。表現がわかりにくいっちゅうの。
で、チェックボックスをOnにしたときに表示、Offにしたときに非表示にしたいんだけど、CheckedとCollapsedの単純バインディングだと逆になってしまうので、Bindingオブジェクトの拡張クラスをつくってみた。
#highlight(vb.net){Private Class BindingReverseBoolean
Inherits Binding
Public Sub New(ByVal propertyName As String, ByVal dataSource As Object, ByVal dataMember As String)
MyBase.New(propertyName, dataSource, dataMember, False, Windows.Forms.DataSourceUpdateMode.OnPropertyChanged)
End Sub
Private Sub BindingReverseBoolean_Format(ByVal sender As Object, ByVal e As System.Windows.Forms.ConvertEventArgs) Handles Me.Format
e.Value = Not e.Value
End Sub
Private Sub BindingReverseBoolean_Parse(ByVal sender As Object, ByVal e As System.Windows.Forms.ConvertEventArgs) Handles Me.Parse
e.Value = Not e.Value
End Sub
End Class}
で、FormのLoadでこんな感じに使います。
#highlight(vb.net){myCheckBox.DataBindings.Add(New BindingReverseBoolean("Checked", mySplitContainer, "Panel2Collapsed"))}
どうもバインディングオブジェクトは
[Checked]⇒True=Format=False⇒[Collapsed]⇒False=Parse=True⇒[Checked]
こういう感じに動くようだ。2回値がセットされる感じ。
今回は自分で使うだけで、絶対にBoolean以外がこないのはわかっているのでエラー処理はなし。
余裕があれば汎用的なクラスにしたいので、プロパティの型チェックとかいれる予定。
*&aname(配列をリストに変換する){配列をリストに変換する}
2007/11/18
リストを配列に変換するのはToArrayで簡単。配列をリストに変換する方法がわからない・・・3時間ぐらい調べてやっと見つけた。
http://d.hatena.ne.jp/Seasons/searchdiary?word=*%5BC%23%5D
わかってみれば簡単でリストのコンストラクタに渡せばよいだけでした・・・
Dim myArray As String() = {"A","B","C"}
Dim myList As List(Of String) = New List(Of String)(myArray)
固定値の入ったリストを作るときもこのほうがラク。
つか、ちょっとデキる人は絶対わかってるよな。「リストを配列に変換する」で検索してどうにもひっかからないっていうのは何故。
*&aname(型比較でハマる){型比較でハマる}
2007/11/18
オブジェクトのプロパティを列挙する処理を書いていたら、PropertyTypeの型のチェックで
エラー 5 型 'System.Type' の式を型 'String' にすることはできません。
のエラーが出て、いろいろ書き換えてみてもどうにも通らない。
原因は「型の比較はTypeOfだ」という思い込みでした。
#highlight(vb.net){For Each pi As PropertyInfo In target.GetType.GetProperties
Select Case True
Case TypeOf pi.PropertyType Is String '←ここがダメ
...
Case Else
...
End Select
Next}
↓
#highlight(vb.net){For Each pi As PropertyInfo In target.GetType.GetProperties
Select Case True
Case pi.PropertyType Is GetType(System.Byte) '←これでOK
...
Case Else
...
End Select
Next}
TypeOfはオブジェクトと型を比較するのね。型どうしの直接比較ならIsだけでよい。
気づかなかったのが恥ずかしい・・・。
*&aname(NewGUIDを文字列にするときの引数){NewGUIDを文字列にするときの引数}
2007/11/10
よくわからなくなるのでメモ。xは16進数なので[0-9A-F]。
|GUID.NewGUID.ToString("N")|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|32桁|
|GUID.NewGUID.ToString("D")|xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx|ハイフンで区切られた 32 桁|
|GUID.NewGUID.ToString("B")|{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}|中かっこで囲まれ、ハイフンで区切られた 32 桁|
|GUID.NewGUID.ToString("P")|(xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)|丸かっこで囲まれ、ハイフンで区切られた 32 桁|
*&aname(My.Settingsに連結したコントロール間でChangedイベントで値をやり取りすると値が書き戻されることがある){My.Settingsに連結したコントロール間でChangedイベントで値をやり取りすると値が書き戻されることがある}
2007/11/08
実際に起こったのはチェックボックスのChackedChangedでテキストボックスに値を書き込んだら、チェックボックスの値が再度My.Settingから読み出されて変更する前に戻ってしまう。
検索したらMy.Settingsの挙動不審がいくつか見つかるので、バインドしたコントロール間でやり取りはしないほうが無難。
2007/11/15 Microsoftにも正式文書がありました。
http://msdn2.microsoft.com/ja-jp/library/a65txexh(VS.80).aspx
現在、Windows フォームの一部のプロパティはバインドできません。わかりやすい例は ClientSize プロパティです。
このプロパティにバインディングすると、実行時に予期できない動作が発生します。
通常、設定をプログラムで保存して読み込むことでこの問題を解決できます。
*&aname(DataSet中の複数のテーブルをAccessのように連結して扱う){DataSet中の複数のテーブルをAccessのように連結して扱う}
2007/10/26
アクセスがクエリを元にフォームをつくれるので、同じことがVB.netでもできないかなと探していたら、DataTable間にリレーションを設定し、DataColumnのExpressionを設定することで実現できました。
#highlight(vb.net){
Private relationTest As System.Data.DataRelation
Me.relationTest = New System.Data.DataRelation( _
"relationTest",
New System.Data.DataColumn() {Me.tableA.ShohinCDColumn}, _
New System.Data.DataColumn() {Me.tableB.ShohinCDColumn}, _
false)
Me.Relations.Add(Me.relationTest)
Me.tableA.ShohinNameColumn.Expression = "Parent(rerarionTest).ShohinName"
}
DataGridViewの列で処理することばかり考えていて、DataTableそのものに列を追加するというのは、ちょっと思いつかなかったな。
いままでコードに対応する名称をDataGridView上で表示するのにわざわざコンボボックスを使っていたので、これでとてもラクになりました。
DataTableはアクセスのクエリの役目も果たしてくれるのですね。
ちなみにここにはコードで載せていますが、これはDataSetのDesiner.vbから拾ってきたもので、実際にはデザイナオンリー、ノンコーディングで実現できています。
*&aname(継承コントロールをデザイナで削除すると「インデックスが範囲を超えています」のエラー){継承コントロールをデザイナで削除すると「インデックスが範囲を超えています」のエラー}
2007/10/10
検索語:コンストラクタ
Newの中でAddHandlerしたテキストボックスの継承コントロールで、デザイナで削除するときに
インデックスが範囲を超えています。負でない値で、コレクションのサイズよりも小さくなければなりません。
パラメータ名: index
のエラーメッセージが出るようになってしまった。いろいろ調査した結果、原因はAddHandlerだと判明。
#highlight(vb.net){AddHandler DataBindings.CollectionChanged, AddressOf DataBindings_CollectionChanged}
最終的にはDisposeの中でRemoveHandlerを書くことで解決。
#highlight(vb.net){RemoveHandler DataBindings.CollectionChanged, AddressOf DataBindings_CollectionChanged}
似たようなことをやっている他の継承コントロールでは起きないので、解放するリソースの種類や内部処理に依存しそう。
まあ「Disposeするときにきちんとすべてのリソースを解放しましょう」というのは当たり前のことだから、いままでAddHandlerの後始末をやっていなかったのがダメなんでしょう。たぶん。
「AddHandlerしたら必ずRemoveHandlerしましょう」とか、教えてくれる人もいなかったし、どこかに書いてあるのかなぁ。
*&aname(継承したテキストボックスをフォームから削除しようとすると、エラーが出て削除されない。){継承したテキストボックスをフォームから削除しようとすると、エラーが出て削除されない。}
2007/08/27
インデックスが範囲を超えています。負でない値で、コレクションのサイズよりも小さくなければなりません。
プロジェクトを開きなおすときちんと消えている。
継承したコントロールの中でやっている処理の問題だった。詳細な内容は後でかこう。
*&aname(ComboBoxに連結したDataTableが意図せずに変更される){ComboBoxに連結したDataTableが意図せずに変更される}
2007/10/04 検索語:コンボボックス/DataTable/DataView/DataSource/Bind/データが変わる
DataTableにコンボボックスを連結したときに、既存データにコンボボックスに存在しない値が入っていると、レコードのCurrent時にコンボボックスの先頭の値に書き換えられてしまう。
FormattingEnabled をTrueにすることで解消できる。FormatString を設定する必要はない。
*&aname(Express Edition ではセットアップ用のmsiはつくれない){Express Edition ではセットアップ用のmsiはつくれない}
2007/08/07 確実な情報が見つからないけど、つくれないっぽい。
↓こういうの見つけた。んー、個人でここまで踏み込むかどうするか。会社でやる分にはVS.net使えるからなぁ。
[[WiXではじめるWindows Installer作成入門>http://codezine.jp/a/article/aid/428.aspx]]
*&aname(ComboBoxにはDoubleClickイベントがないのね){ComboBoxにはDoubleClickイベントがないのね}
2007/08/24 コンボボックスでDoubleClickイベントを使おうかと思ったらありませんでした。
*&aname(CSVの読み込み){CSVの読み込み}
日本語の露出が少ないけどXmlCsvReaderというのがよさそう。テストしてみよう。
*&aname(相手先別に添付ファイルを変更するメール送信ソフトを作ってみよう){相手先別に添付ファイルを変更するメール送信ソフトを作ってみよう}
2007/07/26
VB.netでメール送信するのは簡単そう。相手のアドレスと添付ファイルのリストから、メール送信するソフトを作ってみよう。
&strike(){http://www.atmarkit.co.jp/fdotnet/dotnettips/017sendmail/sendmail.html}
↑このアドレスは2003で、2005からはクラスが変わっていました。
http://www.microsoft.com/japan/msdn/vbasic/migration/tips/netmail/
2007/07/28 うーん、SmtpClient はいろいろ問題がありそうな。POP before SMTPとかも自作しなきゃいかんし。
http://support.microsoft.com/default.aspx/KB/927858
2007/07/28 商用利用も含めてフリーライセンスのよさそうなライブラリを発見。
[[.NET用メール送受信クラスライブラリ (TKMP.DLL)>http://uwa.potetihouse.com/library/tkmpdll.html]]
ライセンスについて http://uwa.potetihouse.com/bbs/patio.cgi?mode=view&no=139
自分で組めるようにもなりたいけど、とりあえず利用させていただいて、少しづつ力をつけよう。
*&aname(コンボボックスに高速にデータをBindする){コンボボックスに高速にデータをBindする}
2007/07/24
DataSourceよりもValueMemberとDisplayMemeberを先に指定したほうが速いようです。
設定するたびにリクエリがかかる感じですね。
特に件数の多いテーブルをBindするときに効果的です。
**DataSourceを先に設定した場合
#highlight(vb.net){
DebugTimer.WriteLine("Testスタート")
cboSample.DataSource = New DataView(dt) '←先に設定
DebugTimer.WriteLine("DataSourceをセット")
cboSample.ValueMember = "連結したい列名"
DebugTimer.WriteLine("ValueMemberをセット")
cboSample.DisplayMember = "表示したい列名"
DebugTimer.WriteLine("DisplayMemberをセット")
}
|MEMO|00:00:000|00:00:000|Testスタート|
|MEMO|00:00:272|00:00:272|DataSourceをセット|
|MEMO|00:00:540|00:00:268|ValueMemberをセット|
|MEMO|00:00:808|00:00:268|DisplayMemberをセット|
**DataSourceを後に設定した場合
#highlight(vb.net){
DebugTimer.WriteLine("Testスタート")
cboSample.ValueMember = "連結したい列名"
DebugTimer.WriteLine("ValueMemberをセット")
cboSample.DisplayMember = "表示したい列名"
DebugTimer.WriteLine("DisplayMemberをセット")
cboSample.DataSource = New DataView(dt) '←後に設定
DebugTimer.WriteLine("DataSourceをセット")
}
|MEMO|00:00:000|00:00:000|Testスタート|
|MEMO|00:00:000|00:00:000|ValueMemberをセット|
|MEMO|00:00:000|00:00:000|DisplayMemberをセット|
|MEMO|00:00:296|00:00:296|DataSourceをセット|
*&aname(Microsoft Win32 と Microsoft .NET Framework API との対応){Microsoft Win32 と Microsoft .NET Framework API との対応}
2007/07/16 http://www.microsoft.com/japan/msdn/net/general/win32map.aspx
*&aname(2005でデザイナから自動生成されるDataTableでのDBNull){2005でデザイナから自動生成されるDataTableでのDBNull}
2007/07/16
XというフィールドにDBNullが来るよねと思ってIsDBNull(X)で判定しようとしたら蹴られた。
なんで?と思ってクラスを見たら、テーブルのメソッドにIsXNullっていうのが作られてた。
なるほど。Nullの可能性のあるフィールドはこれで判断しろと。
*&aname(タイマーとメッセージボックス){タイマーとメッセージボックス}
2007/07/16
メッセージボックスが出ているあいだもタイマーは動き続けているので、処理によっては固まる。注意。
*&aname(ワークステーションのロック){ワークステーションのロック}
2007/07/16 カンタンだった。
System.Diagnostics.Process.Start("rundll32.exe", "user32.dll,LockWorkStation")
2007/07/16 ロックかけるのは簡単だけど、ロックされているかどうかの判断が難しい。つか標準ではできない。
http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200612/06120018.txt
Microsoft.Win32.SystemEventsのSessionSwitchを使うことで、
ロック開始のイベントとロック終了のイベントを受け取ることができます。
との情報を発見したので、ロック状態を管理しつつ、ロックをかけてくれるクラスを作成。 → [[WorkStationLockController]]
念のためsingletonをとっておく。singletonについては → http://hccweb1.bai.ne.jp/tsune-1/VisualBasic/singleton.html
ちなみにsingletonをグローバル変数的に使うのはよくないというのは心しておく。
ワークステーションのロックについて調べていたら突き当たったサイト → http://www7a.biglobe.ne.jp/~lshen/EternalWindows/
GINAとか珍しいあたりをわかりやすく書いてくれてる。
フォアグラウンドウインドウを判定するのってAPI使うしかないのかなぁ。 → http://iseebi.half-done.net/?TechDoc%2FDetectionFullscreen
*&aname(LDAPとActive Directoryの要素の比較){LDAPとActive Directoryの要素の比較}
2007/07/13
参考:http://publib.boulder.ibm.com/tividd/td/ITAME/SC32-1358-00/ja_JA/HTML/am51_webseal_devref101.htm
|最大長|LDAP|Active Directory|
|名 (LDAP CN)|256|64|
|ミドル・ネーム|128|64|
|姓|128|64|
|レジストリー UID (LDAP DN)|1024|2048|
|ユーザー・パスワード|制限無し|256|
|ユーザー記述|1024|1024|
|グループ名|256||
|グループ記述|1024|1024|
|シングル・サインオン・リソース名|240|256|
|シングル・サインオン・リソース記述|1024|1024|
|シングル・サインオン・ユーザー ID|240|256|
|シングル・サインオン・パスワード|制限無し|256|
|シングル・サインオン・グループ名|240|256|
|シングル・サインオン・グループ記述|1024|1024|
|アクション名|1|1|
|アクション記述、アクション・タイプ|制限無し|制限無し|
|オブジェクト名、オブジェクト・スペース名、ACL 名、POP 名|制限無し|制限無し|
|オブジェクト記述、オブジェクト・スペース記述、ACL 記述、POP 記述|制限無し|制限無し|
*&aname(DirectorySearcher手ごわい){DirectorySearcher手ごわい}
2007/07/13
http://www.microsoft.com/japan/msdn/community/gdn/ShowPost-33574.htm
グループとユーザーの階層をノード的に取得しようとしたけど、手ごわい。
なんだよMemberofプロパティとかPrimaryGroupが取れないとか。
Microsoftのヘルプじゃまったくダメで、LDAPの仕様とか理解しないといけないところがツラい・・・
*&aname(System.DirectoryServices.DirectoryEntry.SchemaClassNameの一覧){System.DirectoryServices.DirectoryEntry.SchemaClassNameの一覧}
2007/07/12
※とりあえず私が使ったものをメモっていきます。
|ユーザー|User|
|グループ|Group|
|コンピュータ|Computer|
|サービス|Service|
検索をかけても一覧が見つからない・・・誰か教えて。
*&aname(SelectCommandでデータ書き込むストアド指定するとコミットされない・・・んー){SelectCommandでデータ書き込むストアド指定するとコミットされない・・・んー}
2007/07/10
DataAdapterのSelectCommandにデータの更新ありのストアドを投げると、戻ってきた結果は正しいのにデータベースには反映されてないみたい。
んー、いちいちコミットいれなきゃダメ?
→mdfファイルが毎回コピーされてしまうためでした。
http://www.atmarkit.co.jp/fdotnet/dotnettips/532dbfilecopy/dbfilecopy.html
*&aname(2005のヘルプにCrystal Reportのヘルプを追加とか){2005のヘルプにCrystal Reportのヘルプを追加とか}
2007/07/09
http://salv.miscnotes.com/2005/01/tips5_vsnethelphelp.php
*&aname(TreeView使ってみた){TreeView使ってみた}
2007/07/04
便利。同じTreeNodeオブジェクトを別のツリーに追加することはできなかった。
*&aname(アップキャストとダウンキャスト){アップキャストとダウンキャスト}
2007/06/14
|アップキャスト|派生クラス→基本クラス|常にOK|
|ダウンキャスト|基本クラス→派生クラス|やらないほうがよい。できないこともある。|
ダウンキャストについてはちょっと勉強したほうがよさそうだ。
*&aname(IIFとdecimalでハマる){IIFとdecimalでハマる}
2007/06/12
DataTable.ColumnのExpressionを使用していて、floatだったフィールドをdecimalに変更したら何故か0除算のエラー。
IIF([分母]=0,0,[分子]/[分母])
とやって0除算をしてないはずなのに・・・・・・と半日ハマる。結論は
IIFは真も偽も計算してから値を返すから
IIFは普段は危険だから使わないんだけど、floatのときにエラーにならなかったので見落としました。
floatは0除算でエラーを返さないのね。
でもExpressionの中ってIIFしか条件式が使えない。やむをえず
[分子]/CAST([分母],'System.Double')
として回避。
*&aname(GrapeCity FlexGrid for .NET 2.0J){GrapeCity FlexGrid for .NET 2.0J}
ダメだこれ。もうイヤ。
何がダメって、ColumnオブジェクトのNameプロパティが連結先のDataTableの列名。
で、複数のColumnに同じNameが設定できる。だからIndex以外で列を特定する術がない。
なのに、列位置を移動するとIndexが変わる。
頼むからNameは固有値にしてMappingName を指定させてくれ。
誰だこんなコントロール使うことにしたのは。二度と使わない。
いや、最新は4.0Jだから、よくなってるのかもしれないけれど。
*&aname(VB.Netに関する資料){VB.Netに関する資料}
2007/04/22 オブジェクト倶楽部 http://www.objectclub.jp/
ここのトレーニングテキストが死ぬほど役立つ。入門用とリファレンスのちょうど中間あたりの本になりにくいあたりが解説されている。
2007/05/13 ちょっと見ようと思ったら見つけられない。C#のページにありました。
http://www.objectclub.jp/technicaldoc/c/training.pdf
2007/04/29 .NETでの正規表現の使用法 http://japan.internet.com/column/developer/20050822/28.html
2007/05/01 コンテキストメニューまわり http://vbdotnet.fc2web.com/vbnet/control/ContextMenuMenu.htm
*&aname(ArrayListとList){ArrayListとList}
2007/04/22
自作クラスのコレクションを作れるに違いないと思って、ArrayListを調べて2時間。
どうしても型指定したコレクションがつくれないよー(。´Д⊂)
と、泣きそうになったところでListに気がつく。
あまりにも最初にArrayListに慣れ親しんだために、それ以外思い浮かばなかった失敗。
2007/05/24
Listって.net 2005(Framework 2.0)からなので。自宅は2005、会社は2003なので、会社で使おうとして使えなくてがっかり。
*&aname(プロパティにオブジェクトを設定したときにNewのタイミング){プロパティにオブジェクトを設定したときにNewのタイミング}
2007/04/22
プロパティ用のローカル変数に
Private _objectname As Objecttype
と宣言していてハマる。
Private _objectname As New Objecttype
きちんとインスタンス意識しないとね。
*&aname(自分自身と同じ型のコレクションをプロパティに持つ){自分自身と同じ型のコレクションをプロパティに持つ}
Private _childnodes As New List(Of LogNode)
Public Property ChildNodes() As List(Of LogNode)
Get
Return _childnodes
End Get
Set(ByVal value As List(Of LogNode))
_childnodes = value
End Set
End Property
----
2007/04/22 とりあえず2日間ざっくり勉強して2日間ざくざく組んだら、少し勘が働いてきた。
言語って、あるレベルまでいかないと、目の前が開けないよね。一回開けてくると調査スピードも速くなる。
*&aname(DateTimeメモ){DateTimeメモ}
2007/04/27
DateTimeの中身は#1/1/0 00:00:00#(西暦0年1月1日)からの経過ミリ秒
javascriptと値がずれるなと思ったら、javascriptは#1970/01/01 00:00:00#からの経過ミリ秒でした。
で、それでも誤差が32400ミリ秒出るので何かと思ったら、32400/60/60=9、ということで標準時との差。
*&aname(再帰型のクラスでちょっとはまったこと){再帰型のクラスでちょっとはまったこと}
クラスを通過するたびにカウントアップするような引数は参照渡しすること。
*&aname(ライブラリメモ){ライブラリメモ}
|ファイルパスの分解|System.Io.Path|ディレクトリ名はディレクトリを指定すればFileNameで取得できる|
||.GetExtension|戻り値はピリオド付き|
|ファイルの検索|System.Io.Directory|戻り値はString()|
|ファイル情報|My.Computer.FileSystem.GetFileInfo||
||.Length|ファイルサイズの単位はバイト|
|正規表現|System.Text.RegularExpressions|Regex.Match(Path.GetFileNameWithoutExtension(file), "^\d{1,5}$").ToString|
|後方参照で置換||.Replace(対象文字列,"<a href="http://~">(.*?)</a>","$1")|
|ファイル名に使えない文字を置換||mystring=Regex.Replace(mystring, "[\\\/:,;*?""<>|]", "_")|
|文字コード|System.Text.Encoding.GetEncoding("SHIFT-JIS")||
*&aname(LinkLabel){LinkLabel}
なんかハイパーリンクを使いたかったのでざくっと調べたらLinkLabelっていうコントロールがある。
テキストいれればクリックで勝手にブラウザ呼んでくれるのかと思ったら、呼び出しも書かなきゃいけないし、訪問済みかどうかも自分で設定しなきゃいけないみたい。不便。自分で変更できるのはありがたいとして、最初からブラウザと同期してくれてもいいと思うんだけど、なんでだろう。
まあ複数リンクも扱えるけど、もっとこう、さくっと。
*&aname(ハッシュテーブル){ハッシュテーブル}
2007/05/16
Addは使わなくても良い。
>指定したキーがハッシュテーブルに存在しない場合には、新しい要素として登録される。
>キーがすでに存在する場合には、インデクサではそのキーに対応する値が置き換えられるが、Addメソッドでは例外が発生する。
*&aname(With Nothingを使って変数を局所化){With Nothingを使って変数を局所化}
2007/05/16
http://blogs.wankuma.com/jeanne/archive/2006/11/07/43926.aspx
Sub Hoge
With Nothing
dim i as integer
処理
End With
With Nothing
dim i as integer
処理
End With
End Sub
みたいな形で変数のスコープを短くして使いまわせるという話。
*&aname(共有メンバ){共有メンバ}
2007/05/17 ヘルプより
>既定では、クラスのデータはクラスの各インスタンスに固有になります。ただし、1 つのクラスから作成したすべてのオブジェクト間で、1 つのデータ項目を共有する方が都合のよい場合もあります。このような場合には、Shared 修飾子を使用して、変数の同じ値をクラス内のすべてのインスタンスで共有できるようにします (共有メンバは、他のプログラミング言語では "静的メンバ" と呼ばれる場合もあります)。共有メソッドは、事前にクラスのインスタンスを作成しなくても、クラス名を使用して直接呼び出すことができます
参考:http://blogs.wankuma.com/torikobito/archive/2007/04/04/70121.aspx
*&aname(よくつかうリンク){よくつかうリンク}
2007/05/29 [[Visual Studio User Group>http://vsug.jp/]]
----
*comment
このページの記述で聞きたいこととか間違ってることとかありましたらコメントを。
#comment_num2
----