鏑矢の憂鬱2001年2月前半
透明1ドットイメージ
 
2001/02/01 (Thu)
・今日はお休みしまーす。
透明1ドットイメージ
 
2001/02/02 (Fri)
・今日もお休み〜。
透明1ドットイメージ
 
2001/02/03 (Sat)
・今日もお休み。っつーか今週2回しか書いてないぞ(汗)。今はお便りがないと書いてないから、それでお客さんが減ってさらにお便りが減るっつー悪循環状態。むー。でも(何度言ったか分かんないけど)4月までにうちかぶとか WTL に移行したいなーとか思ってるんで。
 
・でわまたっ!
透明1ドットイメージ
 
2001/02/04 (Sun)
・今日もお休み(泣)。まー卒論はかなり終わってるんで<どっちの意味?
 
・でわまたっ!
透明1ドットイメージ
 
2001/02/05 (Mon)
・今日はお便りがみっつ。ではひとつめのお便り。
 
透明1ドットイメージ
透明1ドットイメージ
 VC(ベンチャーキャピタル)について教えてください。
透明1ドットイメージ
透明1ドットイメージ
 
・ベンチャーキャピタル( Venture Capital )っていうのは「起業家向け投資家」のこと。ちょっとアイディア浮かんだから、それに誰か投資しませんかーって呼びかけて、それに応えて資金提供してくれるのがベンチャーキャピタル。ベンチャーキャピタルは「投資」なんで、起業した会社が株式を公開した時の利ざやを利益にしようとたくらんでます。
 
・でもベンチャーキャピタルってちょっと前までアメリカと日本とじゃかなり違ったからなー。アメリカはお金だけじゃなくて経営とかに思いっきり関わってきて、情報公開をしっかりしないと信用してくれないっていう結構厳しいのなんだけど、今の日本の現状はちょっと分からないです。ベンチャーキャピタルそのものの知名度とかは上がってるんだろうけど、不況だから数は減ってそうな気がする……。
 
・うちのガッコにも SVBL っていうのがあって、アイディアコンテストみたいなのやってます。前行ったときは高専から編入してきた人がかなりすごいのを持ってきてて「こりゃかなわんわ」とか思った(爆)。個人的には、特許取ってくれる部署作った方がいいんじゃないかなーとか思うんだけどねぇ。
 
・もひとつお便り。
 
透明1ドットイメージ
透明1ドットイメージ
 KABさんお久しぶりです。
 卒論、就職準備と、いろいろ大変でしょうが頑張って乗り切ってください。
 以前に数回質問したことがある「いその」と申します。
 素朴な疑問で申し訳無いのですが、このページのドメインは
 
www.kab-studio.com
 
 と独自のものを持っておられますよね。
 URLのドメインを最も安上がりで、簡単に取得できる方法があれば教えていただけませんか。お願いします。
透明1ドットイメージ
透明1ドットイメージ
 
・あ、そういえばこのドメインのことってちゃんと書いてなかったですね。うちのはジャストネットMYドメインパックっていうのです。初期費用1万円、月々3900円。ほむぺ容量25Mにメールアドレスが5個、 Perl の CGI が使えて、そしてダイヤルアップが使い放題なんで、家で普通にインターネットしてホームページ持ってて、それでドメイン取りたいって人にはかなりお勧め。
 
・元々わてはジャストネットの会員で、1年前くらいにこのサービスが始まった時に即入会(爆)。ずっとドメイン取ろう思ってたし、そのときは初期費用がキャンペーンでタダだったし、なによりジャストネット会員はものすごく簡単な手続きでできたんですよ。だから乗り換えだとちょっと手間はかかるかな。でも安いのは安いと思うし、今のところわてはまったく不満がないです。あ、入会時のこととかはチョー普通な日記2000年1月24日とか2月9日とかにも書いてあるんでそちらも参考に。
 
・もひとつお便り。
 
透明1ドットイメージ
透明1ドットイメージ
 ウイザードで作ったSDIのプログラムでツールバーに項目を追加して実行したら淡色になってしまいます。
 どの場所でどうやって有効にするかわかりません
 教えてください
