Вы отображаете данные в столбцах DBGrid и позволяете сортировать их, щелкая по заголовку столбца.
Вам нужны эти объекты:
- TForm - Form1
- TTable - Table1, соединенная с Вашей таблицей
- TDataSource - DataSource1
- TDBGrid - DBGrid1
Создайте вторичные индексы для требуемых столбцов.
В конце программы Вы должны уничтожить эти индексы.
Сортировать столбцы DBGrid, нажимая на заголовке столбца.
Title-Text-FontStyle сортируемого столбца установлен в fsBold
// Здесь создаем вторичные индексы
// только для требуемой таблицы:
procedure TForm1.FormCreate(Sender: TObject);
begin
// поместите здесь один вызов для
// каждого вторичного Index
CreateSX(Table1, 'FirstName');
CreateSX(Table1, 'SecondName');
CreateSX(Table1, 'Phone');
CreateSX(Table1, 'BirthDate');
// ... и так далее
Table1.Open;
end;
// Здесь удалите все вторичные индексы
// при выходе из приложения:
procedure TForm1.FormCloseQuery(
Sender: TObject; var CanClose: Boolean);
begin
Table1.Close;
DeleteSX(Table1);
end;
// В этой процедуле создаем вторичные индексы:
procedure TForm1.CreateSX(TableX: TTable; cFieldname: string);
begin
with TableX do begin
// таблица должна быть открыта с эксклюзивным доступом
Active := False;
Exclusive := True;
IndexDefs.Update;
Active := True;
// если имя поля не существует, создаем новый вторичный индекс
if IndexDefs.IndexOf(cFieldName) = -1 then begin
AddIndex(cFieldname, cFieldname, []);
end;
// закроем таблицу
Active := false;
Exclusive := False;
end;
end;
// Эта процедура удаляет вторичные индексы:
procedure TForm1.DeleteSX(TableX: TTable);
var
I: Integer;
begin
TableX.Active := False;
TableX.IndexDefs.Update;
// Цикл по всем индексам
for I := TableX.IndexDefs.Count - 1 downto 0 do begin
// игнорируем первичные индексы
if (TableX.IndexDefs.Items[I].Options *
[ixPrimary]) <> ([ixPrimary]) then
// Это вторичный индекс. Удаляем его.
TableX.DeleteIndex(TableX.IndexDefs.Items[I].fields);
end;
end;
// Эта процедура сортирует столбцы DBGrid:
procedure TForm1.DBGrid1TitleClick(Column: TColumn);
var
I: Integer;
begin
Table1.IndexDefs.Update;
// если индекс существует для этого столбца, тогда изменяем его
if Table1.IndexDefs.IndexOf(Column.FieldName) > -1 then begin
Table1.IndexFieldNames := Column.FieldName;
with TDBGrid(Column.Grid) do begin
for I := 0 to Columns.Count - 1 do begin
// изменяем также стиль шрифта
if Columns[I] = Column then
Columns[I].Title.Font.Style :=
Columns[I].Title.Font.Style + [fsBold]
else
Columns[I].Title.Font.Style :=
Columns[I].Title.Font.Style - [fsBold];
end;
end;
end;
end;
По материалам http://delphi.3000.com
|