dポイントプレゼントキャンペーン実施中!

C++ Builder5で不思議な動きをしています。

StringGridで、OptionにgoEditingを操作し、修正不可のセットをしました。
StringGrid1->Options = StringGrid1->Options >> goEditing;

その後、StringGridのどこかのセルをクリックして、そのセルをスクロールバー
で隠したり表示したりすると、修正不可セット直前にカーソルのあったセルの
内容が現れてきます。

具体例を示すと、1行3列目にカーソルのある状態で、修正不可にセットします。
次に、5行5列目をクリックした後、スクロールバーでこのセルを見えない様に
StringGridをスクロールします。
再度、5行5列目が見えるようにスクロールを戻すと、1行3列目に入っていた
内容(文字)が表示されているのです。
この時、別のセルをクリックすると、5行5列目には本来の内容(文字)が表示
されて来ます。

別のセルをクリックすると、正しい内容に戻りますので、表示だけの問題だと
思うのですが、不思議で困った現象です。
なんとか、これを回避する方法はないでしょうか?

A 回答 (2件)

現象を確認しました。


goAlwaysShowEditorが原因です。

本来goAlwaysShowEditorはgoEditingが有効でなければ無視されるオプションですが、両者が有効であるときにgoEditingだけを動的に無効にするという状況を想定してないようです。
そのため、goEditingを無効にした直後はgoAlwaysShowEditorが判定されInpalceEditorが消されてないようです。VCLのソースを確認してないので断言できませんが、当たらずとも遠からずだと思います。

ですので対処法は「goEditingを切り替えるときはgoAlwaysShowEditorも同時に切り替える」で正解です。

なお、
//有効にする
 StringGrid1->Options << goEditing << goAlwaysShowEditor;
//無効にする
 StringGrid1->Options >> goAlwaysShowEditor >> goEditing;
でいけます。ストリーム演算子と同じ扱いが出来るようになってます。
    • good
    • 1
この回答へのお礼

有難うございました。

>ですので対処法は「goEditingを切り替えるときはgoAlwaysShowEditorも同時に切り替える」で正解です。

そうだったんですね。
以後、このようにします。
C++の記述についてもご指導ありがとうごいました。

お礼日時:2006/08/26 13:28

追試してみました。


しかし、うちの環境(BCB6、BDS)では再現しませんでした。
BCB5に固有の問題かもしれません。
ご面倒でなければ、一度最低限の構成(フォーム上にStringGridとgoEditingを操作するためのコンポーネントのみ配置し、イベントハンドラもStringGridの初期化とgoEditingの操作のみにする)で、現象が発生する場合の設定、手順の詳細を補足してください。

現在BCB5が使える環境がないのでお役に立てるかどうかはわかりませんが。

ところで、
>StringGrid1->Options >> goEditing;
でいいような。BCB5はちがったけっかな?

この回答への補足

ありがとうございます。
今、テストプログラムを作って実験しています。
Optionでtrueと設定されているのは、次の項目です。

goFixedVertLine
goFixedHorzLine
goVertLine
goHorzLine
goRangeSelect
goEditing
goAlwaysShowEditor
goThumbTracking

Button2が、StringGrid修正不可の設定ボタンでして、
void __fastcall TForm1::Button2Click(TObject *Sender)
{
Button1->Enabled = true;
Button2->Enabled = false;
StringGrid1->Options >> goEditing; // <a>
}
と記述しています。( <a>の行はご指摘の通りでうまく出来そうです。)

プログラムが起動すると、テストデータ用のファイルを読み込み、各セルに
テキストを格納します。
この状態でプログラムは操作待ちになります。

矢印キーの操作をしてみると、この現象は、
「再描画されたセルのうち、最終的にカーソルのあるセルに現れる」
ということのようです。
従って、再描画されないセル(セル全体が見えている)をクリックしても
現象は現れません。

シロートの直感で、
StringGrid1->Options << goEditing; //認める
StringGrid1->Options << goAlwaysShowEditor;

StringGrid1->Options >> goEditing; //認めない
StringGrid1->Options >> goAlwaysShowEditor;
の組み合わせをやってみたら、問題の現象は出なくなりました。

この違いが良く分かっていないのですが、原因が良く分からない場合、
これで逃げようかと思っています。

補足日時:2006/08/25 14:50
    • good
    • 0

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