ComboBox, DBComboBox
Иногда хочется сделать так, чтобы в комбобоксе, пользователь мог только выбирать из списка но не вводить текст с клавиатуры.
Так можно включить "ComboBox.ReadOnly"
SendMessage(GetWindow(ComboBox1.Handle,GW_CHILD), EM_SETREADONLY, 1, 0);
а так выключить.
SendMessage(GetWindow(ComboBox1.Handle,GW_CHILD), EM_SETREADONLY, 0, 0);
При csDropDownList нельзя набирать для выбора, то есть если нажал "К" а потом "О", то вначале выберется слово на "К" а потом на "О", а так выберется слово на "КО", и текст нельзя из него копировать.
Автор: Fantasist
- Подробности
- Родительская категория: VCL
- Категория: ComboBox, DBComboBox
Code: |
procedure TForm1.ComboBox1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); {®Vit (Vitaly Nevzorov) } begin if key=vk_F4 then key:=0; end; |
- Подробности
- Родительская категория: VCL
- Категория: ComboBox, DBComboBox
Code: |
procedure TForm1.FormCreate(Sender: TObject);
begin SetWindowRgn( ComboBox1.Handle, CreateRectRgn(2, 2, ComboBox1.Width - 2, ComboBox1.Height - 2), True); end; |
Автор: Smike
- Подробности
- Родительская категория: VCL
- Категория: ComboBox, DBComboBox
Пошлите ComboBox сообщение CB_GETDROPPEDSTATE.
Code: |
if SendMessage(ComboBox1.Handle, CB_GETDROPPEDSTATE, 0, 0) = 1 then begin {список ComboBox выпал}
end; |
- Подробности
- Родительская категория: VCL
- Категория: ComboBox, DBComboBox
При добавлении большого количества строк происходит мигание компонента.
Code: |
Combobox1.BeginUpdate; //здесь вставляем строки Combobox1.EndUpdate; |
- Подробности
- Родительская категория: VCL
- Категория: ComboBox, DBComboBox
течение события FormShow, выпадающему списке дважды посылается сообщение CB_SHOWDROPDOWN , один раз, чтобы он открылся, а второй - чтобы свернулся. Затем посылается сообщение CB_GETDROPPEDCONTROLRECT, передающее адрес TRect.
Когда вызов SendMessage возвращается, то TRect будет содержать прямоугольник, который соответствует раскрытому ComboBox-у относительно окна. Затем можно вызвать ScreenToClient для преобразования координат TRect-а в координаты относительно клиентской области формы.
- Подробности
- Родительская категория: VCL
- Категория: ComboBox, DBComboBox
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; |
- Подробности
- Родительская категория: VCL
- Категория: ComboBox, DBComboBox
Автор: Allan Carlton
Делается это при помощи стиля ownerdraw, который присутствует в TComboBox. Нас интересуют два свойства этого стиля:
csOwnerDrawFixed - используется, если все битмапы имеют одинаковую высоту
csOwnerDrawVariable - используется для битмапов с разной высотой
После того как стиль будет установлен на один из вышеперечисленных, то можно воспользоваться событием onDrawItem. Это событие возникает каждый раз, когда приложению необходимо нарисовать пункт в выпадающем списке (combo box). Событие определяется следующим образом:
- Подробности
- Родительская категория: VCL
- Категория: ComboBox, DBComboBox