透明1ドットイメージ
透明1ドットイメージ
 
・ただ有効化させるだけなら、ハンドラ関数を作るだけでOK。 ClassWizard ダイアログの【メッセージ マップ】のページで、【オブジェクト ID 】をそのツールバーの項目の ID にして、【メッセージ】から COMMAND をダブルクリック。そうすると、その項目を押したときに呼ばれるメンバ関数(=ハンドラ関数)が作られます。で、これだけで有効になると思います。手動でするならこんな感じ。
 
BOOL CMainFrame::OnCmdMsg
	(UINT nID, int nCode, void* pExtra
	, AFX_CMDHANDLERINFO* pHandlerInfo) 
{
	if	(  pHandlerInfo == NULL 
		&& nID == ID_B 
		&& nCode == CN_UPDATE_COMMAND_UI )
	{
		CCmdUI* pCmdUI = (CCmdUI*)pExtra;
		pCmdUI->Enable( TRUE );
		return TRUE;
	}

	return CFrameWnd::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo);
}
	
 
・参考ページは Codianメニューを動的に追加する(後編)。っつーか仕組み忘れてた(爆)。この「無効化システム」は、メニューやツールバー問わず、コマンド ID に対して行うんで基本的にはメニューと同じなんですね。この辺は、 MFC 複雑やなーと思うところ。むぅ。
 
・でわまたっ!
透明1ドットイメージ
 
2001/02/06 (Tue)
・今日もお便り紹介。
 
透明1ドットイメージ
透明1ドットイメージ
 こんにちは。ずっと、プログラムの勉強しています。
 それで、すごく急ぎで聞きたいというか、お願いしたいのですが。ほんとにわがままなのですが、今、あるフォルダを見に行って、その中のある文字列を検索して、置換するソフトを作りたいのですが、、、
 エクスプローラ風でフォルダを見に行くとこまでは作ったのですが、そのフォルダのなかで、txtとかcppとかhとかを指定してその中の文字列の検索、置換の仕方がわかりません。どのようにして作ればよいのでしょうか?教えてください。できれば、ソースとかで教えてほしいのですが、、、
 おねがいします。
透明1ドットイメージ
透明1ドットイメージ
 
・フォルダを見に行くってことは、 FindFirstFile() とか CFileFind とかでファイルを列挙するとこまではできたのかな。ってことはファイルを開いて置換すればいいんですよね。置換か〜、最近は Perl ですること多いからちょっと苦手かも。あ、でも MFC 使っていいならこんな簡単にできます。
 
void ReplaceWithMfc()
{
    CStdioFile cStdFile( "A.txt", CFile::modeReadWrite );
    CString cStr;
    char chTemp[256];
    while( cStdFile.ReadString( chTemp, 255 ) )
    {
        cStr += chTemp;
    }

    cStr.Replace( "あいう", "えお" );
    cStdFile.SeekToBegin();
    cStdFile.WriteString( cStr );
}
	
 
・ CStdioFile っていうクラスでファイルを開いて、ファイルの中身を cStr に詰め込みます。あとは CString::Replace() で一発置換。んで書き込めば完了。っつーかこれは CString が便利なんだな。 std::string にも replace() があるんだけど、これはちょっと便利でないし。
 
・ライブラリ使わないでって場合だと……そうだなー、C言語による最新アルゴリズム事典の strmatch.c が「文字列からの検索」をするのだから、これにファイルの読み書きと置換機能を加えれば大丈夫かな。ファイル入出力は#pramga twiceの 074.mmag とかを参考にしてみてください。書き換え自体は結構一般的だから、アルゴリズム関係の本やサイトの方が詳しいかもしんない。
 
・でわまたっ!
透明1ドットイメージ
 
