Иногда хочется сделать так, чтобы в комбобоксе, пользователь мог только выбирать из списка но не вводить текст с клавиатуры.

Так можно включить "ComboBox.ReadOnly"

 

SendMessage(GetWindow(ComboBox1.Handle,GW_CHILD), EM_SETREADONLY, 1, 0);

 

а так выключить.

 

SendMessage(GetWindow(ComboBox1.Handle,GW_CHILD), EM_SETREADONLY, 0, 0);

 

При csDropDownList нельзя набирать для выбора, то есть если нажал "К" а потом "О", то вначале выберется слово на "К" а потом на "О", а так выберется слово на "КО", и текст нельзя из него копировать.

 

Автор: Fantasist

 

Code:

procedure TForm1.ComboBox1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);

{®Vit (Vitaly Nevzorov) }

begin

if key=vk_F4 then key:=0;

end;

 

Code:

procedure TForm1.FormCreate(Sender: TObject);

 

begin

SetWindowRgn(

ComboBox1.Handle,

CreateRectRgn(2, 2, ComboBox1.Width - 2, ComboBox1.Height - 2), True);

end;

 

Автор: Smike

 

Пошлите ComboBox сообщение CB_GETDROPPEDSTATE.

 

Code:

if SendMessage(ComboBox1.Handle, CB_GETDROPPEDSTATE, 0, 0) = 1 then

begin {список ComboBox выпал}

 

end;

 

 

При добавлении большого количества строк происходит мигание компонента.

Code:

Combobox1.BeginUpdate;

//здесь вставляем строки

Combobox1.EndUpdate;

 

 

течение события FormShow, выпадающему списке дважды посылается сообщение CB_SHOWDROPDOWN , один раз, чтобы он открылся, а второй - чтобы свернулся. Затем посылается сообщение CB_GETDROPPEDCONTROLRECT, передающее адрес TRect.

 

Когда вызов SendMessage возвращается, то TRect будет содержать прямоугольник, который соответствует раскрытому ComboBox-у относительно окна. Затем можно вызвать ScreenToClient для преобразования координат TRect-а в координаты относительно клиентской области формы.

 

 

Code:

procedure TForm1.ComboBox1DrawItem(Control: TWinControl;

Index: Integer; Rect: TRect; State: TOwnerDrawState);

var

strVal, strAll: string;

pos1, pos2: Integer;

rc: TRect;

arrWidth: array [0..3] of Integer;

begin

Combobox1.Canvas.Brush.Style := bsSolid;

Combobox1.Canvas.FillRect(Rect);

// the columns must be separated by ';'

strAll := Combobox1.Items[Index];

 

arrWidth[0] := 0;

arrWidth[1] := 100// Width of column 1

arrWidth[2] := 200// Width of column 2

arrWidth[3] := 300// Width of colimn 3

 

// Drawingrange for first column

rc.Left   := Rect.Left + arrWidth[0] + 2;

rc.Right  := Rect.Left + arrWidth[1] - 2;

rc.Top    := Rect.Top;

rc.Bottom := Rect.Bottom;

 

// Get text for first column

pos1   := Pos(';', strAll);

strVal := Copy(strAll, 1, pos1 - 1);

// Draw Text

Combobox1.Canvas.TextRect(rc, rc.Left, rc.Top, strVal);

// Draw separating line betwenn columns

Combobox1.Canvas.MoveTo(rc.Right, rc.Top);

Combobox1.Canvas.LineTo(rc.Right, rc.Bottom);

 

// Drawingrange for second column

rc.Left  := Rect.Left + arrWidth[1] + 2;

rc.Right := Rect.Left + arrWidth[2] - 2;

 

// Text fur zweite Spalte ausfiltern

// Get text for second column

strAll := Copy(strAll, pos1 + 1, Length(strAll) - pos1);

pos1   := Pos(';', strAll);

strVal := Copy(strAll, 1, pos1 - 1);

 

// Text ausgeben

// Draw Text

Combobox1.Canvas.TextRect(rc, rc.Left, rc.Top, strVal);

// Trennlinie zwischen Spalten zeichnen

// Draw separating line betwenn columns

Combobox1.Canvas.MoveTo(rc.Right, rc.Top);

Combobox1.Canvas.LineTo(rc.Right, rc.Bottom);

 

// Drawingrange for third column

rc.Left  := Rect.Left + arrWidth[2] + 2;

rc.Right := Rect.Left + arrWidth[3] - 2;

 

// Get text for third column

strAll := Copy(strAll, pos1 + 1, Length(strAll) - pos1);

pos1   := Pos(';', strAll);

strVal := Copy(strAll, 1, pos1 - 1);

 

// Draw Text

Combobox1.Canvas.TextRect(rc, rc.Left, rc.Top, strVal);

// Draw separating line betwenn columns

Combobox1.Canvas.MoveTo(rc.Right, rc.Top);

Combobox1.Canvas.LineTo(rc.Right, rc.Bottom);

strAll := Copy(strAll, pos1 + 1, Length(strAll) - pos1);

end;

 

 

// Example/ Beispiel:

 

procedure TForm1.Button1Click(Sender: TObject);

begin

with Combobox1.Items do

begin

   Add('first;second;third;');

   Add('column1;column2;column3;');

end;

end;

 

 

procedure TForm1.FormCreate(Sender: TObject);

begin

//Oder im Objekt Inspektor einstellen

//Or set this Property in the Object Inspector

Combobox1.Style := csOwnerDrawFixed;

end;

 

Автор: Allan Carlton

 

Делается это при помощи стиля ownerdraw, который присутствует в TComboBox. Нас интересуют два свойства этого стиля:

 

csOwnerDrawFixed - используется, если все битмапы имеют одинаковую высоту

csOwnerDrawVariable - используется для битмапов с разной высотой

После того как стиль будет установлен на один из вышеперечисленных, то можно воспользоваться событием onDrawItem. Это событие возникает каждый раз, когда приложению необходимо нарисовать пункт в выпадающем списке (combo box). Событие определяется следующим образом: