こんにちは、環境はWinXP VC7 MFC SDIです。
何度も同じような質問で恐縮です。
リストコントロールでLVITEM構造体を使ってITEMを登録するとき
メンバ変数のLPTSTR pszTextにCStringのインスタンスの文字列をコピーしたいのですが
型が違うためできません。
ここのサイトにCStringからcharの変換が紹介されていたので今は一度
charに変換してからpszTextに代入しています。
CStringからcharに変換
(引用です)
CString str = test;
char *p = new char[str.GetLength()+1];
strcpy( p, str );
delete [] p;
一応これで問題なく動くのですが
CStringが使えるLVITEMに似たものとか、もっと簡単にCStringからLPTSTRに直接
変換できる方法があれば教えて頂けないでしょうか。
GetBufferをつかうとか、、、
http://www.microsoft.com/JAPAN/developer/library/vcmfc/_mfc_cstring.3a3a.getbuf
fer.htm
ありがとうございます。
GetBufferでうまくいきました
それで、疑問に思ったのですが、
CDocで宣言している
private:
CString str;
を同じCDocの
public:
CString Getstr(void)
{
return str;
}
という関数を使って別のクラスから扱っていたのですが
LPTSTR pszText;
pszText=pDoc->Getstr().GetBuffer();
とやると
pszTextを表示させた時にフフフフフフフフ等と文字化けしてしまいます、
それを
LPTSTR pszText;
CString str2=pDoc->Getstr();
pszText=pDoc->str2.GetBuffer();
とやるとうまくいったのですがなぜでしょうか?
キャストしたの方が簡単だと思います。
item.pszText = (LPTSTR)(LPCTSTR)str;
> private:
> CString str;
>
> public:
> CString Getstr(void)
> {
> return str;
> }
これでは、strは一時的にCString型を返しますので、
> LPTSTR pszText;
> pszText=pDoc->Getstr().GetBuffer();
とやった時点で、一時的に pszText に LPCTSTR 型のものが
入ります(const_castした方が望ましいけど。)が、この行を
通過した後に、pDoc->Getstr().GetBuffer(); はインスタンス
が消滅しますので、pszText の指し示す先は未定義になります。
> pszTextを表示させた時にフフフフフフフフ等と文字化け
1バイトカナでフフフとなるのは、VC++でデバッグモードの時、
未定義の領域であることを示しています。
そこで、そのような場合は、
CString str2=pDoc->Getstr();
と、インスタンスに値を代入した後、
LPTSTR pszText;
pszText=pDoc->str2.GetBuffer(0);
等とします。
str2は、GetBuffer()した後、次のCStringのメンバ関数を使用
する前に、ReleaseBuffer()し忘れないようにして下さい。
また、pszTextで、値を変更しないのであれば、
LPTSTR pszText;
pszText=const_cast<LPTSTR>(static_cast<LPCTSTR>(pDoc->str2));
等とするほうが便利です。
皆さんありがとうございます。
>キャストしたの方が簡単だと思います。
> item.pszText = (LPTSTR)(LPCTSTR)str;
こんな事もできるのですか、LPCTSTR等、よく理解してませんでした、、
やっぱりC,C++の基本をもっとやらないとダメですね。
> LPTSTR pszText;
> pszText=pDoc->Getstr().GetBuffer();
>とやった時点で、一時的に pszText に LPCTSTR 型のものが
>入ります(const_castした方が望ましいけど。)が、この行を
>通過した後に、pDoc->Getstr().GetBuffer(); はインスタンス
>が消滅しますので、pszText の指し示す先は未定義になります。
pszTxtはポインタなので指示すBuffをどこかにとっておかないといけなくて
関数の戻り値を代入するのではだめという事ですよね
とてもわかり易かったです。