SetWindowText()でエディットボックスに表示できない

[戻る]
ike 2004/04/21(水) 00:13:42
コマンド釦を押したときに
SetWindowText()でエディットボックスに表示させようと
したのですが空白になったまま表示ができません。
どうしたら表示できるでしょうか?
よろしくお願いします。


CEdit    m_edit;
void CSANPLE::OnOK() 
{
    m_edit.SetWindowText("あいうえお");
}


環境
MFC Appwizard(exe)
windows2000
vc++6.0

wood 2004/04/21(水) 05:32:24
「SetWindowText」を使う以外の回答です

クラスウィザードを使ってメンバー変数を追加
カテゴリを「値」、タイプを「CString」にし
設定したメンバ変数に
>("あいうえお")
をセットしてあげれば表示できるようになります

つまり 1つのコントロールIDに
2つのタイプ  (CEDIT、CString)
2つのメンバ変数(m_ce_xx、m_xx)
のようなことができます

ike 2004/04/21(水) 09:45:08
CString    m_edit1;を追加したんですけど
表示されませんでした。どうしてでしょうか?

CEdit    m_edit;
CString    m_edit1;

void CSANPLE::OnOK() 
{
    m_edit1="あいうえお";
}

sugar 2004/04/21(水) 10:13:29
m_edit1="あいうえお";

の後に、

UpdateData(FALSE);

が必要かと思われます。
(これって、DDXを使用してるんですよね?)

επιστημη [E-Mail] [HomePage] 2004/04/21(水) 10:13:31
じたばたする前に、まずボタンが押されたとき確かにそこに飛んできているかを
確認するのが先決かと。通常 SetWindowTextできないってのは考えにくいのです。

ike 2004/04/21(水) 10:25:40
AfxMessageBox("表示しました");をいれてやると
AfxMessageBox("表示しました");を実行したときに表示することができました。
しかしUpdateData(FALSE);の方は表示できませんでした。

CEdit    m_edit;
CString    m_edit1;

表示できた↓
void CSANPLE::OnOK() 
{
    m_edit1="あいうえお";
  AfxMessageBox("表示しました");
}


表示できない↓
void CSANPLE::OnOK() 
{
    m_edit1="あいうえお";
  UpdateData(FALSE);
}

シャノン 2004/04/21(水) 10:32:59
メンバ変数がコントロールに関連付けられてないってオチは…さすがにないよなぁ。
関連付けられてないとASSERTで落ちるはずだから…。

たく 2004/04/21(水) 10:36:34
MFCを使用したダイアログベースのアプリケーションだという前提で
ひとつ確認しておきたいんですが、

CEdit    m_edit;
CString    m_edit1;

というのは、ClassWizardで作成したものでしょうか?
つまり、AFX_DATA, AFX_DATA_MAPで管理されている
コントロールなのでしょうか?


たとえば、以下のコードは動作しますか?
void CSANPLE::OnButton2() 
{
    CString strEdit;
    m_edit.GetWindowText(strEdit);
  AfxMessageBox(strEdit);
}

ike 2004/04/21(水) 10:54:16
下記コード動作しました。
エディットボックスからデータ取得して
表示しました。

void CSANPLE::OnButton2() 
{
    CString strEdit;
    m_edit.GetWindowText(strEdit);
  AfxMessageBox(strEdit);
}

Hogehoge 2004/04/21(水) 12:50:15
>CEdit    m_edit;
>void CSANPLE::OnOK()   <- この名前って?
>{
>    m_edit.SetWindowText("あいうえお");
 >>> ここになにかないですか? <<< 
>}

もしかして表示確認する暇もなくダイアログを閉じているのでは?
 でも「空白になったまま表示ができません」ってあるしなぁ。


>表示できた↓
>void CSANPLE::OnOK() 
>{
>    m_edit1="あいうえお";
>  AfxMessageBox("表示しました");
>}

このソースではメッセージボックスは表示されても
エディットボックスの文字列はは更新されないはず。
何が「表示できた」のか???

Moge 2004/04/21(水) 12:57:41
きっとOnCtlColorで
pDC->SetTextColor( RGB( 255, 255, 255 ) );
とでもしてるんでしょ。

PATIO 2004/04/21(水) 13:21:48
長いプログラムでないのならいっその事全文公開してもらった方が
話が早いかも。
どうも、説明が不十分でまさにそこが悪いという所が表に出てきてないような
感じがします。
話の感じだとテストプログラムレベルの長さみたいだし、その方が良いような。
あまりにも長いというのであれば、仕方ないですけれどね。

ike 2004/04/21(水) 13:30:53
補足します
MFC Appwizard(exe)で作成したダイアログベースのアプリです。
OnOK()はデフォルトで作成される[作成]釦のことです。

ステップ実行で一行一行確認してます。
その結果(2)はAfxMessageBoxを実行したときに”あいうえお”が表示されます。

CString  m_edit1;
CEdit    m_edit;

(1)ダイアログ上にあるエディットボックスに”あいうえお”が表示がされない↓
void CSANPLE::OnOK()  
{
    m_edit.SetWindowText("あいうえお");
}


