TComboboxの動作についての質問です。
FormにComboboxのみ貼り付けて、Itemsに適当に登録し、StyleプロパティをDropDownListに設定します。
クライアントがWindow2000の場合は、Comboboxにフォーカスが当たっている状態で、BackSpaceキーを押下することで、ComboboxのItemIndexの値が-1になるのですが、WinXPの場合は、ItemIndexの値が-1になってくれません。
皆さんの環境ではどうなのでしょうか?
開発環境はDelphi 7 Pro、Win2000(SP3)です。
よろしくお願いします。
本当ですね。WinXP というよりもテーマが XP Style の場合ですね。
Windows クラシックの場合は Win2K と同じ動作です。(D7.1+WinXP)
良く判らないのですが?
csDropDownListで。
ComboBox1のOnKeyDown時に調べるのでしょうか?
if Key = VK_Return then ShowMessage(IntToStr(ComboBox1.ItemIndex));
Buttonを貼り付けて、Button1のOnClickで調べるのでしょうか?
ShowMessage(IntToStr(ComboBox1.ItemIndex));
BackSpase後も正しく「-1」を表示します。
違ってます?(^_^;)
Delphi7ENT WinXP(SP2)
質問してから時間がたったので、半分あきらめかけていたのですが、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.
//----------------------------------------------ここまで
一応、ComboBoxのKeyDownイベントを以下のようにして逃げています。
procedure TForm1.ComboBox1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if Key = VK_BACK then
TComboBox(Sender).ItemIndex := -1;
end;
OnChangeですよね。それもやってみたのですが・・・
おっかしいなー。
って、ことは皆さんBackSpaseでも「-1」にはならないって
ことですよね。
OnChangeでLabel1.Caption := IntToStr(ComboBox1.ItemIndex);
ComboBox1で適当なItemを選択して、BackSpaseで削除すると即座に
Label1には「-1」と表示します。
csDropDownListですよね・・・。
なんだか、こっちのほうが変みたい(^_^;)
WinXP(SP2)だからなんでしょうか?
Delphi Version7.0(Build8.1)
恐る恐る、開発環境ではない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
です。
はぁ、、、
もう 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
jamさん、ありがとうございます。
チャレンジャー@っしーです。
こちらのDELLマシンはXPプリインストール版なので、jamさんの実マシン環境と同じと思いますので、私のXP環境がおかしいような気がしてきました、、、
ということで、フォームの作成時に全てのComboBoxのKeyDownイベントに、上記のKeyDownイベントを適用しようと思います。 できるのかな?
チャレンジ精神で頑張ってみます!
※もしかしたら追加情報を頂けるかもしれないので
※しばらく”解決済み”にはしません。m(__)m
追加です。
VMWare 上の仮想マシン (Win2K はパッケージ版)
Win2K・・・×
でも動作としては DropList で -1 になることの方がおかしいと思いますよ。(--;
普通のユーザーは BS なんて使いませんよね。
通常は先頭項目に "(なし)" などを作成して対応するのは本筋かと...
>通常は先頭項目に "(なし)" などを作成して対応するのは本筋かと...
はい、その通りですね。
ありがとうございました。
解決済みなのに、むしかえしです。
なんなんでしょうか?
WinXPでコンパイルしたプログラムを
Win2000(SP3)で実行すると、なんと
BackSpase自体が効きません。
消えません。動作が全く違う。
当然「-1」にもなりません。
もっとも、DropDownList自体が編集ボックスを
持たない。
必ず項目を選択するとして、ItemIndexを0にして
実行した時、BackSpase自体が効いて「-1」となる
ほうがおかしい、などと思ってしまいます。
決して、「ユーザーは押さないとも限らない」
と思いますが。
てぇ事になると「"(なし)"」だけでは意味を
成さなくなるって事かな。
OnKeyPressで if Key = #8 then Key := #0;
しかし、OS毎に動作が異なったら大変だなー。
?????(^_^;)??????
私の試験プログラムはすべて実マシンの XP 上でコンパイルしたものなので
ある意味コンパイル環境以外は×という仮定も成り立つわけですね。
で、別解ですが、元来 XP で Combobox の AutoComplete を true にすると、
漢字入力時にバグバグなので通常 XP では AutoComplete は false にしています。<jam
その状態でコンパイルすると、実マシンの XP でも×になりました。
@っしーさんの Win2K ではどうなるでしょう?
×になれば "ComboBox の AutoComplete は常に false することが推奨される"
という結論になるのかと...
おはようございます。
AutoCompleteをFalseにして確認してみました。
開発:Win2000(SP3) + D7 Pro
実行:Win2000(SP3)・・・×
実行:WinXP(SP2)・・・×
で、Win2000でもBackSpaceが効かなくなりました。
ちなみに、D5Proですと、AutoCompleteプロパティがなく
実行:Win2000(SP3)・・・×
実行:WinXP(SP2)・・・×
となりました。
ツイート | ![]() |