2008年2月29日金曜日

フォーム遷移について

VBにてフォームを遷移(画面遷移)する上で次のような処理をすると
他の画面がバックに強制的に表示される場合がある
frm0から処理で
frm1.show()
frm1.visible = false
frm2.show()
とする方法を行うとfrm0が表示されずに
ほかの画面がバックに表示されることがある

次の方法を行うと解消された
frm0から処理で
frm1.show()
frm1.TopLevel = false
frm2.show()

画面遷移は本来こっちで行うほうが正しい?

2008年2月14日木曜日

VBの文字列

VBでマクロを書いていた時のこと
文字列の二重引用符で嵌りました…

VBで文字列を扱う場合二重引用符(")で囲みます
例:"文字列"

じゃー二重引用符はどうやって文字列で表現するのー!

C言語とかと一緒で (\")こんなんでいけるかな~と
まったくだめ…そのまま (\)が文字列として扱われやがった

こういうときはマイクロソフトさんで検索っと
ありましたありました。
「Visual Basic における文字列の基本」
http://msdn2.microsoft.com/ja-jp/library/ms234766(VS.80).aspx

二重引用符を続けて2回書けばよいんだそうで…(csvの仕様とそっくりやわ)
""""と書くと⇒ " として扱われる。

1つ勉強になりました。

.

2008年2月6日水曜日

Outlookで受信しか出来ない

Outlook2007を使っている知り合いに頼まれて調べてた。
OSはVistaです。

現象としてはメールの受信しか出来ない。
送信が出来ず、メールの削除も…てことらしい。

以下のようなメッセージボックスが操作するたびにでてくるねん。
「C: Users¥ユーザー名¥AppData¥Local¥Microsoft¥Outlook¥outlook.pstでエラーが検出されました。
outlookとすべてのメール処理機能を備えたアプリケーションを閉じてください。
そして、受信トレイ修復ツール(Scanpst.exe)を使用してファイルを診断し、
ファイル内のエラーを修復します。詳細については、受信トレイ修復ツールのヘルプを参照してください。」

受信トレイがぶっ壊れてます修復してくださいと。。。
とりあえずヘルプ開いて Scanpst.exe で検索。
修復ツール関連のヘルプが出てきました。

修復ツールは既定では以下のフォルダにインストールされているとのこと。
C:\Program Files\Microsoft Office\Office12\Scanpst.exe

Outlookをいったん閉じ
Scanpst.exe を実行して、後はメッセージボックスに表示されてた
C: Users¥ユーザー名¥AppData¥Local¥Microsoft¥Outlook¥outlook.pst
を選択して開始ボタンをクリックすればOK

勝手に調べてくれて別ウィンドウで修復しますかって聞かれるからそのまま修復してもらう

Outlookを起動し直せば完了っと

とりあえず動いてるっぽ。

ネットで調べたら、結構同様の現象が起こっている人が多いみたい。
Outlookが起動しないとか、同じように修復すれば動作するみたいですわ。

とりあえず以下参考サイト
http://support.microsoft.com/kb/881358/ja

http://office.microsoft.com/ja-jp/help/HA100758311041.aspx


個人的に Outlook 好きじゃないので
秀丸メール使ってます。エディタと一緒に使えるから使ってますw

MozillaのThunderbirdも好きやな~。
タグでメールを管理できるのが使いやすい
http://www.mozilla-japan.org/products/thunderbird/


フリーのメーラーも結構あるので試してみてもええかと

.

初期化の大切さ改めて実感

初期化していないがためのバグ
コンパイル時の最適化と合わさって
検出にえらい時間がかかってしまった…

問題になったコードの要点だけ抜き出してみた。
C++/CLIでは変数宣言すると勝手に初期化してくれるという
前提やのに。。。動いてなかってん。
------------------------
int i = 0;
for(i = 0; i < 20; ++i) {
int b; // ゼロで自動的に初期化されてるねん♪
b++;
printf("%d\n", b);// 必ず1が出力されることを期待
}
------------------------

ループの中で変数を宣言すると、毎回メモリ確保やん。
効率悪いってのでコンパイラが自動的にループの外で宣言してくれるねん。

↓コンパイル後はこのような意味のコードになってる
------------------------
int i = 0;
int b; // ゼロで自動的に初期化されてるねん♪
for(i = 0; i < 20; ++i) {
b++;
printf("%d\n", b);// 必ず1が出力されることを期待
}
------------------------
そりゃ期待する結果が得られるわけ無いやん…。


変数宣言時に初期化するように修正したコード
------------------------
int i = 0;
for(i = 0; i < 20; ++i) {
int b = 0; // 明示的にゼロで初期化してやった!
b++;
printf("%d\n", b);// 必ず1が出力されることを期待
}
------------------------

コンパイルするとこのような意味のコードになってる
------------------------
int i = 0;
int b; // ゼロで自動的に初期化されてるねん♪
for(i = 0; i < 20; ++i) {
b = 0; // ここが違う!
b++;
printf("%d\n", b);// 必ず1が出力されることを期待
}
------------------------
これで修正完了っと。
他にもコンパイル時の最適化はいろいろあるので覚えておいて損は無いかも。
WikiPedia「コンパイラ最適化」


教訓:
初期化し忘れで出たバグは非常に見つけ難い…(^^;
変数宣言時は初期化する癖をつけよう!

.

ラベル