ComboBoxの動作がおかしいです


風太郎  2013-02-20 14:28:21  No: 43899

C++Builder XE3で、ToolBarにアイテムをいくつか登録したComboBoxを配置した場合、AutoCompleteをオフにしても、フォームをリサイズした時(何故か横方向だけ)ComboBoxのテキストが登録されているアイテム(おそらくItemIndexの内容)に書き換わってしまいます

なにか制限があるのでしょうか?

とりあえず今は、ComboBoxをツールバーに重ねて、見栄えだけ同じ様にしていますが、気持ち悪いです


  2013-02-20 16:20:14  No: 43900

状況がよく分からない部分がありますが、単純な構成で
試しましたか?

それと、Delphiの掲示板ではなく、C++を扱った他の掲示板
で聞いた方がレスが付きやすいかと思います。


風太郎  2013-02-21 05:57:14  No: 43901

あ さん

フォームにToolBarとComboBoxだけ配置した単純な構成で試しました

とりあえず、C++関係の他の掲示板を探してみます

ありがとうございました


  2013-02-21 07:53:27  No: 43902

なんとなく言いっぱなしで悪い気がしますので、テストしてみました。
DelphiXE3で、ToolBar上に乗せたComboBoxに3つほどアイテムを設定し、
オートコンプリートをオフにします。
他の状態はすべてデフォルトです。

ここで、フォームをリサイズしても、何も起こりませんでした。


  2013-02-21 07:57:11  No: 43903

言語そのものが違う以上、なんとも言えませんが、ComboBoxは
かなりメジャーな部品ですので、フォームリサイズを伴う
プログラムでもたくさん利用され、勝手に内容が置き換わる
などという不具合があれば、すぐ報告されるような気がします。
言語が違う以上、これ以上応援はできませんが、がんばってください。


風太郎  2013-02-24 15:20:16  No: 43904

あ さん、わざわざテストして頂いて、ありがとうございます

私もテストしてみましたが、たとえばItemsに12 13 14などとアイテムを登録して、ComboBoxのテキストを1にしてフォームの横幅を変更すると、オートコンプリートが効いた様に、ComboBoxのテキストが書き換わりました

Formに直接配置した場合は正常に動作します

自分なりに調べてみます


RAD命  2013-02-24 17:31:48  No: 43905

環境は、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でも試してみましたが、
こちらは、そもそもオートコンプリートが無いためか、
全く症状は出ませんでした。

こちらでも、追って調べてみます。


DEKO  2013-02-24 22:17:13  No: 43906

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


KHE00221  2013-02-26 06:21:25  No: 43907

Anchors というより Width が変わると事象が発生するみたい。

プロパティの AutoComplete は  TCustomComboBox の自前実装だから 
(ComboBox の機能ではない) この現象とは関係ないと思う

Text は変わるけどメッセージが一切飛んでこない ItemIndex も
変わらないので

procedure TComboBox.WMSIZE(var Message: TWMSIZE);
begin  
    //テキストの内容は変わっていない
    inherited;
    //テキストの内容が変わる
end;

なのでここで小細工するしかないかも

2006 で出て、 3 で出ないのは使用している ComboBox のバージョン
が異なったりしてないかな?


DEKO  2013-02-26 08:05:43  No: 43908

> なのでここで小細工するしかないかも

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 だとこんな感じですかね。


DEKO  2013-02-26 08:19:57  No: 43909

ちょっとミスしてますね。

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;

こうでした。


RAD命  2013-02-27 01:01:37  No: 43910

KHE00221さん>  確認してみました。

Delphi3,TurboDelphi、C++BuilderXE2、VisualStudio2008、
にて、全てでComboboxのWidthが変わると、
(Textに、Itemsに入っている値の頭文字が入っていると言う条件で)

全ての言語で値が変わるのを確認しました。

ツールバーだからじゃ無かったんですね。

因みに、JBuilder7だと、何をしても全く変わりませんでした。
Javaだから、Windowsとは内部も全くの別物なのかなぁ…。

なので、Windowsが提供するCombobox機能のバグなのではと思います。

まだ試してないですが、Lazalusだと、どうなんだろう??

今度、久しぶりにLazalusインストールして、試してみるかも…。


風太郎  2013-02-27 14:21:58  No: 43911

皆様、色々と情報ありがとうございます
Windowsのバグだとすると、力技で回避するしかなさそうですね

プロジェクトが急ぎのため、せっかく情報を頂いたのに、言いだしっぺがテストできずに申し訳ないです

落ち着いたら、色々と試してみます


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加