Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Выделение в 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 набора данных.


Наверх

Титульная страница Поиск, карта сайта Написать письмо