鏑矢の憂鬱2000年6月前半
透明1ドットイメージ
 
2000/06/01 (Thu)
・今日も書くことないから、昨日日記の方で書いたことをちょっと。アプリを作る場合にはまずクラス設計してそのあと実装ってのがべたな方法ですが、わて的にはクラス設計って、楽しんでできる場合とできない場合があるんです。
 
・クラスって基本的には道具だから、誰かが作ることを考えるわけです。普通のアプリだと、メンテ性や可読性、再利用性なんかを考えて設計するわけだけど、それって「誰のため」なんでしょー(汗)。わては小説でもイラストでもなんでも、楽しんでもらう相手っていうのを想定してから作ります。男向け女向け、若年層向け中年層向け。 Codian だったら初心者向けみたいにね。
 
・そーゆーのを考えずにクラス設計するのって、かなり無茶だと思う(汗)。「今の自分たち」向けなのか「将来の自分たち」向けなのか、それとも「他の誰か向け」なのか。「すべてのプログラマー向け」でもいいんだけど、それならそれで全クラス統一しなきゃいけない。「あ、ここは自分用に使いやすくしよう」とか考えちゃいけないわけですな。そーゆーのってやりがいがあるとか通り越して無謀っぽい(汗)。
 
・まーこれは楽しめないクラス設計ですね。逆に KTL みたいにライブラリ作る場合には、しっかりとしたターゲッティングができるから作ってて楽しいです。テンプレートや STL が大好きな人向け(爆)。ソースコード直接見て、クラスを継承やテンプレートを使って組み込んでいく。こーゆーのは「うわっすげえ」「便利〜」「使えねぇ……」みたいな「声」が聞こえてくる感じで楽しいです。
 
・ま、要するに方向性がないと楽しくない、ってことかな。普通のアプリのクラス設計でも「複数パートで行うから」とか「長期プロジェクトだから」とか「移植可能性があるから」とかがしっかり決まってればなんとか方向性が決まるのかも。ま、方向を決めるってことは、向いてない方は捨てるってことになるから、それを実務でやるのは難しいのかもしんないけどね。でも「儲かる方向」で決めれば問題ないような気も(爆)。
 
・でわまたっ!
透明1ドットイメージ
 
2000/06/02 (Fri)
・今日はぷらとわを4分の3書きました。たぶん明日完成。今日書いた分は、ポインタを引数に使うって部分。それに絡めて参照も。アドレス操作の機能を引数に使う場合には、いっそのことアドレスって概念を取っ払った方が分かりやすいから参照が作られた、みたいなこと書こうと思ってます。
 
・プログラミングとは直接関係ないけど、「文章の書き方」みたいなメルマガ書こうかなとか思ってるんだけど、どう?
 
・でわまたっ!
透明1ドットイメージ
 
2000/06/03 (Sat)
・今日は昨日書きかけで終わったぷらとわを完成させました。いまさらながら、参照に & 演算子使っても、参照先のアドレスしか返らないことを知る(爆)。こんなとこまで複製的なんだなー。まーその分教えやすいかも。
 
・次の回で const 参照とかについて書いたあと、予告してたこの前のをやってみようと思ってます。つってもそんときの質問全部に答えるにはかなり先になっちゃうけど(汗)。まずコントロールまわりしっかりやってからファイルに、みたいに予定してるんで。久々にウィンドウズっぽいこと書けるなー。
 
・でわまたっ!
透明1ドットイメージ
 
2000/06/04 (Sun)
・今日はお休み(汗)。まー毎週のことだけど……。
透明1ドットイメージ
 
2000/06/05 (Mon)
・今日の授業は情報理論。でもよく憶えてない(汗)。一応、確率統計まわりの証明が中心なんで、プログラミングに活用できる感じではないなー。そんな感じ。
 
・でわまたっ!
透明1ドットイメージ
 
2000/06/06 (Tue)
・今日はお休み。う”。
透明1ドットイメージ
 
2000/06/07 (Wed)
・今日の授業は信号処理論。今日は「相関関数」とゆーものをやりました。たとえば「あー」ってゆー声の場合、ある波が一定間隔でずっと続きます。そーゆー「続きぐあい」を調べるのが「自己相関関数」ってゆーもの。実際には波形を自分自身にずらしつつ重ねて、そのずれ具合と増幅具合で「どの間隔なのか」ってゆーのを調べるらしいです。つまりまだよく分からない(汗)。
 
・これは確か、近々プログラムを組んでレポートとして提出せなあかんので、今のうちくらいからやっとこうと思います。いちおー、去年に作ってうまくいった(らしい)のがあるんで、それをまた読み直して作り直してって感じになると思います。それにしても去年のコード、かなり中途半端に STL を使ってるんで見るに耐えない(汗)。がーっ、 STL アルゴリズムと for ループを混在されても!
 
