
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";だけにしてみると、スペースが空き、改行はされないものの表示されます。
初歩的な質問かとは思いますが、教えていただければと思います。よろしくお願いします。
No.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)
No.2
- 回答日時:
> しかし何故か、上書きされて、最終的に表示されません。
> 試しに、m_Total+="\n";だけにしてみると、スペースが空き、改行はされないものの表示されます。
との事ですので"\r\n"では改行されていると思われます。
上書きされているのではなくて、別の理由で思う結果が出ていないのでしょう。
エディットボックスに垂直スクロールバーを付ければ
何かわかるかもしれませんよ。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) python コードについて(初学者です) 3 2023/07/20 14:44
- C言語・C++・C# 現在プログラムを作っているのですが、実行したときに写真のように結果が表示されるのですが、これを CH 2 2023/01/18 16:22
- PHP PostgreSQLからCSV形式でエクスポートする際にカラム内の改行をとる方法 1 2023/02/22 10:05
- Visual Basic(VBA) Excel VBAの解読について質問があります。 概要は、マクロでチェックボックスにチェックすると日 1 2023/02/10 07:50
- Excel(エクセル) RANK.EQとCOUNTIFSの組み合わせで同ポイントの場合、違う条件を加えて順位を付けたい。 1 2022/08/30 19:49
- Visual Basic(VBA) ファイル全てを .xlsm に変更したところ、プログラムが途中で落ちてしまっています 17 2022/12/07 12:03
- 統計学 統計分析とExcelに詳しい方、何卒よろしくお願いいたします。 6 2022/05/27 10:30
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 1 2023/01/23 11:02
- PHP PHP MySql ページング 2 2022/09/20 06:38
- Visual Basic(VBA) VBA 請求書自動作成 3 2022/04/24 01:58
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルでアルファベットか数...
-
VBAでの Replace関数で、ワイル...
-
EXCELで=より左の文字を一括で...
-
【Excel VBA】複数ある特定の文...
-
16表記の文字列を数字に直した...
-
VBA2005 16進を2桁で表示したい。
-
変数に入れた文字列(定数)で書...
-
OnTime 使用時のプロシージャへ...
-
文字列からタブコードを取り除...
-
エクセルで文字列の最大値を抽...
-
LEFT関数で文字数を指定しない...
-
Excelで3E8を3.00E+8にしない方...
-
エクセルVBAで特定の文字列が見...
-
ヒアドキュメントのEOLとEOMの違い
-
C++のdefine文の使い方の質問で...
-
漢数字に変換するプログラム
-
C# 巨大な文字列の計算をさせたい
-
Excelで指数表現しないようにす...
-
アクセスで特定の数字以外(複...
-
bashスクリプトでの文字列から...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルでアルファベットか数...
-
EXCELで=より左の文字を一括で...
-
文字列からタブコードを取り除...
-
VBAでの Replace関数で、ワイル...
-
エクセルで文字列をtxtファイル...
-
【Excel VBA】複数ある特定の文...
-
エクセル 数値データを桁をそ...
-
Excelで3E8を3.00E+8にしない方...
-
VBA2005 16進を2桁で表示したい。
-
エクセルで文字列の最大値を抽...
-
同一セル内に関数と文字列を同...
-
Left関数とRight関数を合わせた...
-
Excelで指数表現しないようにす...
-
MS SQLServer のSQLで文字列の...
-
VBの「As String * 128」とは?
-
エクセルでセル内の文字列の最...
-
ORCLEでの小数の表示方法の変更...
-
bashスクリプトでの文字列から...
-
LEFT関数で文字数を指定しない...
-
アクセスで特定の数字以外(複...
おすすめ情報