Все выпуски  

RFpro.ru: Программирование на Delphi и Lazarus


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Лучшие эксперты по данной тематике

Асмик Гаряка
Статус: Советник
Рейтинг: 10653
∙ повысить рейтинг »
Орловский Дмитрий
Статус: Мастер-Эксперт
Рейтинг: 7020
∙ повысить рейтинг »
Boriss
Статус: Академик
Рейтинг: 1111
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И СОФТ / Программирование / Delphi и Lazarus

Номер выпуска:1656
Дата выхода:13.01.2014, 18:30
Администратор рассылки:Филатов Евгений Геннадьевич (Профессионал)
Подписчиков / экспертов:64 / 42
Вопросов / ответов:1 / 1

Консультация # 187705: Здравствуйте! У меня возникли сложности с таким вопросом: В процессе создания программы использую DBGrid. Для удобства пользования решил сделать сортировку в отображаемой таблице. Отыскал интересный вариант сортировки. Ссылка на описание сортировки.

Консультация # 187705:

Здравствуйте! У меня возникли сложности с таким вопросом: В процессе создания программы использую DBGrid. Для удобства пользования решил сделать сортировку в отображаемой таблице. Отыскал интересный вариант сортировки. Ссылка на описание сортировки.

Код :
procedure TForm1.DBGrid1TitleClick(Column: TColumn);
{$J+}
 const PreviousColumnIndex : integer = -1;
{$J-}
begin
  if DBGrid1.DataSource.DataSet is TCustomADODataSet then
  with TCustomADODataSet(DBGrid1.DataSource.DataSet) do
  begin
    try
      DBGrid1.Columns[PreviousColumnIndex].title.Font.Style :=
      DBGrid1.Columns[PreviousColumnIndex].title.Font.Style - [fsBold];
    except
    end;

    Column.title.Font.Style := 
    Column.title.Font.Style + [fsBold];
    PreviousColumnIndex := Column.Index;

    if (Pos(Column.Field.FieldName, Sort) = 1)
    and (Pos(' DESC', Sort)= 0) then
      Sort := Column.Field.FieldName + ' DESC'
    else
      Sort := Column.Field.FieldName + ' ASC';
  end;
end;


У меня несколько вопросов.
1- Если возможно объясните как пошагово код работает. Ибо не просто заниматся копипастом, а еще и разобратся.
2- Сортировка работает, но при следующем пуске программы отображение в DBGrid1 опять идет по id базы данных.
Как сделать чтобы отображалось по последней сортировке (настройки программы сохраняются в ini файл при закрытии программы WriteParams).
Получается что при пуске программы читается по чем сортировка в DBGrid1?
Вот понаписал!

Дата отправки: 05.01.2014, 18:06
Вопрос задал: Владимир (Посетитель)
Всего ответов: 1
Страница онлайн-консультации »


Консультирует Филатов Евгений Геннадьевич (Профессионал):

Здравствуйте, Владимир!

Начну с ответа на второй вопрос.

Объявляем глобальную переменную, в которой хранится номер столбца предыдущей сортировки
PreviousColumnIndex : integer = -1;

Пусть данные последней сортировки сохраняются в ini-файл командой
IniFile.WriteInteger('-----0-DBGrid1-----','Index', PreviousColumnIndex);
При этом в переменной PreviousColumnIndex уже хранится какое-либо неотрицательное значение ( т.е. индекс уже выбран )

В случае первого добавления кода в программу в ini-файле такого значения не будет, поэтому может выскочить ошибка. Чтобы этого избежать нужно изменить начальное значение переменной
PreviousColumnIndex : integer = 0;
Тогда если значения нет, то будет задана сортировка по первому столбцу по возрастанию. В дальнейшем после сохранения значения в файле будет работать нормально.

После первой прорисовки формы необходимо запустить код

if DBGrid1.DataSource.DataSet is TCust omADODataSet then
//На самом деле, эта проверка необязательна. Если есть 100% уверенности,
//что в источниках данных используется только ADO подключение, то можно
//убрать проверку. Но ошибкой наличие проверки не будет.

begin