・でわまたっ!
透明1ドットイメージ
 
2000/06/08 (Thu)
・今日はお休み〜。
透明1ドットイメージ
 
2000/06/09 (Fri)
・今日もお休み(汗)。なんか休みまくってますなー。
透明1ドットイメージ
 
2000/06/10 (Sat)
・今日は前に言ってた信号処理論のプログラムを組んでました。つっても去年すでに組んであって、それのブラッシュアップをするだけなんだけど(汗)。
 
・さてさてさて。ひとつの行に3つのデータ、それが1000行、とかのファイルがあったとします。これを STL と iostream を使って取り出す場合、どーしたらいーのかってゆー問題をかなり前から考えてます。わての場合は、 std::istream_iterator のカスタマイズクラスを作ってとびとびの値を取り出してたりしてました。
 
・よく考えたら「ふたつずつ読み取るイテレータークラス」が作れるなーと思って色々試してるうちに挫折(爆)。いやね、作ること自体は簡単なんだけど、汎用性を追求しちゃうともーどーにもならなくなっちゃって。たとえば reverse_iterator 。「イテレーターの要素の型」を取得する場合、クラスイテレーターとポインタとで使える方法が違うでしょ。前者は iterator::value_type があるけど後者はない。 SGI 版の reverse_iterator はその部分をうまく吸収するシステムが備わってるけど、 VC についてる HP 版は備わってない。
 
・まーこれは VC のコンパイラに「特化テンプレート」が対応してないってのが最大の原因なんだけどね。っつーわけで、実は「イテレーターのラッパー」を作る場合、ターゲットを限定しなきゃいけなかったりするんだよね。 STL 使ってると、そーゆーのが許せない(爆)。なんでつまづいてしまいました。 STL を使うってことは、そーゆーことを一番大事にする、ってことかな、ってことだけ、ここに書いたこと全然分かんなかった方は憶えといて(爆)。
 
・でわまたっ!
透明1ドットイメージ
 
2000/06/11 (Sun)
・今日はお休み。毎週日曜はお休みですな。むぅ。
透明1ドットイメージ
 
2000/06/12 (Mon)
・今日の授業は情報理論……だけど憶えてない(爆)からお便りを紹介しましょう。まずひとつめ。
 
透明1ドットイメージ
透明1ドットイメージ
 このHPでのアドバイス、一生懸命探して参考にさせてもらっています。
 
 で、今回は私の質問を宜しくお願いいたします。
 
 今作っているプログラムは、リストボックス1に表示されているファイルの中から選択されたファイルを、リストボックス2に表示するというものです。
 
 このリストボックス1から、リストボックス2に送る際に、Shiftキーを押せば連続選択、Ctrlキーを押しながらクリックすれば、離れた場所も選択できるという機能をつけたく、ご相談をいたしました。宜しくお願いいたします。
 
 この、リストボックス1からリストボックス2に送る際には、ボタンを利用しています。
透明1ドットイメージ
透明1ドットイメージ
 
・どうもですー。つまりエクスプローラーみたいな機能を付けたいんですよね。えっと、ダイアログエディタで、ダイアログに貼り付けたリストボックスのプロパティを開いて「スタイル」ページの「選択」を「マルチ」にしてみてください。これでエクスプローラーみたく選択できるはず。
 
・どの項目が選択されてるかは、 MFC なら CListBox::GetSelItems() を使う……んだと思う(汗)。 API だと LB_GETSELITEMS を送ればいいのかな? 実際の使い方については、こーゆーものを goo とかで検索して、使用例探してみてくださいです。試してみてうまくいかなかったらまたここ来ればいいんだし。
 
・もひとつお便り。
 
透明1ドットイメージ
透明1ドットイメージ
 すみません。先程質問をしたばかりなのですが、もう1つ宜しくお願いします。
 
 ダイアログベースでプログラムを作った場合に、複数ダイアログを作って、後から追加した方を最初に画面に表示をさせたいのです。どうすれば良いでしょうか?
 
 それと、このダイアログは別々に新しくクラスを作った方が良いのでしょうか?
 
 宜しくお願いいたします。
透明1ドットイメージ
透明1ドットイメージ
 
・「後から追加した」っていうのは、リソースの「挿入」とか使って追加したってことですよね。えっと、プロジェクトの中に「プロジェクト名.cpp 」ってファイルがあると思うんで開いてください。その中の「プロジェクト名App::InitInstance() 」っていうメンバ関数があると思います。そのここの部分を見てください。
 
	CT_DlgJunk15Dlg dlg;   // ここで「作成するダイアログのクラス」を指定。
	m_pMainWnd = &dlg;
	int nResponse = dlg.DoModal();
	
 