(2)
ダイアログ上にあるエディットボックスに”あいうえお”が表示できた↓
void CSANPLE::OnOK() 
{
    m_edit1="あいうえお";
  AfxMessageBox("表示しました");
}

ike 2004/04/21(水) 13:33:35
修正します。

OnOK()はデフォルトで作成される[作成]釦のことです。(間違い)

OnOK()はデフォルトで作成される[OK]釦のことです。(正解)

Jojy 2004/04/21(水) 14:23:16
m_edit.SetWindowText("あいうえお");
ここからステップインすると、
::SetWindowText(m_hWnd, lpszString);
を呼んでいると思いますが、
チャンとこのSetWindowTextが呼ばれていますか?
また、m_hWndは文字を表示したいエディットのハンドルになっていますか?

PATIO 2004/04/21(水) 14:52:39
あてずっぽですが、
(1)のパターンの時にダイアログ上に他のウインドウを重ねてからもう一度
外すと表示されているなんて言う落ちはないですよね。
だからどうしたといわれると困るんですが、
なんとなくそんな気がしたので。

Jojy 2004/04/21(水) 15:16:17
エディットに文字をセットした後に
何か時間のかかる処理をしていて、
OnOK関数を抜けていないのでは?
その場合、AfxMessageBoxを入れることで
WM_PAINTが処理されてエディットに表示できてるのでは?

プログラム全部載せるのがまずいなら、
現象が再現する簡易版を作って載せたほうが早いかも。

ryo改もDゥ 2004/04/21(水) 16:01:09
実際試してみたんですが・・・

ikeさんが表示できると言う方が表示できません><
表示できないほうは表示できるんですけど。

sugar 2004/04/21(水) 16:32:44
> CString  m_edit1;
> CEdit    m_edit;
> 
これをどうやって追加したかがとても気になる・・・

επιστημη [E-Mail] [HomePage] 2004/04/21(水) 17:06:10
うーん…メンバ m_edit と 実世界にあるedit-control 間
の関連がついてないんじゃないか?

r 2004/04/21(水) 18:37:22
全文公開は無理でも、CSANPLE::DoDataExchange() 関数の内容を晒せば解決の可能性は
高くなる。

怪傑ズバット 2004/04/21(水) 18:42:59
無駄にレス多いよね

wood 2004/04/21(水) 20:28:38
追加されてる場所確認
-------------------------------------------------------------
1.VIEWクラスヘッダの
class CXXXView : public CView
{
protected: // シリアライズ機能のみから作成します。
    CXXXXView();
    DECLARE_DYNCREATE(CXXXXView)

public:
    //{{AFX_DATA(CXXXXView)
    enum { IDD = IDD_XXXX_FORM };

この下あたりですか

-------------------------------------------------------------
2.VIEW.CPPの

void CXXXXView::DoDataExchange(CDataExchange* pDX)
{
    CView::DoDataExchange(pDX);
    //{{AFX_DATA_MAP(CSSMMNMTNView)
    DDX_Control(pDX, IDC_MTITLE, m_CE_MTITLE);

    DDX_Text(pDX, IDC_COPID, m_COP_ID); ←ここのようにリソースIDと
                        関連付けされているのはあります
                        か

手で追加しちゃダメだよ
-------------------------------------------------------------

あと別のボタンリソースを貼り付けてそのボタンのコーディングしてみてください

MFCの場合「OK」「CANCEL]ボタンは通常のボタンと違う動きしますから
もしかすると、そのままアプリ終わってませんか?

追加したメンバ変数は間違ってもDOCクラスじゃ無いですよね

wood 2004/04/21(水) 20:39:25
ごめん
途中読んでなかった
VIEWクラスは、ダイアログクラスと読み替えてください

>MFCの場合「OK」「CANCEL]ボタンは通常のボタンと違う動きしますから
>もしかすると、そのままアプリ終わってませんか?

ダイアログベースの場合は「OK」ボタン押した時点でアプリ終了してしまうのが
デフォルト動作になっているはずです

表示云々の前にアプリ終わっていると思いますがどうでしょうか?

ike 2004/04/22(木) 00:18:06
このコードをステップ実行でやったんですが
このコード自体を実行して確認しただけではだめなんですね。
このあと進むと表示ができました。


m_edit.SetWindowText("あいうえお");

RAPT 2004/04/22(木) 01:37:24
Windowsアプリケーションのしくみについての勉強が必要のようですね。
どの時点で描写がなされるのか、について。
コンソールアプリとの違い、など。

# 「コマンド釦」って表記は一般的なのだろうか?
# σ(^^)はどうせなら「コマンドボタン」ってそのまま表記しますが。
# もしくは単に「ボタン」と。

Hogehoge 2004/04/22(木) 21:06:34
結局最初のソースで何も問題なかったの?
何故えに「解決」してない?

# 「コマンド釦」ってここではじめてみました。HNはikeさんじゃなかったけど

古いスレッドには追加発言できません。