Совместное использование StringGrid и ComboBox значительно
упрощает ввод данных в таблицу.
Например есть таблица, и есть некий фиксированный набор строковых данных, которые следует вводить в ячейки одного из столбцов (например, фамилии или наименования учреждений и т.д.). Согласитесь, что печатать каждый раз одно и то же не совсем удобно. Намного проще кликнуть на нужной ячейке и выбрать нужные данные из списка, который раскрывается прямо из этой ячейки. Кстати, такой механизм сейчас широко используется во всех современных СУБД, но требует больших затрат ресурсов, т.к. для каждой из строк таблицы создается объект типа ComboBox. Предлагаю альтернативный способ, при котором одну таблицу обслуживает один Combo, который появляется в нужное время в нужном месте. Если в вашей таблице имеется несколько столбцов, для которых следует применить данную задачу, то для повышения быстродействия нужно создавать Combo по количеству обслуживаемых столбцов.
Идея проста: 1) по событию onMouseUp на таблице строк определяем верхнюю-левую координату ячейки, по которой мы кликнули.
2) Затем «ставим» в эту координату наш ComboBox, в который предварительно уже записан набор строк. Естественно, что высота и ширина этого ComboBox-a должна быть настроена под соответствующую высоту и ширину ячейки, в которой ему должно появиться. А чтобы создать эффект прозрачности, в свойство «ComboBox1.Text» запишите содержимое ячейки, на которой этот объект сейчас расположен.
3) Теперь остается последнее – как вставить в ячейку значение из ComboBox1. Для этого используется событие onClick объекта ComboBox1.
Напишите в обработчике примерно такой код:
C:= StringGrid1.Col;
R:= StringGrid1.Row;
I:=ComboBox1.ItemIndex;
StringGrid1.Cells[C,R] := ComboBox1.Items [I];
После выполнения этого кода выбранное в раскрывающемся меню значение появится в нужной ячейке. Как осуществить первые два пункта объясню попозже, т.к. сейчас мало времени. Поверьте – это совсем не сложно. Еще я хочу показать в дальнейшем, как используя данные объекты + объект TQuery обеспечить удобный интерфейс с некоторой таблицей базы данных. То есть работаете вы с символьными строками и не заботитесь о том, какой у этих строк внешний ключ для связанной таблицы. Кому надо – поймет.
Итак, рассмотрим способ, которым можно определить координату верхнего левого угла ячейки в таблице. Для этого существует метод объекта TstringGrid –« procedure MouseToCell(X, Y: Integer; var ACol, ARow: Longint);». И применять его мы будем в обработчике событий onMouseUp объекта TstringGrid.
Ниже приводится код в этом обработчике, который определяет нужные координаты и устанавливает в них ComboBox1.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs,
Grids,
StdCtrls;
type
TForm1
= class(TForm)
ComboBox1: TComboBox;
StringGrid1: TStringGrid;
procedure StringGrid1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure FormCreate(Sender: TObject);
private
{
Private declarations }
public
{
Public declarations }
end;
var
Form1:
TForm1;
implementation
{$R *.DFM}
procedure TForm1.StringGrid1MouseUp(Sender:
TObject; Button: TMouseButton;
Shift:
TShiftState; X, Y: Integer);
var
RRow1,RCol1,RRow,RCol,X1,Y1 : integer;
begin
X1:=X;Y1:=Y;
StringGrid1.MouseToCell(X, Y, RCol, RRow);
RCol1:=RCol;
RRow1:=RRow;
while
RCol1 = RCol do
begin
Dec(X1);
StringGrid1.MouseToCell(X1, Y1,RCol1, RRow1);
end;
while
RRow1 = RRow do
begin
Dec(Y1);
StringGrid1.MouseToCell(X1, Y1,RCol1, RRow1);
end;
Y1:=Y1+StringGrid1.Top;
X1:=X1+StringGrid1.Left;
ComboBox1.Top:=Y1;
ComboBox1.Left:=X1;
ComboBox1.Visible := True;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
//
ComboBox1.Visible := False;
end;
end.