- 1 名前:デフォルトの名無しさん [2008/12/26(金) 00:43:36 ]
- Microsoft Foundation Classライブラリ専用スレです。
前スレ ■MFC相談室 mfc19d.dll■ pc11.2ch.net/test/read.cgi/tech/1207301867/
- 419 名前:デフォルトの名無しさん mailto:sage [2009/03/11(水) 17:32:03 ]
- >>416
> ・グローバル関数だし、 > ・コメントないし、 コミュニケーション能力重視とか、ヒューマンスキル重視の現場では、 ありがちだ。 業務で引き継ぐと悲惨なパターン。 しかも極端な場合、グローバル変数の名前が「i」なんて場合もある。 > ・for(;;)だし・・・ (while() 使えよ) 個人的には「while(1)」の方が好みだけど、「for(;;)」の方が推奨 されているらしい。 しかし、「for(;;)」を使いながら、forループ内で「if(...) break;」 はやめてほしい。
- 420 名前:デフォルトの名無しさん mailto:sage [2009/03/11(水) 22:46:05 ]
- >>419
>しかし、「for(;;)」を使いながら、forループ内で「if(...) break;」 そりゃ無茶や。 全く脱出しないループで外部から殺してもらうってことなら兎も角、 ループ内の何かの事象で脱出したくなることくらいあるだろよ。
- 421 名前:デフォルトの名無しさん mailto:sage [2009/03/11(水) 22:52:57 ]
- >>416
while(1)はMS-C V6がwarning吐いてたから、おれはfor(;;)使うよ。 >>420 そういう場合forに脱出条件を入れろという説がある。 おれは基本的に嫌いだけどね。
- 422 名前:デフォルトの名無しさん mailto:sage [2009/03/11(水) 23:05:32 ]
- for (;;) {
...; someStatus = someFunction(); if (someStatus) break; ...; ...; } -- よくありがちなこんなコードを否定するのかな?
- 423 名前:デフォルトの名無しさん mailto:sage [2009/03/11(水) 23:25:55 ]
- someStatus が いつか必ず TRUE になるという保証があるなら、かまわんのでは。
無限ループの可能性を残すコードを、おれ個人は書かないけど。
- 424 名前:デフォルトの名無しさん mailto:sage [2009/03/11(水) 23:30:58 ]
- for (;;)の正しい使い方が良くわからないからMFCのソースの中探してみたけど
やっぱfor (;;)とbreakはセットで使ってるね 以下VC6のMFC SRC\AFXMEM.CPP(322): for (;;) SRC\AFXMEM.CPP(371): for (;;) SRC\APPUI1.CPP(172): for (;;) SRC\ARCCORE.CPP(816): for (;;)
- 425 名前:デフォルトの名無しさん mailto:sage [2009/03/11(水) 23:35:02 ]
- 下らない疑問かもしれませんが質問させてください。
MFCでコントローラに追加した文字列のメモリ管理ってどうなってるんでしょうか? 例えば、以下のような場合、FuncA()関数を抜けたときに strのアドレス先のメモリが解放されて、コンボボックスで strの文字列が参照できなくならないのでしょうか? 試したところ問題ないようですが、不思議です。 void FuncA() { CString str; m_pCmbBox->AddString(str); //メンバ変数であるコンボボックスに文字列追加 }
- 426 名前:デフォルトの名無しさん mailto:sage [2009/03/11(水) 23:45:01 ]
- コントロールが別のところでメモリを割り当ててるのさ。メモリの割り当てに失敗したら
CBN_ERRSPACE が通知されてくる。 これはMFCの質問じゃないな。
- 427 名前:デフォルトの名無しさん mailto:sage [2009/03/11(水) 23:50:26 ]
- >>426
すみません、もう一歩だけお願いします。 調べるなら、C++のメモリ管理で調べればいいでしょうか?
- 428 名前:デフォルトの名無しさん mailto:sage [2009/03/11(水) 23:51:14 ]
- フォントなんかが参照不能になるのは
描画のタイミングが関数抜けた後だから 文字列は渡し終わってるから問題なし
- 429 名前:デフォルトの名無しさん mailto:sage [2009/03/12(木) 00:10:04 ]
- >>426, 428
まとめるとこうでしょうか。 ・コントローラに文字列を渡すと、コントローラが新たにメモリを割り当てる。 ・この場合、関数を抜けた後も、描画タイミングで割り当てられたメモリが参照されるので問題なし ただしフォントの場合は、メモリ割り当てが行われない(?)ので、関数を抜けると参照不能 コントローラのメモリ管理について調べてみます。 ありがとうございました。
- 430 名前:デフォルトの名無しさん mailto:sage [2009/03/12(木) 00:18:04 ]
- どうでもいいけど「コントローラ」ってなんだよ。
controllerじゃなくてcontrolだぞ。
- 431 名前:デフォルトの名無しさん mailto:sage [2009/03/12(木) 00:28:17 ]
- >>430
訂正thx。気をつけますw
- 432 名前:デフォルトの名無しさん mailto:sage [2009/03/12(木) 00:44:32 ]
- >ただしフォントの場合は、メモリ割り当てが行われない(?)ので、関数を抜けると参照不能
これは単にスコープの問題
- 433 名前:デフォルトの名無しさん mailto:sage [2009/03/12(木) 10:43:00 ]
- スコープの問題じゃなくて、寿命の問題。
スコープが外れても寿命が続くのなら大丈夫。 だから例えば、staticでも(一代限りは)使える。
- 434 名前:デフォルトの名無しさん mailto:sage [2009/03/12(木) 20:06:01 ]
- フォントって、CFontクラスやCBrushクラス等のGDIオブジェクトをローカル
変数で作成したなら、関数を抜けた時点で変数の寿命が尽き、DeleteObject() を呼んでいなくてもデストラクタから(メンバ変数のm_hObjectを使って)強制 的にDeleteObject()が呼び出され、(GDIオブジェクトとそのハンドルが)破棄 される。 CFont *pFont=new CFont; などとやった場合、ポインタ変数の寿命が尽きても、newしたオブジェクト 自体はdeleteはされないので、プロセス終了まで、紐が切れた凧のように メモリ空間に残る。 95系だとプロセス終了でも解放されず、リソースリークになるんだっけか? static で宣言したオブジェクトでも、 if(s_FontStatic.GetSafeHandle()) s_FontStatic.DeleteObject(); s_FontStatic.CreateFontIndirect(...); と破棄する手順を踏めば、何回でもリサイクルできる。
- 435 名前:デフォルトの名無しさん mailto:sage [2009/03/14(土) 02:34:29 ]
- CMFCToolbar上にStatic Textを作成できないですかねぇ・・・
- 436 名前:デフォルトの名無しさん mailto:sage [2009/03/14(土) 10:05:36 ]
- >>435
CMFCToolbar って、CDialogBar よりも美味しいの? スタティックテキスト相当な機能なら、わざわざウィンドウを置かなくても CString型のメンバ変数を追加して、ツールバーの描画処理を自前でやれば いいだけのような肝。
- 437 名前:デフォルトの名無しさん mailto:sage [2009/03/17(火) 23:37:17 ]
- >>435
つCStatic::Create
- 438 名前:デフォルトの名無しさん [2009/03/22(日) 15:54:16 ]
- ダイアログ上のコントロールのタブオーダーが一つ前のコントロールIDを調べるにはどうしたらいいんですか?
例えばCEditが10個並んでいるとして、5番目のタブオーダーのCEditにフォーカスがある時に、 4番目のタブオーダーのコントロールIDを調べたいんですが。 "タブオーダー MFC"でググってもタブオーダーを変更する方法しか見つからなくて。 タブオーダーがらみのAPIって無いんですかね?
- 439 名前:デフォルトの名無しさん mailto:sage [2009/03/22(日) 16:23:08 ]
- CWnd* pWnd = wndEdit.GetWindow( GW_HWNDPREV):
if ( pWnd->GetStyle() & WS_TABSTOP) UINT nID = pWnd->GetDlgCtrlID(); // こいつがそう。 else pWnd = pWnd->GetWindow( GW_HWNDPREV); 以下繰り返しってな感じで取得できないかな。 実際には while ループするほうがお得だろうが。
- 440 名前:デフォルトの名無しさん mailto:sage [2009/03/22(日) 17:14:26 ]
- >>439
どうもありがとうございます。 GW_HWNDPREVというのはウインドウのZオーダー順であるだけでなく、 Window上のコントロールのタブオーダー順でもあるんですね。
- 441 名前:デフォルトの名無しさん [2009/03/22(日) 21:59:09 ]
- C初心者スレで相手にされなかったので、質問させてください
MFCでアプリを作っているのですが、 動作確認のため、コンソールも起動しております。 _cprintf_sや_cscanf_s関数を使っているのですが、 _cscanf_s関数でバックスペースのキーを入力すると、 プログラムが無限ループで暴走してしまいます。 普通のscanf()関数のようにバックスペースで一つ前の文字を削除するには どうすればよいでしょうか?
- 442 名前:デフォルトの名無しさん mailto:sage [2009/03/22(日) 22:07:52 ]
- 暴走するようなもの使うな
- 443 名前:名無し募集中。。。 mailto:sage [2009/03/23(月) 09:08:39 ]
- MFCも使っているのかもしれないけど_cscanf_s関数ってMFCじゃないし
コンソールならダイアログにEditコントロールを置いて表示・入力するって感じになりそうだけど デバッグ表示だけならTRACEマクロが便利 値の入力は・・・ちょっと試すだけならブレイクポイントで値の代入とか
- 444 名前:デフォルトの名無しさん [2009/03/23(月) 21:24:49 ]
- いまさらながら、mfcおもしろいお。
詳しい説明書ないかお?
- 445 名前:デフォルトの名無しさん mailto:sage [2009/03/24(火) 10:07:58 ]
- SP1以降の解説か、まだないかもな。
- 446 名前:デフォルトの名無しさん mailto:sage [2009/03/24(火) 17:14:26 ]
- >>444
SP1非対応でよければMicrosoft Pressの「プログラミングVisual C++.NET Vol.1/2」 Vol.2の最後にちょろっと.NETの説明があるけど、それ以外はMFCの説明になってる
- 447 名前:デフォルトの名無しさん mailto:sage [2009/03/24(火) 20:59:37 ]
- 後はmfcのソース読んどけ、ってところだな。
ドキュメント化されていない情報が山ほどあるし。 別に全部目を通さなくても、疑問に思った箇所だけで十分。
|

|