Советы по Delphi


Dbgrid и множественный выбор


Тема: TDBGrid и множественный выбор записей (Multi-Selecting Records)

При включении флажка [dgMultiSelect] в свойстве-наборе Options компонента DBGrid, вы добавляете к табличной сетке возможность множественного выбора записей.

Выбранные вами записи представлены в виде закладок и храняться в свойстве SelectedRows.

Свойство SelectedRows является объектом, имеющим тип TBookmarkList. Его свойства и методы описаны ниже.

    // property SelectedRows: TBookmarkList read FBookmarks;
//   TBookmarkList = class //   public


{* Метод Clear освобождает все выбранные в DBGrid записи *} // procedure Clear;
{* Метод Delete удаляет все выбранные строки из набора данных *} // procedure Delete;
{* Метод Find определяет наличие закладки в выбранном списке. *} // function  Find(const Item: TBookmarkStr; //      var Index: Integer): Boolean;
{* Метод IndexOf возвращает индекс закладки, расположенной в свойстве Items. *} // function IndexOf(const Item: TBookmarkStr): Integer;
{* Метод Refresh возвращает логическую величину, уведомляющую о том, что в то время, пока в табличной сетке была выбрана запись, были добавлены (удалены) какие-то данные. Метод Refresh может быть использован для обновления списка выбранных записей для уменьшения возможности получения удаленной записи. *} // function Refresh: Boolean;  True = orphans found
{* Свойство Count возвращает количество выбранных в настоящий момент элементов в DBGrid *} // property Count: Integer read GetCount;
{* Свойство CurrentRowSelected содержит логическую величину, зависящую от того, выбрана текущая строка или нет. *} // property CurrentRowSelected: Boolean //      read GetCurrentRowSelected //      write SetCurrentRowSelected;
{* Свойство Items - TStringList TBookmarkStr *} // property Items[Index: Integer]: TBookmarkStr //      read GetItem; default;
//  end;

unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Grids, DBGrids, DB, DBTables;
type TForm1 = class(TForm) Table1: TTable; DBGrid1: TDBGrid; Count: TButton; Selected: TButton; Clear: TButton; Delete: TButton; Select: TButton; GetBookMark: TButton; Find: TButton; FreeBookmark: TButton; DataSource1: TDataSource; procedure CountClick(Sender: TObject); procedure SelectedClick(Sender: TObject); procedure ClearClick(Sender: TObject); procedure DeleteClick(Sender: TObject); procedure SelectClick(Sender: TObject); procedure GetBookMarkClick(Sender: TObject); procedure FindClick(Sender: TObject); procedure FreeBookmarkClick(Sender: TObject); private { Private declarations } public { Public declarations } end;
var Form1: TForm1; Bookmark1: TBookmark; z: Integer;
implementation
{$R *.DFM}
//Пример использования свойства Count procedure TForm1.CountClick(Sender: TObject); begin if DBgrid1.SelectedRows.Count > 0 then begin showmessage(inttostr(DBgrid1.SelectedRows.Count)); end; end;
//Пример использования свойства CurrentRowSelected procedure TForm1.SelectedClick(Sender: TObject); begin if DBgrid1.SelectedRows.CurrentRowSelected then showmessage('Выбрана'); end;
//Пример использования метода Clear procedure TForm1.ClearClick(Sender: TObject); begin dbgrid1.SelectedRows.Clear; end;
//Пример использования метода Delete procedure TForm1.DeleteClick(Sender: TObject); begin DBgrid1.SelectedRows.Delete; end;
{* Данные пример проходит в цикле все выбранные записи табличной сетки и отображает второе поле набора данных.
Метод DisableControls используется в случае, когда необходимо запретить обновление DBGrid при изменении набора данных. Последняя позиция набора данных сохраняется как TBookmark.
Метод IndexOf вызывается при необходимости проверить существование закладки. Решение использовать метод IndexOf, а не Refresh, должно приниматься исходя из специфики приложения. *}
procedure TForm1.SelectClick(Sender: TObject); var x: word; TempBookmark: TBookMark; begin DBGrid1.Datasource.Dataset.DisableControls; with DBgrid1.SelectedRows do if Count > 0 then begin TempBookmark:= DBGrid1.Datasource.Dataset.GetBookmark; for x:= 0 to Count - 1 do begin if IndexOf(Items[x]) > -1 then begin DBGrid1.Datasource.Dataset.Bookmark:= Items[x]; showmessage(DBGrid1.Datasource.Dataset.Fields[1].AsString); end; end; end; DBGrid1.Datasource.Dataset.GotoBookmark(TempBookmark); DBGrid1.Datasource.Dataset.FreeBookmark(TempBookmark); DBGrid1.Datasource.Dataset.EnableControls; end;
{* Данный пример позволит вам установить закладку и затем найти ее в списке выбранных записей компонента DBGrid. *}
//Устанавливаем закдадку procedure TForm1.GetBookMarkClick(Sender: TObject); begin Bookmark1:= DBGrid1.Datasource.Dataset.GetBookmark; end;
//Освобождаем закладку procedure TForm1.FreeBookmarkClick(Sender: TObject); begin if assigned(Bookmark1) then begin DBGrid1.Datasource.Dataset.FreeBookmark(Bookmark1); Bookmark1:= nil; end; end;
//Испольуем метод Find для установления позиции //записи-закладки в списке выбранных записей компонента DBGrid procedure TForm1.FindClick(Sender: TObject); begin if assigned(Bookmark1) then begin if DBGrid1.SelectedRows.Find(TBookMarkStr(Bookmark1),z) then showmessage(inttostr(z)); end; end;
end.

[001010]



Содержание раздела