2001/02/07 (Wed)
・ XML を使ってみよう企画第2弾。 MSXML3 を本体と SDK をダウンロードしてインストールして、サンプルをとりあえずビルド。うん、とりあえず動いてます(汗)。 XML がちゃんと木構造になってるかチェックしてるのかな。どういう COM を使ってどういうことしてるのか調べないと。でもやっぱ、 VC でやれるっていーわ(爆)。使い慣れてるからねぇ。
 
・今日のお便り!
 
透明1ドットイメージ
透明1ドットイメージ
 リストコントロールを作りました。  リソースエディタで貼り付けたのに変数をつけて(m_FileList)InitDialogでCreateし、下記のようにしたら表示することが出来ました。
 
// イメージリストの初期化
_imgList.Create(IDB_IMG01, 60, 4, 0xffffff);

CBitmap bmp;
bmp.LoadBitmap(IDB_IMG02);
_imgList.Add(&bmp, 0xffffff);

bmp.DeleteObject();
bmp.LoadBitmap(IDB_IMG03);
_imgList.Add(&bmp, 0xffffff);

    char pszText[MAX_PATH];
    sprintf(pszText, "ふぁいる %d %s", i, ex);
    LVITEM item;
    item.mask = LVIF_IMAGE | LVIF_TEXT | SS_NOTIFY;
    item.iItem = i;
    item.iSubItem = 0;
    item.state = LVIS_ACTIVATING;
    item.stateMask = LVIS_SELECTED;
    item.pszText = pszText;
    item.cchTextMax = sizeof(item.pszText);
    item.iImage = 1;
    item.lParam = 0;

    m_FileList.InsertItem(&item);   // クラスメンバ CListCtrl
	
 
 でも、クラスウイザードで作った
 
void C??Dlg::OnItemdblclickFileList (NMHDR* pNMHDR, LRESULT* pResult)
 
 これが呼び出されません。
 いったいどうしたらいいのでしょうか?
透明1ドットイメージ
透明1ドットイメージ
 
・どうもですー。基本的に HDN_ITEMDBLCLICK がオーナーウィンドウ(つまりダイアログ)に送られることはないみたいです。いわゆる「そーゆー仕様」ってヤツ。これは直接の親ウィンドウ、つまりリストコントロールに送られてきちゃうんです。だからダイアログじゃ受け取れないとゆー。しゃーないんでサブクラス化するしかないですな。
 
・つっても MFC はコントロールのサブクラス化が簡単にできます。まず ClassWizard の【クラスの追加】−【新規】で【基本クラス】を CListCtrl にしてクラス名は適当に、ここではとりあえず CNewLstCtrl にして、このクラスを追加。 C(プロジェクト名).cpp とC(プロジェクト名)Dlg.cpp で NewLstCtrl.h をインクルードしてから m_FileList の型を CNewLstCtrl に変更。
 
・こうすることで自動的にリストコントロールを乗っ取って、 CNewLstCtrl のウィンドウプロシージャでメッセージを処理できるようになります。というわけでこのクラスで OnItemdblclick() を作れば……とはいかなくて、 ClassWizard で WindowProc() をオーバーライド。その中でこんなふうにしてください。
 
LRESULT CNewLstCtrl::WindowProc
    (UINT message, WPARAM wParam, LPARAM lParam) 
{
    if( message == WM_NOTIFY 
      && ((LPNMHDR)lParam)->code == HDN_ITEMDBLCLICKW )
    {
        // こんなかで処理。
    }

    return CListCtrl::WindowProc(message, wParam, lParam);
}
	
 
・なんで HDN_ITEMDBLCLICKW じゃないといけないんだろう(汗)。プロジェクトは Unicode 指定してないのに。どっかで設定できるのかなー。ま、そういうわけでこうやってリストコントロールの中で HDN_ITEMDBLCLICKW を拾えばダブルクリックを関知することができますです。うーん、ウィンドウズって複雑やねぇ。
 
・でわまたっ!
透明1ドットイメージ
 
2001/02/08 (Thu)
・今日はお便りがふたつ。ではひとつめのお便り。
 