//Здесь можно добавить отмену выделения заголовков всех столбцов таблицы, но лучше это
//настроить при разработке, чтобы изначально ни один заголовок не был выделен.

//Заносим в переменную номер столбца сортировки из ini-файла
PreviousColumnIndex := IniFile.ReadInteger('-----0-DBGrid1-----','Index', PreviousColumnIndex);
//Возможно, при первом запуске нужно будет заредактировать эту строку, т.к. в ini-файле еще нет такого параметра и может выскочить ошибка.

//Выделяем заголовок столбца новой сортировки
DBGrid1.Columns[PreviousColumnIndex].title.Font.Style:=
DBGrid1.Columns[PreviousColumnIndex].title.Font.Style + [fsBold];

//Запускаем сортировку по возрастанию, взяв имя поля из таблицы
TCustomADODataSet(DBGrid1.DataSource.DataSet).Sort :=
DBGrid1.Columns[PreviousColumnIndex].FieldName + ' ASC';

end;


Далее работает обработка события нажатия на заголовок столбца таблицы ( это ответ на первый вопрос ) .

procedure TForm1.DBGrid1TitleClick(Column: TColumn);
//Входным параметром является стобец таблицы
begin
//Проверяем, что источник данных является источником ADO
if DBGrid1.DataSource.DataSet is TCustomADODataSet then
//Не будем использовать оператор With для сокращения записей чтобы было видно, где какой объект задействован
begin
//Т.к. в переменной может храниться неверное значение, или она еще не определена, то делаем обработку возможной ошибки
try
//Отменяем выделение заголовка столбца предыдущей сортировки
DBGrid1.Columns[PreviousColumnIndex].title.Font.Style :=
DBGrid1.Columns[PreviousColumnIndex].title.Font.Style - [fsBold];
except
//Если возникла ошиб ка, ничего не делаем и выполняем последующие операторы
end;
//Устанавливаем выделение заголовка нажатого стобца
Column.title.Font.Style := Column.title.Font.Style + [fsBold];
//Заносим в переменную выделенный столбец, чтобы знать, какому заголовку потом отменять выделение
PreviousColumnIndex := Column.Index;
//Здесь двойная проверка. В первой проверяется, является ли текущая сортировка уже по выбранному столбцу и в случае верного результата проверяется наличие в сортировке ключевого слова DESC ( по убыванию ) .
if (Pos(Column.Field.FieldName, TCustomADODataSet(DBGrid1.DataSource.DataSet).Sort) = 1)
and (Pos(' DESC', TCustomADODataSet(DBGrid1.DataSource.DataSet).Sort)= 0) then
//Если сортировка уже по текущему столбцу и не по убыванию, то устанавливаем
TCustomADODataSet(DBGrid1.DataSource.DataSet).Sort := Column.Field.FieldName + ' DESC'
else
//Во всех остальных случаях устанавливаем сортировку по выбранном у столбцу по возрастанию
TCustomADODataSet(DBGrid1.DataSource.DataSet).Sort := Column.Field.FieldName + ' ASC';
end;end;

Кажется все.

С уважением.

Консультировал: Филатов Евгений Геннадьевич (Профессионал)
Дата отправки: 12.01.2014, 13:55
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Оценить выпуск | Задать вопрос экспертам

главная страница  |  стать участником  |  получить консультацию
техническая поддержка  |  восстановить логин/пароль

Дорогой читатель!
Команда портала RFPRO.RU благодарит Вас за то, что Вы пользуетесь нашими услугами. Вы только что прочли очередной выпуск рассылки. Мы старались. Пожалуйста, оцените его. Если совет помог Вам, если Вам понравился ответ, Вы можете поблагодарить автора - для этого в каждом ответе есть специальные ссылки. Вы можете оставить отзыв о работе портале. Нам очень важно знать Ваше мнение. Вы можете поближе познакомиться с жизнью портала, посетив наш форум, почитав журнал, который издают наши эксперты. Если у Вас есть желание помочь людям, поделиться своими знаниями, Вы можете зарегистрироваться экспертом. Заходите - у нас интересно!
МЫ РАБОТАЕМ ДЛЯ ВАС!



В избранное