☆TComboBoxでの文字化け

Delphi User's Forum で quest さんから教えて頂いたんですが、TComboBoxには、全角文字を適当に入力して、そのままBackSpaceを押すと文字化けするという問題があります。

この現象は、
  「ランタイムテーマを有効」 and 「AutoCompleteを有効
の時に発生します。


回避方法は、
1.「ランタイムテーマを無効」
2.「ランタイムテーマを有効」 and 「AutoCompleteを無効
のいずれかですね。

先日書いたTEditのSelTextと同じようにWindowsAPIの仕様変更の影響を受けているのかも知れませんね。


[情報元はこちら]

Delphi User's Forum
http://fdelphi.com/

|

☆ComboBoxでリストの自動ドロップダウン

リストボックスにしたいけど、スペースを取るからComboBoxを使っているような用途の場合、 ComboBoxの自動ドロップダウンは有効ですよね。
(私が作った社内のアプリでも、自動にしてほしいという要望が多いです)

これを実現するためにComboBoxには、AutoDropDownというプロパティが用意されているので、これをTrueするだけで良いように思えます。しかし、この設定では、カーソルがComboBoxに移動しても、ドロップダウンしません。

ヘルプで確認しますと、
<Delphi2007 for Win32 HELPより引用>

TComboBox.AutoDropDown プロパティ

AutoDropDown が true であれば,コンボボックスにフォーカスがあるときに
ユーザーが文字をタイプすれば自動的にリストをドロップダウンします。
これでは少し中途半端ですよね。


このような時には、次のような処理をします。(と書くほどのものではありませんけど)
procedure TForm1.ComboBox1Enter(Sender: TObject);
begin
  ComboBox1.DroppedDown := True;
end;

上の処理では、マウスで▼をクリックしてOnEnterが処理されたとき、一度閉じてしまいますね。
キー操作での処理ばかりしてたので、気付かなかったです。
ということで次の処理を考えてみました。しかしこれでもマウスがクリックされずに▼の上にあって、OnEnterが処理された場合には自動で開きませんけど(^^;
procedure TForm1.ComboBox1Enter(Sender: TObject);
var
  P1,P2: TPoint;
  R1, R2: Boolean;
begin
  GetCursorPos(P1);
  P2 := ComboBox1.ScreenToClient(P1);
  // ボタン幅の取得がわからなかったのでSM_CXHSCROLLを使いました。
  R1 := P2.X > (ComboBox1.Width - GetSystemMetrics(SM_CXHSCROLL));
  R2 := (P2.X < ComboBox1.Width);
  if R1 and R2 then Exit;
  ComboBox1.DroppedDown := True;
end;


でも、ここで一つ気になるのがヘルプの記述です。
<Delphi2007 for Win32 HELPより引用>

TCustomCombo.DroppedDown プロパティ

DroppedDown プロパティを読み出すと,ドロップダウンリストが可視であるか
どうかを判別できます。ドロップダウンリストを開いたり閉じたりするには,
DropDown プロパティを設定します。DroppedDown は,ドロップダウンリストが
開いていれば true,閉じていれば false です。 
私には、この記述は間違っているように思えます。
DroppedDownは読み込み専用プロパティではなく、設定も可能です。
DropDownプロパティは、OnDropDownイベントになりますので、開けたり閉じたりするには、やはりDroppedDownを使うものだと思われます。


又、AutoCloseUpというよくわからないプロパティもあります。
こちらもヘルプで確認してみます。
<Delphi2007 for Win32 HELPより引用>

TComboBox.AutoCloseUp プロパティ

AutoCloseUp が true になっていれば,ユーザーが項目を選択したとき,
自動的にドロップダウンが閉じられます。 
と書いていますが、実際には、このプロパティの設定に関係なく項目を選択すればドロップダウンが閉じられます。 もしかしてOnCloseUpイベントに影響があるのかなと思い、確かめてみましたが、こちらも常に発生するので 関係がないように思います。こうなるとわざわざ存在する理由がわからないですよね。 [2007/09/06 一部訂正しました。]

|

■ComboBox Ctl3D プロパティ

ComboBoxのCtl3Dプロパティは、動作しないので、フラットなコンボボックスは、自作コンポを使っていました。
し、しかし、本日発見してしまいました。ComboBoxにBevelKindというプロパティがあることを。しかもそれを bkFlat にするだけでフラットなコンボボックスにできるということを。
今更何を言ってるのかと言われそうですが、私は全く知りませんでした。
このプロパティ、どのバージョンからあったの?
※ちなみにTEditにもありました。

|

その他のカテゴリー

ADO | ADT | API | ArrayList | ASP.NET | BDE | BDP.NET | BdpConnection | Borland Developer Studio 2006 | CAPICOM | class | ClipBoard | CodeEditor | Convert.ToString | Custom component | DBExpress | Delphi 2005 | Delphi 2006 | Delphi 2007 | Delphi XE2 | Delphi7 | Delphi8 | Device Driver | Dialog | Docking | DocuWorks | Docuworks SDK | Drag&Drop | Evernote | EXCEL | Firebird | FireMonkey | Game | General | Generics | Google Earth COM API | Google Maps | Google SketchUp | Graphic | IDE | Imm | Indy | InstallAware Express6 | InterBase Admin | JWW | Microsoft SQL Server | MyBase | OnMouseDown | Oracle XE | Paradox | PreviewHandler | PrintDialog | PrintPreviewDialog | PropertyGrid | PSDファイル | Ribbon Controls | RichTextBox | Servers | SubClass | TAction | TActionList | TAnimate | TButton | TCategoryButtons | TClientDataSet | TComboBox | TComboBoxEx | TCustomEdit | TDBGrid | TDockTabSet | TDrawGrid | TEdit | TExcelApplication | TFont | TForm | third party | TImage | TLabel | TList | TListBox | TListView | TMemo | TOpenDialog | TOutlookApplication | TPageControl | TPanel | TRichEdit | TShellResources | TStringGrid | TTabControl | TToolBar | TToolButton | TTreeView | TWebBrowser | Update | VCL Styles | WinInet | XE2 | XPman | オープン配列パラメータ | グループ化 | トランスレーションマネージャー | ファイル処理 | ファイル名処理 | 動的配列 | 投票 | 文字列処理 | 日本語入力 | 暗号 | | 音声合成利用