・ここのダイアログクラスを後から追加したダイアログのクラスにすれば、後から追加したダイアログがまず表示されるはず。ってことは、追加したダイアログのクラスは作らなきゃダメってことですな。この辺の話は #pragma twice の No.026 から No.028 を見るともっとよく分かるかもしんない。あーでも m_pMainWnd とかちょっと複雑な部分もあるかなー。そーゆーのも含めて、分かんないとこあったらまた訊きに来てください。
 
・でわまたっ!
透明1ドットイメージ
 
2000/06/13 (Tue)
・今日はお休み。なんか日によって量に差があるなぁ……。
透明1ドットイメージ
 
2000/06/14 (Wed)
・今日は3限の信号処理論。とーとープログラムを組むレポートが発表。同じなんで大丈夫だろうなー。
 
・さて、今日のお便り。
 
透明1ドットイメージ
透明1ドットイメージ
 6月12日に質問を掲載していただいたものです。その節は大変お世話になりました。
 
 前回質問した。ShiftやCtrlを使っての選択が上手くいきません。選択された部分の色が反転するなどは、希望通りなのですが、表示が最後に選んだ1つしかできません。
 
 色々試行錯誤してはみたのですが、選択ができなくなってしまったりと、思うようにいきません。
 
 また、新たな質問なのですが、コンボボックスに、コンストラクタなどを利用して、フォルダ内のフォルダ一覧を表示したいのですが、どうフォルダ名を取得すれば良いのでしょうか。
 
 それど、ダイアログベースで作っている場合でも、コンストラクタと呼ばれる場所にあたる部分のクラスは、関数と同じ名前がついた場所で良いのですよね?
 
 長くなってしまいましたが、宜しくお願いいたします。
透明1ドットイメージ
透明1ドットイメージ
 
・どうもですー。むむー、複数選択なんでできないんだろう。ダイアログを「テスト表示」(メニューの「レイアウト」−「テスト」)してみてその段階でも複数選択できるか確認してみてください。もしできなかったら……うーむ。できたら、表示後にスタイルを変えちゃってるのかなぁ。普通に(テストじゃなく)ダイアログ表示して、 SPY++ でリストボックスのスタイル見てみてください。「ウィンドウスタイル」に LBS_MULTIPLSET があるかどうか見てみて。なかったら、どっかでスタイルが変えられちゃってるんだなー。
 
・フォルダの取得は API の FindFirstFile() と FindNextFile() を使います。これ使うと特定のフォルダの全ファイルを取得できます。で、取得した WIN32_FIND_DATA の中の dwFileAttributes のフラグが FILE_ATTRIBUTE_DIRECTORY のものがディレクトリだから、それだけをコンボボックスに表示すればOK。使用例は goo とかに FindFirstFile とかかけてみれば見つかると思うです。
 
・「コンストラクタと呼ばれる場所にあたる部分のクラスは、関数と同じ名前」は「コンストラクタと呼ばれる場所にあたる部分の関数は、クラスと同じ名前」ですよね。そうです。「ダイアログ」とか「ウィンドウ」っていうのはウィンドウズの機能。「クラス」とか「コンストラクタ」っていうのは C++ 言語の機能。このふたつは完全に独立してるから、別々に考えましょう。あーでも「完全に」ってのは言い過ぎかなぁ。でも「どっからが C++ の機能で、どっからがウィンドウズの機能」ってことをはっきりするのは大事。この辺もぷらとわに書いたはずだから読んでみてねん。
 
・でわまたっ!
透明1ドットイメージ
 
2000/06/15 (Thu)
・今日の授業は電子回路。つってもプログラミングには関係ないですな(汗)。
 
・昨日のちょっと補足。昨日「ファイル列挙は FindFirstFile() で」って書いたけど、 Codian 読者だと「 IShellFolder 系は?」とか思うかもしんないですね。基本的にはトレードオフの関係にあります、このふたつは。 FindFirstFile() は使うの楽。 IShellFolder はメモリ管理にえらい気を使います。これは COM インターフェイスなら当然なんだけど、なんせ IShellFolder はいっぱいインスタンス作ることが多いんで。 _com_ptr_t 使っても辛いかなー。
 
・ IShellFolder 系のメリットは、マイコンピュータやコントロールパネルも開けること。んでも逆に FindFirstFile() はネームスペースに惑わされないってゆー点がメリットにもなります。 desktop.ini がちゃんと見えるし。ちなみに「アイコンがー」とかそーゆー部分は、フルパスから ITEMIDLIST に変換すればいいんだからこの問題とは別ね。言い換えると、だいたいを FindFirstFile() でやって、ネームスペースまわりだけ IShellFolder でってゆー荒技もできます。コードはかなり大変そうだが(汗)。
 
・でわまたっ!
 
 
(C)KAB-studio 2000 ALL RIGHTS RESERVED.