透明1ドットイメージ
透明1ドットイメージ
 asamです。質問ではありませんが……。
 2月6日のかぶゆ〜の感想です。
 
 私は「C言語による最新アルゴリズム事典」の本を持っていますがソースコードがvectorにあるのは知りませんでした。で、早速ダウンロードしました。
 良い情報どうもありがとうございました。
 
 ではまた!!
透明1ドットイメージ
透明1ドットイメージ
 
・そうなんですよねー、普通に売ってある本のソースコードが置いてあるっていうのは結構ビックリかも。確かCodianオフライン版を置くとしたらどこかなーって調査してるときに見つけたんだと思う。あ、そういえばオフライン版更新しないと。
 
・もひとつお便り。
 
透明1ドットイメージ
透明1ドットイメージ
 教えてください
 
1、ClassWizard で CListCtrl を継承した
  クラス CListCtrlEx をつくりました
 
2、ダイアログに張り付いているリストビューに
  メンバ変数を作成しました
 
3、ClassWizard で OnItemdblclick と、
  PreCreateWindow などをオーバーライドしました
 
 実行してみるとオーバーライドした関数が呼ばれません
 
 WindowProc をオーバーライドして、ダブルクリックのイベントを取得しようとしたのですが出来ませんでした
 
if (message == WM_NOTIFY &&
    ((LPNMHDR)lParam)->code == HDN_ITEMDBLCLICK)
{
    ここにこない
}
	
 
 OnItemdblclick と、PreCreateWindowの処理をするにはいったいどうしたらいいか教えてください
 
 サブクラス化の方法が間違っているのでしょうか?
 手順か、サンプルの提示をお願い致します
透明1ドットイメージ
透明1ドットイメージ
 
・あ、 CNewLstCtrl::PreCreateWindow() って呼ばれないですね。たぶんこれは、 CNewLstCtrl がリストコントロールを作るんじゃなくて、元からあるリストコントロールにサブクラス化するから呼ばれないんだと思うです。 CWnd::PreSubclassWindow() は呼ばれるけど、これじゃあんまり役立たないかな……。あと HDN_ITEMDBLCLICK じゃなくて HDN_ITEMDBLCLICKW みたいです。
 
・あと、それ以外の原因っていう可能性も。2の後にしとかなきゃいけないことがあるんです。2の2「ダイアログに張り付いているリストビューにメンバ変数を作成しました」のメンバ変数は、 (プロジェクト名)Dlg.h の中でこんなふうに宣言されてるでしょ。
 
class C(プロジェクト名)Dlg : public CDialog
{
// 略

// ダイアログ データ
    //{{AFX_DATA(CMy20010207Dlg)
    enum { IDD = IDD_MY20010207_DIALOG };
    CListCtrl    m_FileList;    // ここ!!
    //}}AFX_DATA

// 略
};
	
 
・この CListCtrl を、 ClassWizard で作ったクラス CListCtrlEx に書き換えちゃうんです。昨日「m_FileList の型を CNewLstCtrl に変更」って言ったことね。これを忘れててもうまくいかないから注意してくださいです。
 
・でわまたっ!
透明1ドットイメージ
 
2001/02/09 (Fri)
・今日はぷらとわとかなゆ〜を書いてました。なんか結構ショックなんだけど、今は TRACE() にまんま CString を渡せるみたいですね(汗)。 VC6 からそうなってるらしいんだけど、全然知らなかった……。
 
・今日のお便り!
 
透明1ドットイメージ
透明1ドットイメージ
 IEnumIDList のメソッド Reset() って成功しないんですか?
 
#include "shlobj.h"

LPSHELLFOLDER pshf;
if(SHGetDesktopFolder(&pshf) != NOERROR) return;

LPENUMIDLIST penumIDList;
if(pshf->EnumObjects
      (NULL
      , SHCONTF_FOLDERS|SHCONTF_NONFOLDERS
      |SHCONTF_INCLUDEHIDDEN
      , &penumIDList) != NOERROR){
   pshf->Release();
   return;
}
if(penumIDList->Reset() != NOERROR){
   penumIDList->Release();
   pshf->Release();
   return;
}
	
 
 MSDN ライブラリ(IEnumIDList::Reset)には
