C++Builder XE3で、ToolBarにアイテムをいくつか登録したComboBoxを配置した場合、AutoCompleteをオフにしても、フォームをリサイズした時(何故か横方向だけ)ComboBoxのテキストが登録されているアイテム(おそらくItemIndexの内容)に書き換わってしまいます
なにか制限があるのでしょうか?
とりあえず今は、ComboBoxをツールバーに重ねて、見栄えだけ同じ様にしていますが、気持ち悪いです
状況がよく分からない部分がありますが、単純な構成で
試しましたか?
それと、Delphiの掲示板ではなく、C++を扱った他の掲示板
で聞いた方がレスが付きやすいかと思います。
あ さん
フォームにToolBarとComboBoxだけ配置した単純な構成で試しました
とりあえず、C++関係の他の掲示板を探してみます
ありがとうございました
なんとなく言いっぱなしで悪い気がしますので、テストしてみました。
DelphiXE3で、ToolBar上に乗せたComboBoxに3つほどアイテムを設定し、
オートコンプリートをオフにします。
他の状態はすべてデフォルトです。
ここで、フォームをリサイズしても、何も起こりませんでした。
言語そのものが違う以上、なんとも言えませんが、ComboBoxは
かなりメジャーな部品ですので、フォームリサイズを伴う
プログラムでもたくさん利用され、勝手に内容が置き換わる
などという不具合があれば、すぐ報告されるような気がします。
言語が違う以上、これ以上応援はできませんが、がんばってください。
あ さん、わざわざテストして頂いて、ありがとうございます
私もテストしてみましたが、たとえばItemsに12 13 14などとアイテムを登録して、ComboBoxのテキストを1にしてフォームの横幅を変更すると、オートコンプリートが効いた様に、ComboBoxのテキストが書き換わりました
Formに直接配置した場合は正常に動作します
自分なりに調べてみます
環境は、C++BuilderXE2スターター、Win8です。
試してみました。
ツールバーを配置、
Itemsに、
1度目は
aaaaaaa1
aaaaaaa2
aaaaaaa3
aaaaaaa4
aaaaaaa5
aaaaaaa6
と、
2度目は、
aaaaaaa1
baaaaaa2
caaaaaa3
daaaaaa4
eaaaaaa5
faaaaaa6
を挿入、
オートコンプリートオフ、
で、フォームをリサイズしてみたところ、
何も変化はありませんでした。
ただ、
「a」と入力して、
ドロップダウンすると、
「aaaaaaa1」等、
オートコンプリートをオフにしても、
Itemindexを引っ張り出してきました。
試しに、
TurboDelphi2006、Win8で試したところ、
風太郎さんの訴える症状が、
見事に再現されました。
オートコンプリートオフでも、
フォームを横方向にリサイズされた時だけ、
Itemindexの内容が、Textに反映されてしまいます。
更に試しにDelphi3、Wn8でも試してみましたが、
こちらは、そもそもオートコンプリートが無いためか、
全く症状は出ませんでした。
こちらでも、追って調べてみます。
Delphi でも Anchors = [akLeft,akTop,akRight] の
ComboBox を貼り付けたフォームをリサイズすると
同様の現象が発生しますね (ToolBar に載せる必要はない)。
C# でも発生する (していた?) ようです。
[C# Bug: ComboBox gets focus on Resizing form (anchor = right,left)]
http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/d53b4e12-7030-4439-bbd6-bda66077559b
Anchors というより Width が変わると事象が発生するみたい。
プロパティの AutoComplete は TCustomComboBox の自前実装だから
(ComboBox の機能ではない) この現象とは関係ないと思う
Text は変わるけどメッセージが一切飛んでこない ItemIndex も
変わらないので
procedure TComboBox.WMSIZE(var Message: TWMSIZE);
begin
//テキストの内容は変わっていない
inherited;
//テキストの内容が変わる
end;
なのでここで小細工するしかないかも
2006 で出て、 3 で出ないのは使用している ComboBox のバージョン
が異なったりしてないかな?
> なのでここで小細工するしかないかも
type
TComboBox = class(StdCtrls.TComboBox)
private
procedure WMSize(var Msg: TWMSize); message WM_SIZE;
end;
implementation
procedure TComboBox.WMSize(var Msg: TWMSize);
var
SS: Integer;
SL: Integer;
ST: string;
begin
Self.Items.BeginUpdate;
try
SS := Self.SelStart;
SL := Self.SelLength;
ST := Self.Text;
inherited;
Self.Text := ST;
SS := Self.SelStart;
SL := Self.SelLength;
finally
Self.Items.EndUpdate;
end;
end;
Delphi だとこんな感じですかね。
ちょっとミスしてますね。
procedure TComboBox.WMSize(var Msg: TWMSize);
var
SS: Integer;
SL: Integer;
ST: string;
begin
Self.Items.BeginUpdate;
try
SS := Self.SelStart;
SL := Self.SelLength;
ST := Self.Text;
inherited;
Self.Text := ST;
Self.SelStart := SS;
Self.SelLength := SL;
finally
Self.Items.EndUpdate;
end;
end;
こうでした。
KHE00221さん> 確認してみました。
Delphi3,TurboDelphi、C++BuilderXE2、VisualStudio2008、
にて、全てでComboboxのWidthが変わると、
(Textに、Itemsに入っている値の頭文字が入っていると言う条件で)
全ての言語で値が変わるのを確認しました。
ツールバーだからじゃ無かったんですね。
因みに、JBuilder7だと、何をしても全く変わりませんでした。
Javaだから、Windowsとは内部も全くの別物なのかなぁ…。
なので、Windowsが提供するCombobox機能のバグなのではと思います。
まだ試してないですが、Lazalusだと、どうなんだろう??
今度、久しぶりにLazalusインストールして、試してみるかも…。
皆様、色々と情報ありがとうございます
Windowsのバグだとすると、力技で回避するしかなさそうですね
プロジェクトが急ぎのため、せっかく情報を頂いたのに、言いだしっぺがテストできずに申し訳ないです
落ち着いたら、色々と試してみます
ツイート | ![]() |