プロが教えるわが家の防犯対策術!

WindowsのPCにてMFCを使い、ダイアログボックスを作成しています。
ダイアログボックスの中にエディットボックスを作成したのですが、複数行、改行許可の項目を両者ともチェックしたのにも関わらず、改行してくれません。
表示内容は、以下のループで取得し、
while(m_isize > 0)
{
BYTE ch = m_Data[m_nPos];
if(isalnum(ch))
{
m_Ascii += ch;
}
else
{
m_Ascii += " ";
}
m_Dmy.Format("%02X", ch);
m_Dmp +=m_Dmy;
m_nPos++;
m_isize--;
if((m_nPos%16)== 0)
{
m_Addr.Format("%08X:", m_nPos-16);
SetDump();
m_Dmp = " ";
m_Ascii =" ";
}
m_Total+=m_DmpLog;
m_Total+= "\r\n";
}
m_Total(CString)が取得した値を、エディットボックスで表示します。
しかし何故か、上書きされて、最終的に表示されません。
試しに、m_Total+="\n";だけにしてみると、スペースが空き、改行はされないものの表示されます。
初歩的な質問かとは思いますが、教えていただければと思います。よろしくお願いします。

A 回答 (3件)

nanami_wic さん、はじめまして。



上げていただいたソースの内容を見た限り、おそらくバッファ(m_Data[])の中身を16バイト毎に
下記のようなフォーマットでダンプ表示させる処理部分だと解釈しました。
 <ダンプ表示のフォーマット>
 XXXXXXXX: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XXXXXXXXXXXXXXXX
  ↑       ↑                                  ↑
 アドレス   16進文字列でのダンプ                      ASCII文字のダンプ

上記の前提でソースを少し変更してみました。
・関数 SetDump() をダンプ文字列編集用の関数だと解釈してその部分も追加してみました。
・エディットボックスへの文字列追加の部分も追加してみました。
※下記ソースにおいて、"//## ~~~~~" となっている部分はオリジナルソースでの変更前
の表記です。

/*
* 【メイン部分】
* ※予め、m_Data[] にダンプ元のデータ、m_isize にデータの総バイト長が
* セットされているものとします。
*/
void Cxxxxx::DumpOut()
{
m_nPos = 0;
m_Ascii = "";
m_Addr = "";
m_Dmy = "";
m_Dmp = "";
m_DmpLog = "";
m_Total = "";

while(m_isize > 0)
{
BYTE ch = m_Data[m_nPos];
//## if(isalnum(ch))
if((ch >= 0x20) && (ch <= 0x7f)) //ASCIIコードの 0x20~0x7f まではそのまま表示
{
m_Ascii += ch;
}
else //それ以外は '.' (ピリオド)で表示
{
//## m_Ascii += " ";
m_Ascii += ".";
}
//## m_Dmy.Format("%02X", ch);
m_Dmy.Format("%02X ", ch); //16進文字2桁+スペース
m_Dmp +=m_Dmy;
m_nPos++;
m_isize--;

//## if((m_nPos%16)== 0)
if(((m_nPos%16) == 0) || (m_isize == 0)) //16バイト毎およびデータ末尾の時にダンプ文字列編集
{
//## m_Addr.Format("%08X:", m_nPos-16);
m_Addr.Format("%08X:", ((m_nPos-1)/16*16)); //表示アドレスを16バイト単位に補正
SetDump(); //ダンプ文字列編集
m_Total+=m_DmpLog;
m_Total+= "\r\n";
//## m_Dmp = " ";
//## m_Ascii =" ";
m_Dmp = "";
m_Ascii ="";
}
//## m_Total+=m_DmpLog;
//## m_Total+= "\r\n";
}
SubAddDump(); //エディットボックスへのダンプ文字列追加
}

/*
* SetDump : ダンプ文字列編集
*/
void Cxxxxx::SetDump()
{
CString strWkDmp(' ', (16*3)); //16進ダンプエリアの表示幅のスペース文字列を作成
CString strWkAsc(' ', 16); //ASCIIダンプエリアの表示幅のスペース文字列を作成
strWkDmp = m_Dmp + strWkDmp;
strWkAsc = m_Ascii + strWkAsc;
strWkDmp = strWkDmp.Left((16*3)); //16進ダンプ文字列を作成(表示幅に満たない部分はスペース充填)
strWkAsc = strWkAsc.Left(16); //ASCIIダンプ文字列を作成(表示幅に満たない部分はスペース充填)
m_DmpLog = m_Addr + " ";
m_DmpLog += strWkDmp;
m_DmpLog += strWkAsc;
}

/*
* SubAddDump : エディットボックスへのダンプ文字列追加
*/
void Cxxxxx::SubAddDump()
{
// "m_ctrEdit2" はダンプ表示用のエディットボックスに対応づけた
// CEditコントロールのメンバとします。
int nLine = m_ctrEdit2.GetLineCount(); //エディットボックスの行数を取得
int nCulm = m_ctrEdit2.LineIndex(nLine-1); //最終行の先頭の文字インデックスを取得
int nStartChar = nCulm;
int nEndChar = nStartChar;
m_ctrEdit2.SetSel(nStartChar, nEndChar, FALSE); //エディットボックスの最後の文字位置をセレクト
m_ctrEdit2.ReplaceSel(m_Total, FALSE); //セレクト位置にダンプ文字列を挿入
}

以上です。参考になれば幸いです。
因みに自分の環境(Windows98+Visual C++ 5.0 ・・・古いですが^_^;)でテストして動作確認しています。
nanami_wic さんのお使いの環境でも上手くいけば良いのですが...(ダメだったら御免なさい。m(__)m)
    • good
    • 0

> しかし何故か、上書きされて、最終的に表示されません。


> 試しに、m_Total+="\n";だけにしてみると、スペースが空き、改行はされないものの表示されます。

との事ですので"\r\n"では改行されていると思われます。
上書きされているのではなくて、別の理由で思う結果が出ていないのでしょう。

エディットボックスに垂直スクロールバーを付ければ
何かわかるかもしれませんよ。
    • good
    • 0

 こんにちは。



 ダイアログエディターのエディットボックスプロパティで、「複数行」の項目にチェックが入っているかどうかを確認してみて下さい。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!