「Returns NOERROR if successful,…」
(成功すれば NOERRORを返す)
 って書いてあるのに、NOERROR を返すためしがありません。
 
 デスクトップ以外で、バインドしたシェルオブジェクトでも試してみましたが、 NOERROR は返してくれませんでした。
透明1ドットイメージ
透明1ドットイメージ
 
・ホントですね、 E_NOTIMPL が返ってきてるってことは実装されてないってことで、これじゃ「場合によっては成功する」ってことはないのかも。っつーか検索しても実際に使ってる例ないし(爆)。結局は Reset の代わりに IEnumIDList を作り直すとか Clone() するとかしかないかも。
 
・でわまたっ!
透明1ドットイメージ
 
2001/02/10 (Sat)
・今日もお便り紹介!
 
透明1ドットイメージ
透明1ドットイメージ
 お返事ありがとうございました!
 RegViewサンプル見たらCEnumIDList::Reset() で現在位置更新して S_OK 返してるだけなんで、こんなのなんでエラーやねん!ってやる気失せてました。おかげですっきり!
 
 いまメモリ管理でハマってます。
 MFC使いたい〜
透明1ドットイメージ
透明1ドットイメージ
 
・…… COM ってソースコードが公開されてたなんて知らなかった!!(爆) そっか、 IShellFolder なら CShellFolder で検索すればいいんだ、これならかなり楽に使えるなー。あ、でも CShellFolder::SetNameOf() みたいに実装されてないのもあるなー、バージョンアップで実装されてるってこともあるだろうし、参考程度にしといた方がいいかも。それにしてもこれを知っとけば、前に書いたときかなり助かっただろうなぁ……。
 
・でわまたっ!
透明1ドットイメージ
 
2001/02/11 (Sun)
・今日はお休み〜。
透明1ドットイメージ
 
2001/02/12 (Mon)
・今日はお便り紹介〜。
 
透明1ドットイメージ
透明1ドットイメージ
 まいどお世話になっておりますしげきおです。
 どうもどうもいつもいつもありがとうございます。とても助かっています。おかげさまで順調に進んでおります。
 で、今回はメッセージの質問なのですが、OnButton1()は、こんなふうに書いてありますが、
 
ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
	
 
これにメッセージを投げてもいいものなのでしょうか?
 例えば
 
class CParentDlg : public CDialog
{
public: CParentDlg(){} ~CParentDlg(){}
protected:
    void OnInitDialog(){CChildDlg dlg; dlg.DoModal();}
    void OnButton1(){〜処理〜}
};

