2017-09-28 26 views
0

私は
一般 How do I draw the selected list-box item in a different color?選択DBListbox項目は、テキスト

procedure TForm1.DBComboBoxDrawItem(Control:TWinControl; 
    Index: Integer; Rect: TRect; State: TOwnerDrawState); 
with (Control as TDBComboBox).Canvas do 
begin 
if odSelected in State then 
    Brush.Color := $00EACAB6; 
    Font.Color := clBlack; 
    FillRect(Rect); 
    TextOut(Rect.Left, Rect.Top, (Control as TDBComboBox).Items[Index]); 
    if odFocused In State then 
    begin 
    Brush.Color := (Control as TDBComboBox).Color; 
    DrawFocusRect(Rect); 
    end; {if} 
    end; {with} 
end; 

に似csOwnerDrawFixedとしてのスタイルを使用してDBCombobox内の項目の色を変更することができる午前を挿入し、デフォルトでは、私が使用することができていますまた、DBCombobox Standard(スタイル:csDropdown)を使用して項目を選択し、DBコンボボックスにテキストを入力してください。

しかし、私が現在直面している問題は、(Style as csOwnerDrawFixed or csOwnerDrawVariable)を使用してDBComboboxの色を変更するときです。色は変更されますが、DBComboboxでテキストを入力することはできません。

誰かがアイテムの色を変更する方法と、DBComboboxでテキストを同時に入力する方法を教えてもらえますか?ありがとう!

enter image description here

注:表示色がデフォルトのものではないが、それは可能であるTComboBoxで1

+0

私たちはあなたが持っているものを私たちに再現することができますか? – Dsm

+0

申し訳ありませんが、私はコードワイズを意味しました。私はそれを明確にすべきだった。 – Dsm

+0

DBComboBoxの場合、ヘルプはこれが不可能であることを明示的に述べています(つまり、これらのモードではユーザーはデータを入力できません)。提案としては、通常のTComboboxの使用を検討し、ライブバインディングを介してデータソースにリンクすることを検討するかもしれませんが、これは大きな変化であることに感謝します。 – Dsm

答えて

0

を変更しました。これを試して。

procedure TForm1.DBComboBox1Change(Sender: TObject); 
begin 
    TDBComboBox(Sender).Style := csDropDown 
end; 

procedure TForm1.DBComboBox1DropDown(Sender: TObject); 
begin 
    TDBComboBox(Sender).Style := csOwnerDrawFixed; 
end; 

またはApplication.OnIdleイベントハンドラでスタイルを設定します:あなたは、インスタンスOnChangeのための別のイベントを処理することができますので、何OnCloseUpイベントはありませんTDBComboBoxについてCloseUpDropDownイベントハンドラ

procedure TForm1.ComboBox1CloseUp(Sender: TObject); 
begin 
TComboBox(Sender).Style := csDropDown 
end; 

procedure TForm1.ComboBox1DropDown(Sender: TObject); 
begin 
TComboBox(Sender).Style := csOwnerDrawFixed; 
end; 

を追加することができます

procedure TForm1.ApplicationEvents1Idle(Sender: TObject; var Done: Boolean); 
begin 
    if (not DBComboBox1.DroppedDown) and (DBComboBox1.Focused) 
    then 
    DBComboBox1.Style := csDropDown; 
    if (not DBComboBox1.DroppedDown) and (not DBComboBox1.Focused) 
    then 
    DBComboBox1.Style := csOwnerDrawFixed; 
end; 
+0

私もこれを考えましたが、試してみるとうまくいかないようでした。 OnDrawItemイベントはトリガされませんでした。 – Dsm

+0

@Dsm 'DBComboBox'.Style'が' csOwnerDraw * 'に設定されているときにトリガーされます –

+0

それは私のためではありませんでした。私はルーチンにブレークポイントを入れ、それは引き起こされませんでした。たぶん私は何かを逃した。 – Dsm