2008年12月28日日曜日

コメントアウトマクロ、VisualStudio6.0 ( VS6 )

VS6には、複数行をまとめてコメントアウトする機能が用意されていない。
VS2003以降にはあって、これがなれると結構便利。
 
なので、VS6でも使いたい・・・と思い作ってみた。
---------------------------
Sub Comment ()
  ' Check a type of the active window
  Dim win
  Set win = ActiveWindow
    If win.type <> "Text" Then
      Exit Sub
    End If
 
  Dim CommentPos
  Dim CommentStr
  Dim StartRow
  Dim StopRow
  CommentPos = 0
  CommentStr = "//" ' Symbol of the comment
  StartRow = ActiveDocument.Selection.TopLine
  StopRow = ActiveDocument.Selection.BottomLine
  ' Get position to insert the symbol.
  For i = StartRow To StopRow
    ActiveDocument.Selection.GoToLine i
    ActiveDocument.Selection.SelectLine
    orgLen = Len( ActiveDocument.Selection )
    trmLen = Len( ActiveDocument.Selection )
    If CommentPos < ( orglen - trmLen ) Then
      CommentPos = orgLen - trmLen
    End If
  Next
 
  ' Add string of the symbol of comments to top of lines.
  For i = StartRow To StopRow
    ActiveDocument.Selection.GoToLine i
    ActiveDocument.Selection.SelectLine
        selLine = ActiveDocument.Selection
        fstHalf = Mid( selLine, 1, CommentPos )
        lstHalf = Mid( selLine, CommentPos + 1, Len( selLine ) - CommentPos + 1 )
        ActiveDocument.Selection = fstHalf + CommentStr + lstHalf
  Next
End Sub
---------------------------
2点注意
・コメント外しには対応していない
・コメント文字がコードの先頭でなく、行の先頭に来てしまうかも
・わけあって印刷したコードを手で打ち込んだので入力ミスがあるかも
 
以上。
 
Borland であったコード補完機能?を作ったら便利そうだなあ。
 
 

2008年10月23日木曜日

クラスのメンバをヘッダで初期化する

ますます C++ の忘れっぷりを痛感している今日この頃。
基礎だけど重要なことも飛んだりしている。例のごとくメモ。
定数には「#define」がよく使われているが、
あるクラス自体の定数など、内部でしか使わないものはそのクラスのメンバ変数にしておきたい。
ただ、コンストラクタとかメンバイニシャライザで初期化するのって面倒臭いし、
何よりもコードが読みにくいので出来る限りヘッダで初期化しておきたい。
・・・そんな時は以下!
 
-----------------
class Human{
private:
  // int 範囲の場合は enum で対処可能
  enum {
    m_eLegCount = 2,
    m_eArmCount = 2,
    m_eFingerCount = 5
  };
}
-----------------

int の範囲ならこれで。
ただ、文字列や配列もやりたい。
その場合はヘッダ ( .h ) では無理なので実装部 ( .cpp ) で初期化する。
 
-----------------
// .h file とする
class Human{
private:
  // ここで初期化したメンバは以下の宣言で使える
  enum {
    m_eMaxNameCount = 50
  }
  // メンバ定数分の配列を確保している
  // static の場合は外部で初期化できる
  static const char szName[m_eMaxNameCount];
}
// .cpp file とする
const char Human::szName = "Suzuki Ichiro";
-----------------

static なら、private でも外部で初期化できる。
また、ここで static の表記は不要。
 
以上。
 
 
 
 

2008年10月18日土曜日

別プロセスに文字列を渡す ( プロセス間通信? )

10月から、再びVC++の案件に携わっている。
約一年ぶりのVC++ということもあり、忘れていることが多くて悪戦苦闘の日々だ。
だが、それがいい。
 
さて、本題の「別プロセスへ文字列を渡す方法」だが、
凡ミスで1時間ほど無駄な努力をしてしまったので、メモしておく。
 
手法はいくつかあるが、今回は WM_COPYDATA というメッセージを使って実装したのだが、
何故か受信側が WM_COPYDATA を受け取ってくれなかった。
そのほかのメッセージは届くというのに!
 
で、よく調べてみたら SendMessage じゃないとメッセージが届かないということが判明。
PostMessage は、受信側の応答を待たずに送信側の処理が進むため、送信データの領域を開放するタイミングがわからないのが原因らしい。
メッセージ自体が届かないということが問題を切り分けしづらくして厄介だった。
 
 
 

2008年3月9日日曜日

Visio ソリューション開発テクニック

昨日に引き続き、MSDN にて知識吸収。
 
今日は普段あまり活用していない Visio について、使いこなせるようなヒントを得られればと思い、
「Visio ソリューション開発テクニック」というものを視聴した。
 
例によって、マインドマップにメモを取ったので公開しておく。

*「-」ボタンで縮小して、ドラッグしながら見られます

    

マイクロソフトの開発プロジェクト管理

今日は時間があったので MSDN のセミナーを覗いてみた。

過去のセミナーでオンライン化されているもののうち、面白そうなのがいくつかあった。
その中で「マイクロソフトの開発プロジェクト管理」っていうのがあったので視聴。
・・・なぜって、リアルタイムでまるで体制のなってないチームで仕事をしているので。。。

まぁ、特に変わったことは言ってなかったのだけど、これまでの経験で培ってきたものが間違ってはいないという確認ができた。
んで、せっかくマインドマップも作ったし(ただ見るだけだと頭に入ってこないから)、公開してみる。

なんというか、便利な世の中だ。 

*「-」ボタンで縮小して、ドラッグしながら見られます

   

2008年3月2日日曜日

VARIANT型について

VARIANT型について

VSFlexGridの関数の引数がVARIANTでlongをどう渡すかこまった。
しかし、vc++には_variant_tという便利なものがあった。
こんな感じ。

long lNum = 123;
hoge(_variant_t(lNum)); // hoge は関数
便利!

SQL server と unicode について

 

SQL Server 2005 Express

Ⅰ問題
MFC の CDatabase および CRecordset が Unicode に対応していない。
ExecuteSQL でクエリがANSIに変換されてしまう。

Ⅱ対応
MFC のクラスを以下のクラスに変更する
CDatabase → CDaoDatabase
CRecordset → CDaoRecordset

Ⅲ参考
http://support.microsoft.com/kb/139759/en-us
http://www.tech-archive.net/Archive/VC/microsoft.public.vc.mfc/2006-12/msg02521.html
http://objectmix.com/ado-dao-rdo-rds/49403-cdatabase-does-not-support-unicode.html