プログラミング

[WPF]コンボボックスのリストを変更した時にselectedItemを見失うのを防ぐ

Mohmongar
コンボボックスのリストの中身を変更(ソートとか)した時にselectedItemを見失うのを防ぐ。Tagプロパティを一時保存に使用するのであまり美しくない? private void ComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e) { var combo = (ComboBox)sender; object item = combo.SelectedItem; if (item == null) { combo.SelectedItem = combo.Tag; } else { combo.Tag = combo.SelectedItem; } }

Pythonで二次元配列の初期化

Mohmongar
Pythonを使って初歩的なミス。二次元配列の初期化で端折ってa=[[0]*3]*3などとしてしまったため、a[0][0]=1とした時、a[0][0]==a[1][0]==a[2][0]==1となり、しばらくうまく思ったとおりに動かず悩む。初歩的ミス。とりあえずa = [[0 for i in range(0,3)] for j in range(0,3)]と書いたが、個人的には美しくない。

[c#][sqlite3][sql]create .. as selectで数値が化ける

Mohmongar
c#でSqlite をつかっていた際、特定の条件で64bit数値が32bit化されることを発見。普通のselectでは発生せず、 create table ... as select ... で発生。 System.Data.SQLite Net.1.0.108で発生。SQLite version 3.24.0.のコマンドラインツールからの実行では発生なし。python 3.5.1 sqlite3 2.6 で発生なし、なので、.Netライブラリ上でのみ起こるっぽい。 元のテーブル create table test (id integer not null unique primary key, value integer not null); に下図のような値が入っていた時、 create table tmp as select id,value,value+0 from test; を実行したら、 となり、value欄の値が化けているのがわかる。-4394967295=0xffffffff付近で化けていることから、64bitが途中で32bit化しているっぽい。value+0となんらかの演算を行ったvalue+0カラムは正常な値になっている。 ちなみにselectだけの select id,value,value+0 from test; の場合、問題は起こらない。

[Forms][C#]メニューに排他的にチェックをいれる

Mohmongar
C#でFormsを使ってプログラムする機会があって調べたメモ。メニューのあるアイテムの下層をひとつのグループとみなし、そのグループ中で一つだけチェックが入る前提で、メニューを選択した際にチェックをいれる処理を統一したもの。親menu1の下に子menu1_menu1,menu1_menu2,... があるとして、各メニューの処理時に同じCheckMenuExclusivelyを呼び出すことで排他的にチェックマークが入る。当然チェックを入れる以外の処理は別途必要。たぶん似たようなものはそこらに転がってるけど、子メニューを示すメソッドがItemsではなくDropDownItemsであったことため、しばし悩んだのでメモしておく。 void CheckMenuExclusively(object sender, ToolStripMenuItem upper) { foreach (ToolStripMenuItem item in upper.DropDownItems) { if (object.ReferenceEquals(sender, item)) { item.Checked = true; } else { item.Checked = false; } } } private void menu1_menu1_Click(object sender, EventArgs e) { CheckMenuExclusively(sender, menu1); }

[Forms][C#]BindingListでデータバインドする

Mohmongar
ひさしぶりにWindowds formsのプログラムをC#で作成中にコントロールにデータバインドをしようとしたら、ListBoxなど一部のコントロールでは<INotifyPropertyChangedを使った更新が効かないことが分かったので、BindingListで使用したのでメモ。(というか本来ListboxにバインドできるのはSelectedIndex ,SelectedItem ,SelectedValue,Tagだけらしい)。 ここでBindingListを使わずにtestclassを直にDataSourceにバインドすると、PropertyChangedがnullとなる。 t = new testclass(); t.display = "one"; testdata = new BindingList&lt;testclass&gt;(); testdata.Add(t); listBox1.DisplayMember = nameof(display); listBox1.DataSource = testdata; ついでによく忘れるので、INotifyPropertyChangedの書き方。 using System.ComponentModel; public class testclass : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; private void NotifyPropertyChanged(string propertyName = "") { PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } public string _display; public string display { get { return _value; } set { if (value != _display){ _display= value; NotifyPropertyChanged(nameof(display)); } } } } ほかにもいろんなやりかたがあるらしい。参考はこのページ「データ バインディング - .

VisualStudio 2015のC++プロジェクトで*.pdb/*.iobj/*.ipdbを生成させない場合のメモ

Mohmongar
VisualStudio 2015のC++プロジェクトで*.pdb/*.iobj/*.ipdbを生成させない場合のメモ。なおpdbファイルとはデバッガ情報のファイルで詳しくはこちらを参照ください。*.iobj/*.ipdbはリンク時の高速化にかかわるファイルで実行時には使わないみたい。 *.pdbを生成させない プロジェクトのプロパティ→[構成プロパティ]→[リンカー]→[デバッグ]の[デバッグ情報の生成]を「いいえ」にする。 *.iobj/*.ipdbを生成させない プロジェクトのプロパティ→[構成プロパティ]→[リンカー]→[最適化]の[リンク時のコード生成]を「既定」にする 参考はこのVisual C++ のWin32プロジェクトで iobj, ipdb ファイルを生成しないようにする | たにたにっきです。陳謝。

VS2015でUWPプロジェクトが新規作成できない

Mohmongar
Visual Studio 2015でUWPのBlankAppを新規作成しようとすると、左図のようなメッセージが出て、プロジェクトが作成できない。ネット調べると((メモ)UWPプロジェクトが作成できない | 眠るシーラカンスと水底のプログラマー) Anniversary Update SDKがうまくインストールできなくてWinRT.TemplateWizards.ApplicationInsights.Wizardがアセンブリにないらしい。0から最新版のVS2015をインストールしたら治るようなことが書いてあるが、一時しのぎにテンプレートファイルからその記述を削除する。パスC:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\ProjectTemplates\CSharp\Windows Root\Windows UAP\1041\BlankApplicationのBlankApplication.vstemplateファイル内にある &lt;WizardExtension&gt; &lt;Assembly&gt;Microsoft.VisualStudio.WinRT.TemplateWizards, Version=14.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a&lt;/Assembly&gt; &lt;FullClassName&gt;Microsoft.VisualStudio.WinRT.TemplateWizards.ApplicationInsights.Wizard&lt;/FullClassName&gt; &lt;/WizardExtension&gt; を削除すれば動くようになる。保護されているファイルなので修正には管理者権限が必要。

Windows10でIPolicyConfigのGUIDの変更(2)

Mohmongar
気が付くとIPolicyConfigのGUIDがまた変更になったようで、自作のDefaultデバイス変更プログラムでエラー。前回と違いCoCreateInstanceでエラーではなく、SetDefaultEndPointでエラーとなる。動くGUIDは、”f8679f50-850a-41cf-9c72-430f290290c8”とWindows7の時と同じIDに戻ったようだ。前回の時のエラーは1501に変わった直後くらいなので、1607で戻ったのかな?