■MFC相談室 mfc20d.dll■at TECH
■MFC相談室 mfc20d.dll■ - 暇つぶし2ch419:デフォルトの名無しさん
09/03/11 17:32:03
>>416
> ・グローバル関数だし、
> ・コメントないし、

コミュニケーション能力重視とか、ヒューマンスキル重視の現場では、
ありがちだ。 業務で引き継ぐと悲惨なパターン。

しかも極端な場合、グローバル変数の名前が「i」なんて場合もある。

> ・for(;;)だし・・・ (while() 使えよ)

個人的には「while(1)」の方が好みだけど、「for(;;)」の方が推奨
されているらしい。

しかし、「for(;;)」を使いながら、forループ内で「if(...) break;」
はやめてほしい。

420:デフォルトの名無しさん
09/03/11 22:46:05
>>419
>しかし、「for(;;)」を使いながら、forループ内で「if(...) break;」
そりゃ無茶や。
全く脱出しないループで外部から殺してもらうってことなら兎も角、
ループ内の何かの事象で脱出したくなることくらいあるだろよ。

421:デフォルトの名無しさん
09/03/11 22:52:57
>>416
while(1)はMS-C V6がwarning吐いてたから、おれはfor(;;)使うよ。

>>420
そういう場合forに脱出条件を入れろという説がある。
おれは基本的に嫌いだけどね。


422:デフォルトの名無しさん
09/03/11 23:05:32
for (;;) {
...;
someStatus = someFunction();
if (someStatus) break;

...;
...;
}
--
よくありがちなこんなコードを否定するのかな?

423:デフォルトの名無しさん
09/03/11 23:25:55
someStatus が いつか必ず TRUE になるという保証があるなら、かまわんのでは。

無限ループの可能性を残すコードを、おれ個人は書かないけど。

424:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/03/11 23:35:02
下らない疑問かもしれませんが質問させてください。
MFCでコントローラに追加した文字列のメモリ管理ってどうなってるんでしょうか?

例えば、以下のような場合、FuncA()関数を抜けたときに
strのアドレス先のメモリが解放されて、コンボボックスで
strの文字列が参照できなくならないのでしょうか?
試したところ問題ないようですが、不思議です。

void FuncA() {
CString str;
m_pCmbBox->AddString(str); //メンバ変数であるコンボボックスに文字列追加
}

426:デフォルトの名無しさん
09/03/11 23:45:01
コントロールが別のところでメモリを割り当ててるのさ。メモリの割り当てに失敗したら
CBN_ERRSPACE が通知されてくる。

これはMFCの質問じゃないな。

427:デフォルトの名無しさん
09/03/11 23:50:26
>>426
すみません、もう一歩だけお願いします。
調べるなら、C++のメモリ管理で調べればいいでしょうか?

428:デフォルトの名無しさん
09/03/11 23:51:14
フォントなんかが参照不能になるのは
描画のタイミングが関数抜けた後だから
文字列は渡し終わってるから問題なし

429:デフォルトの名無しさん
09/03/12 00:10:04
>>426, 428
まとめるとこうでしょうか。
・コントローラに文字列を渡すと、コントローラが新たにメモリを割り当てる。
・この場合、関数を抜けた後も、描画タイミングで割り当てられたメモリが参照されるので問題なし
 ただしフォントの場合は、メモリ割り当てが行われない(?)ので、関数を抜けると参照不能

コントローラのメモリ管理について調べてみます。
ありがとうございました。

430:デフォルトの名無しさん
09/03/12 00:18:04
どうでもいいけど「コントローラ」ってなんだよ。
controllerじゃなくてcontrolだぞ。

431:デフォルトの名無しさん
09/03/12 00:28:17
>>430
訂正thx。気をつけますw

432:デフォルトの名無しさん
09/03/12 00:44:32
>ただしフォントの場合は、メモリ割り当てが行われない(?)ので、関数を抜けると参照不能
これは単にスコープの問題

433:デフォルトの名無しさん
09/03/12 10:43:00
スコープの問題じゃなくて、寿命の問題。
スコープが外れても寿命が続くのなら大丈夫。
だから例えば、staticでも(一代限りは)使える。

434:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/03/14 02:34:29
CMFCToolbar上にStatic Textを作成できないですかねぇ・・・

436:デフォルトの名無しさん
09/03/14 10:05:36
>>435
CMFCToolbar って、CDialogBar よりも美味しいの?

スタティックテキスト相当な機能なら、わざわざウィンドウを置かなくても
CString型のメンバ変数を追加して、ツールバーの描画処理を自前でやれば
いいだけのような肝。


437:デフォルトの名無しさん
09/03/17 23:37:17
>>435
つCStatic::Create

438:デフォルトの名無しさん
09/03/22 15:54:16
ダイアログ上のコントロールのタブオーダーが一つ前のコントロールIDを調べるにはどうしたらいいんですか?
例えばCEditが10個並んでいるとして、5番目のタブオーダーのCEditにフォーカスがある時に、
4番目のタブオーダーのコントロールIDを調べたいんですが。

"タブオーダー MFC"でググってもタブオーダーを変更する方法しか見つからなくて。
タブオーダーがらみのAPIって無いんですかね?

439:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/03/22 17:14:26
>>439
どうもありがとうございます。
GW_HWNDPREVというのはウインドウのZオーダー順であるだけでなく、
Window上のコントロールのタブオーダー順でもあるんですね。

441:デフォルトの名無しさん
09/03/22 21:59:09
C初心者スレで相手にされなかったので、質問させてください

MFCでアプリを作っているのですが、
動作確認のため、コンソールも起動しております。
_cprintf_sや_cscanf_s関数を使っているのですが、

_cscanf_s関数でバックスペースのキーを入力すると、
プログラムが無限ループで暴走してしまいます。

普通のscanf()関数のようにバックスペースで一つ前の文字を削除するには
どうすればよいでしょうか?

442:デフォルトの名無しさん
09/03/22 22:07:52
暴走するようなもの使うな

443:名無し募集中。。。
09/03/23 09:08:39
MFCも使っているのかもしれないけど_cscanf_s関数ってMFCじゃないし
コンソールならダイアログにEditコントロールを置いて表示・入力するって感じになりそうだけど
デバッグ表示だけならTRACEマクロが便利
値の入力は・・・ちょっと試すだけならブレイクポイントで値の代入とか

444:デフォルトの名無しさん
09/03/23 21:24:49
いまさらながら、mfcおもしろいお。

詳しい説明書ないかお?

445:デフォルトの名無しさん
09/03/24 10:07:58
SP1以降の解説か、まだないかもな。

446:デフォルトの名無しさん
09/03/24 17:14:26
>>444
SP1非対応でよければMicrosoft Pressの「プログラミングVisual C++.NET Vol.1/2」
Vol.2の最後にちょろっと.NETの説明があるけど、それ以外はMFCの説明になってる

447:デフォルトの名無しさん
09/03/24 20:59:37
後はmfcのソース読んどけ、ってところだな。
ドキュメント化されていない情報が山ほどあるし。
別に全部目を通さなくても、疑問に思った箇所だけで十分。


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch