TComboboxについて

解決


@っしー  2004-08-12 00:47:51  No: 10344

TComboboxの動作についての質問です。

FormにComboboxのみ貼り付けて、Itemsに適当に登録し、StyleプロパティをDropDownListに設定します。
クライアントがWindow2000の場合は、Comboboxにフォーカスが当たっている状態で、BackSpaceキーを押下することで、ComboboxのItemIndexの値が-1になるのですが、WinXPの場合は、ItemIndexの値が-1になってくれません。

皆さんの環境ではどうなのでしょうか?

開発環境はDelphi 7 Pro、Win2000(SP3)です。

よろしくお願いします。


jam  2004-09-03 18:11:47  No: 10345

本当ですね。WinXP というよりもテーマが XP Style の場合ですね。
Windows クラシックの場合は Win2K と同じ動作です。(D7.1+WinXP)


Syake  2004-09-03 19:25:44  No: 10346

良く判らないのですが?
csDropDownListで。
ComboBox1のOnKeyDown時に調べるのでしょうか?
  if Key = VK_Return then ShowMessage(IntToStr(ComboBox1.ItemIndex));
Buttonを貼り付けて、Button1のOnClickで調べるのでしょうか?
  ShowMessage(IntToStr(ComboBox1.ItemIndex));

BackSpase後も正しく「-1」を表示します。
違ってます?(^_^;)

Delphi7ENT  WinXP(SP2)


@っしー  2004-09-03 19:47:54  No: 10347

