たびたびすみません、macです。
VC++で作成したプロジェクトにmsword9をインクルードして、
ワードの.doc形式で保存するプログラムを作成しています。
そこで、2つのテキストボックスを追加するために以下のようなコードを
追加しました。
** ここから
// 一つ目のテキストボックスを作成
Range cRange = m_cSelection.GetRange();
Shapes cShapes = m_cDocument.GetShapes();
Shape cShape = cShapes.AddTextbox(msoTextOrientationHorizontal, 200, 150,
500, 45, &_variant_t(cRange));
// テキストボックスの選択
cShape.Select(&_variant_t(true));
// 文字列の記述
TextFrame cTextFrame = cShape.GetTextFrame();
cRange = cTextFrame.GetTextRange();
cRange.SetText(文字列の記述);
// テキストボックスの選択を解除
cShape.Select(&_variant_t(false));
// 二つ目のテキストボックスの作成
// テキストボックスの作成
cShape = cShapes.AddTextbox(msoTextOrientationHorizontal, 500, 400, 200, 60,
&_variant_t(cRange));
* ここまで *****
これを実行すると、二つ目のテキストボックスを作成するときに
「指定したレンジは、作業中の文書、またはストーリーに基づくものではありませ
ん。」
というエラーメッセージが出てしまいます。
テキストボックスの選択状態を解除するだけではなく、Anchorも解除しなくては
ならないのでしょうか?
その場合、どのようにAnchorを解除すればよいでしょうか?
どなたかご教授お願いします。
開発環境
WindowsXP VC++6.0 Office2000
あてずっぽうです。
一つ目が上手く行くのでしたら、
もう一個 cRange を作ってみては?
// 二つ目用に新たに作る。
cRange = m_cSelection.GetRange();
// 二つ目のテキストボックスの作成
...
dairygoods様、回答ありがとうございます。
一つ目のテキストボックスの選択を解除後、
cRange = m_cSelection.GetRange();
を追加してみましたがうまく動作しませんでした。
同じエラーメッセージが出力して、終了します。
> // テキストボックスの選択を解除
> cShape.Select(&_variant_t(false));
これ、変ですね。
引数は、追加選択か排他選択かのフラグですから、
これを使って選択解除はできません。
ですから、その後で Selection.GetRange しても、
やっぱりテキストボックスの Range が得られてしまいます。
Word には恐らく「何も選択していない」という状態は
ないでしょうから、選択解除ではなく、
文書上にフォーカスをあててから、Selection.GetRange するのでしょう。
しかし、そんな回りくどいことはしなくても、
Document.Range で、現在のフォーカスに関係なく
文書の Range が得られますから、それを使えば良いのでは。
dairygoods様、回答ありがとうございます。
文書にフォーカスを当てて試してみたところ、うまく動作しました。
ありがとうございました。
修正したコードを添付します。
ここから ****
// 一つ目のテキストボックスを作成 ----------
// 文書のRangeを取得
Range cRange = m_cDocument.Range(COleVariant((long)0), COleVariant((long)
0));
cRange.Select();
Shapes cShapes = m_cDocument.GetShapes();
Shape cShape = cShapes.AddTextbox(msoTextOrientationHorizontal, 200, 150,
500, 45, &_variant_t(cRange));
// テキストボックスの選択
cShape.Select(&_variant_t(true));
// 題名を記述
TextFrame cTextFrame = cShape.GetTextFrame();
cRange = cTextFrame.GetTextRange();
cRange.SetText(文字列の記述1);
// フォーカスを文書の先頭に戻す
// 文書のRangeを取得
cRange = m_cDocument.Range(COleVariant((long)0), COleVariant((long)0));
cRange.Select();
// 二つ目のテキストボックスを作成 ----------
// テキストボックスの作成
cShape = cShapes.AddTextbox(msoTextOrientationHorizontal, 200, 300, 200, 60,
&_variant_t(cRange));
// テキストボックスの選択
cShape.Select(&_variant_t(true));
// 題名を記述
cTextFrame = cShape.GetTextFrame();
cRange = cTextFrame.GetTextRange();
cRange.SetText(文字列の記述2);
ここまで **********