![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Выделение в DBGrid [D6, IB6.x]
Belkova © (2003-05-05 21:23:00)Мастера delphi! Подскажите, как реализовать выделение нескольких строк в DBGrid? Заранее благодарна.
Belkova (2003-05-06 12:20:00) [1]Всем спасибо! Попробую.
NAlexey (2003-05-06 09:08:00) [2]Я пользуюсь методом описанным на сайте "Королевство Делфи" и довольно успешно:
1) Необходимо иметь в наборе данных уникальное поле, типа RecNo или RecID по которому можно однозначно идентифицировать строку. Если такого поля нет, необходимо создать его искусственно, т.е добавить в набор даннх вычисляемое поле, и наOnCalcFieldsповесить приблизительно такое:
procedure ADOQuery1CalcFields(DataSet: TDataSet);
begin
if DataSet.RecNo <= 0 then
DataSet.FieldByName("CLC").AsInteger := 1
else
DataSet.FieldByName("CLC").AsInteger := DataSet.RecNo;
end;
Теперь поле CLCв наборе данных будет уникальным.
2) В publicобъявляешьListSelect: TList;
3) В FormCreate(или в секции initialization) -ListSelect := TList.Create;В FormDestroy(или в секции finalization) -ListSelect.Free;
4)На OnClick по сетке вешаешь примерно такое:
procedure TForm1.DBGrid1Click(Sender: TObject);
var
AValue: integer;
Grid: TDBGrid;
begin
Grid := Sender as TDBGrid;
with ListSelect do
begin
AValue := Grid.DataSource.DataSet.FieldByName("CLC").AsInteger;
if IndexOf(Pointer(AValue)) >= 0 Then
Delete(IndexOf(Pointer(AValue)));
else
Add(Pointer(AValue));
end;
end;
5) НаOnDrawColumnCellсетки вешаешь примерно такое:
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject;
const Rect: TRect; DataCol: Integer; Column: TColumn;
State: TGridDrawState);
var
AValue: integer;
begin
AValue := Column.Field.DataSet.FieldByName("CLC").AsInteger;
if (ListSelect.IndexOf(Pointer(AValue)) >= 0) and
not (ASelected and AFocused)
then begin
AColor := clInfoBk;
AFont.Color := clInfoText;
end;
end;
Кажется все. Приблизительно так должно работать.
-=Guest=- (2003-05-05 22:06:00) [3]Есть удобный грид в EhLib. Возможно выделение строк не подряд, а также выделение ячеек, например в середине грида. Хорошая вещь.
MsGuns (2003-05-05 22:01:00) [4]Это метод не годится, если надо помечать записи не подряд и без промежуточных кликов в гриде. Для этого случая надо использовать некоторое неотображаемое в гриде поле для записи в него признака отметки и с помощью события грида OnDrawColumnCell окрашивать такие строки (записи которых содержат признак выбрано) в спец.цвет или рисовать иконку (чекбокс) в колонке, специально для этого добавленной.
-=Guest=- (2003-05-05 21:31:00) [5]TDBGrid.Options.dgMultiSelect := True
Выделенные записи добавляются Bookmark набора данных.