class CChildDlg : public CDialog
{
public: CChildDlg(){} ~CChildDlg(){}
protected:
    void OnButton2(){GetParent()->PostMessage
        (WM_BN_CLICKED, IBC_BUTTON1);}
};
	
 
 こんなことしてもいいのでしょうか?
 それと、PostMessage(の引数を教えていただけませんか?
透明1ドットイメージ
透明1ドットイメージ
 
・メッセージ送るのはOK。こういうのは結構しますね。「PostMessage(の引数」ってつまりこの場合どういう引数渡せばいいのかってことですよね。こういう通知メッセージは WM_COMMAND として送ってその LPARAM の上位2バイトに通知メッセージを入れて送ります。こんな感じに。
 
void Test( CDialog *p_pcDlg )
{
    p_pcDlg->PostMessage
        ( WM_COMMAND
        , MAKEWPARAM( IDC_BUTTON6, BN_CLICKED )
        , (LPARAM)GetDlgItem
            ( p_pcDlg->GetSafeHwnd()
            , IDC_BUTTON6 ) );
}
	
 
・メッセージは WM_COMMAND 。 WPARAM の下位2バイトにボタンの ID 、上位2バイトに通知メッセージの BN_CLICKED を入れます。 LPARAM はそのボタンのウィンドウハンドル。普通システムから送られてくるんでこんだけいたれりつくせりだけど、自分で送ると面倒だな〜。あ、あと通知メッセージとしてじゃなく、 WM_LBUTTONDOWN と WM_LBUTTONUP でもOK。
 
void Test( CDialog *p_pcDlg )
{
    p_pcDlg
        ->GetDlgItem( IDC_BUTTON6 )
        ->PostMessage( WM_LBUTTONDOWN );
    p_pcDlg
        ->GetDlgItem( IDC_BUTTON6 )
        ->PostMessage( WM_LBUTTONUP );
}
	
 
・左ボタンを押して離すってゆーのをさせるわけです。 WPARAM と LPARAM を省略すると 0 が渡されるんだけど、別にボタンのウィンドウのどこを押してもちゃんと押されるんでこれで大丈夫でしょう。通知メッセージ使うよりもこっちの方が自然でいいかもしんない。
 
・でわまたっ!
透明1ドットイメージ
 
2001/02/13 (Tue)
・今日もお便り紹介〜。
 
透明1ドットイメージ
透明1ドットイメージ
 こんにちは。いつもお世話になってます。
 質問ですが、VC++ のリソースエディタで、ダイアログへ貼り付けることのできるリソース数(制限)を変更する方法を知りたいのですが。
 新規ダイアログを作成し、コントロールを貼り付けていたら、突然、新たなコントロールを貼り付けることができませんでした。数えたら、255個までが限界らしいのですが、この制限を変更する方法は、ないのでしょうか?
 よろしくお願いします。
透明1ドットイメージ
透明1ドットイメージ
 
・うわホントだ、こんな制限があったとは……。見た感じ、これを変更できる設定とかはなさそうです。たぶん中でハードコーディングされてるんじゃないかなぁ。コントロールの個数を unsigned char に入れてるとか。
 
・面倒で遠回りな解決策はあります。ひとつはリソースを直接書き換えちゃうこと。(プロジェクト名).rc をテキストモードで開いて直接コントロールを書き加えて、増えた分だけ resource.h にも ID を加えておけばOK。もうひとつの方法は動的生成。 Create() すれば普通にできるんで。前者は Perl とかで、後者は for ループとかで自動処理しちゃえばある意味楽かもしんない。
 
・でわまたっ!
透明1ドットイメージ
 
2001/02/14 (Wed)
・今日はぷらとわを書いてました。今回はコンボボックスの話。書くネタに困らないのは、ウィンドウズの仕様が複雑だからかも(爆)。アプリを使う側からしてみれば、開発者ってのはある程度知ってなきゃってゆーのあるわけで、でもだからって研修で Platform SDK 熟読したりはしないんだろうなぁとか思ったり。もしそういう試験制度があったら司法試験並みに難しいかも(爆)。
 
・はっ、今日はこれだけ(爆)。お便り募集中だよん。
 
・でわまたっ!
透明1ドットイメージ
 
2001/02/15 (Thu)
・今日はちょっとだけ MSXML Parser を使ってみました。にダウンロードしたのね。今はそのとき一緒にダウンロードしたサンプルの解析が中心。「サンプルがクラスってやだなー」とか思ってたんだけど、オーバーライド使ったイベントハンドラとして実装しなきゃいけない仕組みになってるんでクラスとして作らないといけなかったとゆー(汗)。
 
・サンプル解析してみて分かったこと。 ISAXContentHandler がイベントハンドラとして呼び出される仕組みになってます。開始タグに出遭うと startElement() が呼ばれて、閉じタグに出遭うと endElement() が呼ばれるとゆー。ってことはたぶんその中身で呼ばれるメソッドがあるんだなきっと。仕組み的には分かりやすいかも。
 
・分かりにくいこと…… Unicode (泣)。文字列がすべて wchar_t で実装されてるんでかなりめんどい話になってます。うちは Win98 だから OutputDebugStringW() 実装されてないし。 char に変換して出力する TRACE() もどきを作るかなー、それより WTL プロジェクトを立ち上げてそれでテストしていった方がいいかも。
 
・でわまたっ!
 
 
(C)KAB-studio 2001 ALL RIGHTS RESERVED.