Как сделать выпадающий список для StrigGrid в Delphi (7 - XE5)
Просто вот нужно что бы в StringGrid в среде Delphi (тестировал на версиях 7 и ХЕ3, так что думаю на остальных тоже буде работать) одна из колонок была исполнена в виде выпадающего списка. Спросите зачем? Да, есть при подключении к базе данных возможность такое организовать в DBGrid, но вот столкнулся с задачей что писать в базу нужно еще и другие данные и по факту только после полного заполнения таблицы (в моем случае StringGrid).
Пришлось искать выход. Как результат, код ниже позволяет организовать в нужной колонке стринггрида выпадающий список с помощью combobox.
На форме размещаем компоненты Stringgrid (name у него будет StringGrid1) и ComboBox (ComboBox1) и прописываем код нужным процедурам формы и компонентов.
procedure TForm1.FormCreate(Sender: TObject) begin StringGrid1.DefaultRowHeight := ComboBox1.Height; ComboBox1.Visible := False; ComboBox1.Items.Clear; // указываем сам список ComboBox1.Items.Add('элемент списка 1'); ComboBox1.Items.Add('элемент списка 2'); // конец списка end; procedure TForm1.ComboBox1Change(Sender: TObject); begin StringGrid1.Cells[StringGrid1.Col, StringGrid1.Row] := ComboBox1.Items[ComboBox1.ItemIndex]; ComboBox1.Visible := False; end; procedure TForm1.ComboBox1Exit(Sender: TObject); begin StringGrid1.Cells[StringGrid1.Col, StringGrid1.Row] := ComboBox1.Items[ComboBox1.ItemIndex]; ComboBox1.Visible := False; end; procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean); var R: TRect; begin if ((ACol = 3) and (ARow <> 0)) then begin R := StringGrid1.CellRect(ACol, ARow); R.Left := R.Left + StringGrid1.Left; R.Right := R.Right + StringGrid1.Left; R.Top := R.Top + StringGrid1.Top; R.Bottom := R.Bottom + StringGrid1.Top; /// или точные координаты /// ComboBox1.Left := R.Left + 1; ComboBox1.Top := R.Top + 1; ComboBox1.Width := (R.Right + 1) - R.Left; ComboBox1.Height := (R.Bottom + 1) - R.Top; /// или точные координаты /// ComboBox1.Visible := True; ComboBox1.SetFocus; end; CanSelect := True; end;
за код спасибо сайту http://www.sql.ru
Возможно решение не самое красивое и программно правильное, но рабочее.