0 comments
0 trackbacks

Buttonで「閉じる」を作成して、ウィンドウを閉じたいんですが、
TextBoxのLostFocusイベントがあるために、TextBoxからフォーカスが外れた時点でイベントがはしってへんな感じになってしまいました
その対策と対策時の注意点をちょっとメモしておきます

○まずはXmalでイベントを付けるのではなくLoadイベントでLostFocusを追加(ここはどちらでも良いですが)

//ロードイベント
private void Main_Load(object sender, System.EventArgs e)
{
//TextBox1のLostFocusイベントハンドラを追加する
TextBox1.LostFocus += TextBox1_LostFocus;  
}

○LostFocusイベントは行いたい処理を追加する
//LostFocusイベントハンドラ
private void TextBox1_LostFocus(object sender, EventArgs e)
{
//ここでいろいろチェック処理
}
○「閉じる」ボタンをクリック時
・ここでtextBlock1のロストフォーカスイベントを破棄しておきます。PreviewKeyDownだと、フォーカスが移る前のイベントなのでLostFocusの前に破棄することができました。

private void Button1_PreviewKeyDown(object sender, KeyEventArgs e) {
//TextBox1のLostFocusイベントハンドラを破棄する
TextBox1.LostFocus -= TextBox1_LostFocus;
}

※ここで注意点なのですが、このままだと「閉じる」ボタンをクリックし→そのままドラッグした場合に閉じない(閉じるのはKeyUpにしていたとき)事象が発生します。そしてLostFocusがなくなってしまっていました。
○そのため、「閉じる」ボタンのキーアップイベントでイベントをまた追加させてあげることで、問題は解決しました。

private void Button1_PreviewKeyUp(object sender, KeyEventArgs e) {
//TextBox1のLostFocusイベントハンドラを追加する
TextBox1.LostFocus -= TextBox1_LostFocus;
}

これで「閉じる」ボタンをクリック→やっぱり「閉じる」をやめたいので「閉じる」ボタンからフォーカスをはずしてクリックアップしたいとする期待通りの動作になりました。

それでは(*´-`*)ノ
スポンサーサイト
 ↑↑↑↑↑↑よければクリックをお願いします↓↓↓↓↓↓
0 comments
0 trackbacks

.NET による Outlook アイテムおよび Outlook フォルダの参照に使用できるメソッドについて、ちょっとだけメモです。
①まずはappを連携。
Outlook._Application olApp = new Outlook.ApplicationClass();
try{
 // 実処理
 }catch{
  
}finaly{
  olAppがnull以外なら開放処理。

②Namespaceの取得
これも①と同じような処理で確実にメモリを開放できるようにするとよい
 Outlook._NameSpace olNS = olApp.GetNamespace("MAPI");
ここでは書くのは省略。

その他も省略ですが,ほぼ同じように毎回メモリを開放させてあげるとよいです!

■.netのCOMはなかなかメモリがいろいろなので,最後にはがーべじコレクションを行ってあげます。
GC.collect();
GC.WaitForPendingFinalizers(); //参照のみしか消えてないかもしれないので
GC.collect();            //さらにGCを行う

今回はこんな感じで。
あとはEntryIDやらを指定したり,することで,メールの移動だったり,フォルダの操作だったりを.NETが行ってくれます

それではー(*´-`*)ノ

 ↑↑↑↑↑↑よければクリックをお願いします↓↓↓↓↓↓
0 comments
1 trackbacks

■TraceクラスのWriteメソッドでログファイルを出力すしていきたい。
①using System.Diagnostics;を追加

//DefaultTraceListenerオブジェクトを取得
DefaultTraceListener drl;
drl = (DefaultTraceListener) Trace.Listeners["Default"];
//LogFileNameを変更する
drl.LogFileName = "C:\\log\\1.txt";

もう少し凝ったログ出力方法。
■“日付_連番.log”形式でログファイルを出力する。

簡単なやり方なので,自分でトレースしたいときに使うくらいかと思います。

var dailyLogging = new DailyLoggingTraceListener()
{
OutputDirectory = Application.StartupPath + @"\log\", // 既定値 Application.StartupPath
FileNameFormat = "{0:yyyyMMdd}_{1}.log", // 既定値 {0:yyyyMMdd}_{1}.txt
DatetimeFormat = "{0:MM/dd HH:mm}", // 既定値 {0:MM/dd HH:mm:ss}
};
Trace.Listeners.Add(dailyLogging);
Trace.Listeners.Add(new TextBoxTraceListener(textBox1));
●Application.StartupPath で実行ファイルのあるフォルダに log フォルダを指定しています。
 ↑↑↑↑↑↑よければクリックをお願いします↓↓↓↓↓↓
0 comments
0 trackbacks

C#でキー押下時のイベントについて,Ctrl+Aでリストボックスの内容を全選択してみたいです(*´-`*)ノ

■まずはキーを押した時にイベントを起こしたいです

コントロールにKeyDownというイベントとPreviewKeyDownというイベントがあります。

キーダウン時のイベントはこの2つのようです。

キーが押下されると,そのときフォーカスれていたコントロールを格納しているコントロールが,より親のコントロールから順にキーイベントを発生してきますが,今回はリストボックスのみに焦点をおいてみました。

なので使うイベントはPrebirewKeyDownイベントにします。

■次にリストボックスを全選択していきます

SelectAll関数という便利なものがありませんでした。



■方法1~3について
方法1,2は数が多いと時間がかかってしまいます。
その上ちょっと不格好な処理になってしまいます。

そのため方法3が一番見た目的によかったです。

手動のそうさ「一番上の項目をクリック,その後Shiftを押しながら一番下の項目をクリック」を再現しています。
キーストロークを送信するSendKeysクラスを使用し,一番上をクリックはHomeキーで代用し,一番下をクリックはEndキーで代用してみました。

■PrevirewKeyDownとKeyDownの違いについて
・PrevirewKeyDownでは、IMEがOnの状態で押されたキーも確認できます。

ちなみにWindowフォーム→リストボックスの順にキーダウンのイベントは発生します。
 ↑↑↑↑↑↑よければクリックをお願いします↓↓↓↓↓↓
0 comments
0 trackbacks

C#にて文字列比較に「 == 」を使用することがありますがなるべくなら

C#にて文字列比較に「 == 」を使用すべきではありません

・「 == 」を使用して比較
if("abc" == "abc")
{
//
}


MSDNのC#プログラミングガイドにもありますが、文字列比較においては比較の種類を明示的に指定するメソッドを指定すべきです

「== 」でも文字列の比較は可能ですが、場合によっては予期せぬ演算子比較が行われることでバグの温床となる可能性もあります

具体的には、文字列ではなく文字列が含まれるアドレス自体を比較してしまいアドレスに格納されている文字列が同一でもFalseとして判定されることがあります


(参考:MSDNC#プログラミングガイド)
<https://msdn.microsoft.com/ja-jp/librarycc165449.aspx>

●stringクラスのequals()メソッドを使用

・equals()メソッドを使用しての比較ソース
if (string.Equals("abc", "abc") )
{
//
}


このequals()メソッドはオブジェクトの比較に用いられます。
Stringクラスで、equals()メソッドを定義した場合は
「2つのオブジェクトが同じかどうか」
「2つのオブジェクトが表している文字列の内容が同じかどうか」
の比較を行います。

文字列の比較を行う場合は気をつけてみると良いかもしれません
 ↑↑↑↑↑↑よければクリックをお願いします↓↓↓↓↓↓