質問してから時間がたったので、半分あきらめかけていたのですが、jamさんの投稿で、自分だけの環境で起こる事ではないということが判り、ホッとしています。
(^^ゞ

さて、Syakeさんへの回答ですが、
Form1にComboBox1とLabel1を貼り付けた状態で、ComboBox1のChangeイベントで、ItemIndexの値をLabel1のCaptionに設定して確認することが出来ます。

簡単なソースですが、以下に示させていただきます。

//--------------------------------------------------------
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    ComboBox1: TComboBox;
    Label1: TLabel;
    procedure ComboBox1Change(Sender: TObject);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.ComboBox1Change(Sender: TObject);
begin
  Label1.Caption := 'ItemIndex = ' + IntToStr(ComboBox1.ItemIndex); 
end;

end.

//----------------------------------------------ここまで


@っしー  2004-09-03 19:58:02  No: 10348

一応、ComboBoxのKeyDownイベントを以下のようにして逃げています。

procedure TForm1.ComboBox1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if Key = VK_BACK then
    TComboBox(Sender).ItemIndex := -1;
end;


Syake  2004-09-03 20:26:30  No: 10349

OnChangeですよね。それもやってみたのですが・・・
おっかしいなー。
って、ことは皆さんBackSpaseでも「-1」にはならないって
ことですよね。
OnChangeでLabel1.Caption := IntToStr(ComboBox1.ItemIndex);
ComboBox1で適当なItemを選択して、BackSpaseで削除すると即座に
Label1には「-1」と表示します。
csDropDownListですよね・・・。
なんだか、こっちのほうが変みたい(^_^;)

WinXP(SP2)だからなんでしょうか?
Delphi Version7.0(Build8.1)


@っしー  2004-09-03 22:33:01  No: 10350

恐る恐る、開発環境ではないWinXPマシンをSP2にしてみました。

がががっ、現象は変りませんでした。
クラシックStyleにしても、BackSpaceでComboBoxのItemIndexは-1にはなってくれません。

ということで、私の環境では以下のような結果です
1.Win2000(SP3)・・・○
2.WinXP SP1(XP Style)・・・×
3.WinXP SP2(XP Style)・・・×
4.WinXP SP2(クラシックStyle)・・・×

WinXP SP1のクラシックStyleでの試験をする前にSP2にしちゃったので、試験できてません。m(__)m

Win2000マシンは、SONY VAIO PCG-GR7/K
WinXPマシンは、DELL Dimension 2300C
です。

はぁ、、、


jam  2004-09-03 23:45:06  No: 10351

もう SP2 入れましたか。チャレンジャーですね〜。
こちらの状況です。

VMWare 上の仮想マシン (XP はパッケージ版)
WinXP SP1 (XP Style)・・・×
WinXP SP1 (クラシック)・・・×
WinXP SP2 (XP Style)・・・×
WinXP SP2 (クラシック)・・・×

実マシン (XP はインストール済みOEM版)
WinXP SP1 (クラシック)・・・○
WinXP SP1 (XP Style)・・・○

エクスプローラフォルダオプションの表示メニュー内容が異なるので
OEM 版とパッケージ版でシェルが異なるのかもしれません。

先の "クラシックが -1 になる" の発言は VMWare と実マシンを
比べてました。(^^;;
よってテーマには関係ありませんね。m(_._)m


@っしー  2004-09-03 23:58:42  No: 10352

jamさん、ありがとうございます。

チャレンジャー@っしーです。

こちらのDELLマシンはXPプリインストール版なので、jamさんの実マシン環境と同じと思いますので、私のXP環境がおかしいような気がしてきました、、、

ということで、フォームの作成時に全てのComboBoxのKeyDownイベントに、上記のKeyDownイベントを適用しようと思います。  できるのかな?

チャレンジ精神で頑張ってみます!

※もしかしたら追加情報を頂けるかもしれないので
※しばらく”解決済み”にはしません。m(__)m


jam  2004-09-04 01:04:46  No: 10353

追加です。

VMWare 上の仮想マシン (Win2K はパッケージ版)
Win2K・・・×

でも動作としては DropList で -1 になることの方がおかしいと思いますよ。(--;
普通のユーザーは BS なんて使いませんよね。
通常は先頭項目に "(なし)" などを作成して対応するのは本筋かと...


@っしー  2004-09-04 01:51:15  No: 10354

>通常は先頭項目に "(なし)" などを作成して対応するのは本筋かと...

はい、その通りですね。

ありがとうございました。


Syake  2004-09-04 19:00:24  No: 10355

解決済みなのに、むしかえしです。
なんなんでしょうか?

WinXPでコンパイルしたプログラムを
Win2000(SP3)で実行すると、なんと
BackSpase自体が効きません。
消えません。動作が全く違う。
当然「-1」にもなりません。

もっとも、DropDownList自体が編集ボックスを
持たない。
必ず項目を選択するとして、ItemIndexを0にして
実行した時、BackSpase自体が効いて「-1」となる
ほうがおかしい、などと思ってしまいます。

決して、「ユーザーは押さないとも限らない」
と思いますが。
てぇ事になると「"(なし)"」だけでは意味を
成さなくなるって事かな。
OnKeyPressで  if Key = #8 then Key := #0;

しかし、OS毎に動作が異なったら大変だなー。

?????(^_^;)??????


jam  2004-09-04 19:16:07  No: 10356

私の試験プログラムはすべて実マシンの XP 上でコンパイルしたものなので
ある意味コンパイル環境以外は×という仮定も成り立つわけですね。

で、別解ですが、元来 XP で Combobox の AutoComplete を true にすると、
漢字入力時にバグバグなので通常 XP では AutoComplete は false にしています。<jam

その状態でコンパイルすると、実マシンの XP でも×になりました。
@っしーさんの Win2K ではどうなるでしょう?

×になれば "ComboBox の AutoComplete は常に false することが推奨される" 
という結論になるのかと...


@っしー  2004-09-06 19:24:30  No: 10357

おはようございます。

AutoCompleteをFalseにして確認してみました。

開発:Win2000(SP3) + D7 Pro
  実行:Win2000(SP3)・・・×
  実行:WinXP(SP2)・・・×
で、Win2000でもBackSpaceが効かなくなりました。

ちなみに、D5Proですと、AutoCompleteプロパティがなく
  実行:Win2000(SP3)・・・×
  実行:WinXP(SP2)・・・×
となりました。


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

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






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