2010-12-04 37 views
3

私はDelphi7を使用しています。私は、コンボボックスを区切り項目(ポップアップメニューのように)にしたいと思います。1つまたは複数のセパレータ項目を含むComboBoxを作成しますか?

私はこれが美しくMozillaのSunbirdの(私が知っている、それはデルファイではありません...)、次のように実装見てきた

  1. セパレーター項目が中央に描かれたシンプルなグレーのライン ですアイテムあなたが と、セパレータの上にマウスを置くと

  2. は、選択は、ユーザがseparatoをクリックすると が

  3. 表示されませんr、 これも選択されていません。 コンボボックスはクローズアップではありません。

No.1は、DrawItemを使用して実装できます。私はそれについて全く知らないので、No.2なしで生きることができました。

3番の場合、私はあなたの助けを求めています。私はコンボボックスにCBN_CLOSEUPメッセージをクローズした後すぐにそれを理解しました。

私は、ウィンドウprocをフックし、CBN_CLOSEUPが特定のコンボボックスに送られてそれに対抗すると考えました。しかし、これが最善の解決策であるかどうかは分かりません。

解決策が何であれ、私はWinXP/Vista/7テーマを正しくサポートする標準のComboBoxを用意したいと思います。

ありがとうございます!


編集:作業コンポーネントの場合、このスレッドを参照してください:あなたはあなたのコントロールがうまく利用無料SpTBXLibを見たい場合は

Can you help translating this very small C++ component to Delphi?

+1

標準のコンボボックスを要求しましたが、区切り文字を含むコンボボックスも求めました。これらは相互に排他的な要求です。 Mozillaのコンボボックスは、OSが提供するコントロールではないため、これを行うことができます。 Mozillaはすべてのコントロールに対して独自のコードをすべて提供しているため、サポートされているすべてのプラットフォームで一貫して動作することができます。 –

+0

Mozillaのウィジェットは、私にとって不安なものです。プラットフォーム間で一貫性のある正確な整合性を実現しますが、ユーザーは単一のプラットフォーム上で動作する傾向があります。あなたが本当に必要とする一貫性はネイティブプラットフォームであり、実行できません。クロスプラットフォームでネイティブなウィジェットを実現できるQt以外のものはありますか? –

+1

Mozillaの改良されたcomboxboxは、Win環境にすばらしく適合し、コンボボックスのセパレータで素晴らしいアイデアを追加します。しかし、Windows用のiTunes/Safariは非常に悪く混乱していることに同意します。(目標はWin PCからMacに移行するのは明らかですが...) – Steve

答えて

1

あなたが望むものは、オーナーが描いたコンボボックスです。これを参照してください。

http://delphi.about.com/od/vclusing/a/drawincombobox.htmはまた、これはunclicableアイテムを作る解くようだ: http://borland.newsgroups.archived.at/public.delphi.vcl.components.using.win32/200708/0708225320.html

を限り、私はあなたがコンボボックスをサブクラス化する必要がありますので、それを行うのないVCLの方法はありません知っています。これらの機能をカプセル化して、簡単に再利用できるようにするコンポーネントを作成するとよいでしょう。

神は

+0

はい私はそのページをGoogleからも見つけましたが、ユーザーが区切り文字をクリックしたときにコンボボックスが閉じないようにするにはどうすればよいですか? – Steve

+0

ありがとう、私は同じ時間あなたの編集でリンクしたコンポーネントを見つけたと思います:-) – Steve

0

。ポップアップメニューに行をポップアップするコンボスタイルのコンポーネントをサポートしています。

+2

私はもっと同意できませんでした。もちろん、あなたのコンポーネントがネイティブのプラットフォームテーマを使用することが重要です。もちろん、Windows用のiTunes/Safariは使用できません。 –

+0

あなたは私の井戸を読まなかった。私は、標準のXP/Vista/7のテーマに固執していて、スキン/ 100%の持ち主のコンポーネントは絶対に避けていると言いました。 – Steve

+0

@スティーブあなたが所有者が確実に描かれている必要がありますが、私の推測では、あなたは厄介な悪夢であるコーディングにuxthemeに入る必要があるということです! –

1

を祝福し、私は(this answerで説明したように)unclickableセパレーターアイテムを作って遊んと、いくつかのUIのグリッチに走りました。問題は、コンボボックスには、正しく動作させるのが難しいいくつかの側面があります。

  • リストをドロップしている間、上下の矢印キーを押してリストをナビゲートします。
  • Enterキーを押すと、ドロップダウンリストが閉じ、現在の項目が選択されます。
  • Escapeキーを押すと、ドロップダウンリストが閉じ、現在のアイテム(上下の矢印キーで現在のアイテムが選択されている場合)または最後に選択されたアイテムが選択されます。
  • コンボボックスにフォーカスがある場合は、上下の矢印キーを押してリストを表示せずに現在の選択を変更します。
  • コンボボックスにフォーカスがある場合、何かを入力すると、入力中のものに一致するコンボボックスの項目が選択されます。
  • コンボボックスにフォーカスがある場合は、F4キーを押すとコンボボックスのリストがドロップされ、キーボードまたはマウスで制御できます。無効セパレーターアイテムはこれらのイベントのいずれかの(私は例えば、欠落している可能性があり加えて任意の他のイベント、スクリーンリーダー?)に応答しないことを確認

はエラーに満ちているようです。

代わりに、私が使用しているアプローチは、アイテムの一部として、セパレータを描画することです:

  1. 高さ可変のオーナー描画コンボボックスを使用します。
  2. セパレータが必要なアイテムの高さに3ピクセルを追加します。
  3. セパレータを必要とする各項目の上部に水平線を描画します。

これを達成するためのC++ Builderコードがいくつかあります。それをDelphiに変換するのは簡単なはずです。

void __fastcall TForm1::ComboBox1DrawItem(TWinControl *Control, 
    int Index, TRect &Rect, TOwnerDrawState State) 
{ 
    bool draw_separator = NeedsSeparator(Index) && 
     !State.Contains(odComboBoxEdit); 

    TCanvas *canvas = dynamic_cast<TCustomCombo*>(Control)->Canvas; 
    canvas->FillRect(Rect); 

    TRect text_rect = Rect; 
    // Add space for separator if needed. 
    if (draw_separator) { 
    text_rect.Top += 3; 
    } 

    canvas->TextOut(text_rect.Left + 3, 
     (text_rect.Top + text_rect.Bottom)/2 - 
     canvas->TextHeight(ComboBox1->Items->Strings[Index])/2), 
     ComboBox1->Items->Strings[Index]); 

    // Draw a separator line above the item if needed. 
    if (draw_separator) { 
    canvas->Pen->Color = canvas->Font->Color; 
    canvas->MoveTo(Rect.Left, Rect.Top + 1); 
    canvas->LineTo(Rect.Right, Rect.Top + 1); 
    } 
} 

void __fastcall TForm1::ComboBox1MeasureItem(
    TWinControl * /* Control */, int Index, int &Height) 
{ 
    Height = ComboBox1->ItemHeight; 

    // Add space for the separator if needed. 
    if (Index != -1 && NeedsSeparator(Index)) { 
    Height += 3; 
    } 
} 
関連する問題