Сортировка таблицы по щелчку мыши
В своё время, разрабатывая базу данных, я столкнулся с задачей сортировки колонок таблицы по щелчку мыши в динамически созданной таблице. В Интернете предлагалось несколько вариантов реализации. На практике у меня появились свои соображения, в результате чего возникла вот эта статья.
Теперь о самой задаче. К примеру, нужно динамически создать базу данных Paradox с тремя полями и реализовать сортировку её колонок по щелчку мыши (рис.1):
Рис.1
Сортировка базы данных, как показала практика, отличается в статическом и динамическом вариантах. Коротко о вариантах базы данных:
-
статический вариант создания базы данных, когда в редакторе, к примеру, в DataBase Desktop создаются поля, указывается их размер, тип, различные параметры, при этом есть возможность статически создать индексное поле, сделав в этом редакторе активным поле Key.
в этом случае сортировку по щелчку мыши можно будет сделать следующим образом:
в обработчике события OnTitleClick компонента TDBGrid, наступающего при щелчке мыши по шапке колонки, анализируем свойство Column.FieldName, значение которого даст нам имя поля столбца. Затем для сортировки по этому полю задаем его текущим индексным полем всей базы данных:
Table1.IndexFieldsName:=Column.FieldName;
тем самым производится сортировка по убыванию. Проблем здесь особых нет. Но есть они в другом варианте базы данных.
При создании базы данных методом CreateTable в качестве параметров указываются тип поля, размер поля и обязательность его заполнения. Но подводный камень здесь - невозможность динамически создать главный индекс, который нужен нам для того, чтобы сортировать таблицу. Вернее, ошибки при создании главного индекса происходить не будет, как, впрочем и самого создания индекса. И сортировки первой колонки, следовательно, происходить не будет. Отсюда проблема при сортировке. Получается, что единственный вариант - создавать только статические таблицы.
Мной предлагается решение: сделать сортировку при помощи SQL запроса, где при каждом событии клика мыши по шапке колонки реализуется следующий обработчик:
procedure TForm1.DBGrid2TitleClick(Column: TColumn);
begin
try
if Column.FieldName='Number' then //если поле, по которому был произведён
begin // - Number, то выполняем сортировку по этому полю
Query1.Close; // закрываем базу данных
Query1.SQL.Clear;
//подготавливаем запрос
Query1.SQL.Add('select * from "statistic.db" ORDER BY Number Desc');
//собственно SQL запрос
Query1.Open;
//выполняем запрос
end;
|
Таким образом, решение достаточно простое - анализируем при клике название поля и производим открытие базы данных SQL запросом с сортировкой по названию поля. При сортировке таким способом достаточно большого количества строк в базе данных, заметных торможений не наблюдалось.
|