Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > Знак сортировки (стрелка/треугол.) в title DBGrid


Автор: chikistbuch 7.4.2012, 19:19
Подскажите, как добавить стрелочку в заголовок колонки DBGrid'a, которая бы указывала о сортировке, как здесь:

http://s1.ipicture.ru/Gallery/Viewfull/9797878.html

Вот как это сделано в EhLib'e:

http://s1.ipicture.ru/Gallery/Viewfull/9797932.html

Неужели никто не знает как это сделать????  smile 

Автор: TANGOR 14.4.2012, 06:15
Ну во первых этот грид на картинке не обычный DBGrid а DefExpress-совский
там всё это есть.
а если нужна сортировка по клику на заголовок, то:

//Если DBGrid к Query присоединен то так:
procedure TForm1.FormCreate(Sender: TObject);
Var path:string;
begin
  GetDir(0,path);
  ADOConnection1.Close;
  ADOConnection1.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source='+path+'\DB.mdb;Persist Security Info=False';
  ADOConnection1.Connected:=true;
  QSQL:='SELECT * from main ';
  With ADOQuery2 do begin
    Close;
    SQL.Clear;
    SQL.Add(QSQL);
    Open;
  end;
  ADOTable1.Open;
end;
 
//В событии DBGrid OnTitleClick прописываем.

procedure TForm1.DBGrid1TitleClick(Column: TColumn);
Var f:string;
begin
  f:= Column.FieldName;//без этой переменной у меня работать не хочет
  with ADOQuery2 do
  begin
     Close;
     SQL.Clear;
     SQL.Add(QSQL);
     SQL.Add('ORDER BY '+f);
     Open;
  end;
end;
 
 
//Если Table к DBGrid подключен то в OnTitleClick пишем.

procedure TForm1.DBGrid2TitleClick(Column: TColumn);
Var f:string;
begin
    f:= Column.FieldName;
    ADOTable1.Sort:=f;
end;
 

Автор: chikistbuch 14.4.2012, 08:09
Цитата(TANGOR @  14.4.2012,  06:15 Найти цитируемый пост)
Ну во первых этот грид на картинке не обычный DBGrid а DefExpress-совскийтам всё это есть.



а где его взять и бесплатен ли он?

Автор: Akella 14.4.2012, 11:06
devexporess.com
такие гриды бесплатными не бывают

Автор: chikistbuch 14.4.2012, 14:01
Так что, в стандартный DBGrid эту стрелку вставить нельзя???? Подскажите хоть как узнать ширину колонки, координату начала колонки, хоть что-то к чему можно было бы привязаться

Автор: superVad 14.4.2012, 16:27
Цитата(chikistbuch @  14.4.2012,  13:01 Найти цитируемый пост)
Так что, в стандартный DBGrid эту стрелку вставить нельзя???? Подскажите хоть как узнать ширину колонки, координату начала колонки, хоть что-то к чему можно было бы привязаться

Как стандартный - не знаю. Можно jvcl грид юзать (ultim хороший), старый бесплатный EH (3.6 кажется).

Автор: Akella 14.4.2012, 17:44
Цитата(chikistbuch @  14.4.2012,  14:01 Найти цитируемый пост)
Так что, в стандартный DBGrid эту стрелку вставить нельзя????


Кто сказал, что нельзя? Ты плохо ищешь. Я уверен, что в интернете должны быть готовые примеры.

Добавлено через 1 минуту и 2 секунды
Цитата(chikistbuch @  14.4.2012,  14:01 Найти цитируемый пост)
Подскажите хоть как узнать ширину колонки, 


А что, свойства, методы и события грида и колонок самому изучить нельзя, справку почитать?

Автор: chikistbuch 15.4.2012, 17:16
Дружище, подскажи как к этим метотодам или как они называються, константы что ли обращаться

Код

Delphi
type TColumnValue = (cvColor, cvWidth, cvFont, cvAlignment, cvReadOnly, cvTitleColor, cvTitleCaption, cvTitleAlignment, cvTitleFont, cvImeMode, cvImeName)



Value    Indicates changes to 

cvColor    
The column's Color property. 

cvWidth    
The column's Width property. 

cvFont    
The column's Font property. 

cvAlignment    
The column's Alignment property. 

cvReadOnly    
The column's ReadOnly property. 

cvTitleColor    
The column title's Color property. 

cvTitleCaption    
The column title's Caption property. 

cvTitleAlignment    
The column title's Alignment property. 

cvTitleFont    
The column title's Font property. 

cvImeMode    
The column's ImeMode property. 

cvImeName    
The column's ImeName property.

Автор: Akella 16.4.2012, 11:12
к ним не надо обращаться. Это константы. Значения констант присваиваются свойствам, например, или переменным.

Автор: chikistbuch 16.4.2012, 18:13
Цитата(Akella @  16.4.2012,  11:12 Найти цитируемый пост)
Значения констант присваиваются свойствам, например, или переменным

Так как присвоить переменной значение константы

Код

a:= что?

Хотя мне это и не поможет в данной ситуации, но на будущее помогло бы разобраться, Спасибо.

Автор: Akella 16.4.2012, 19:50
Цитата(chikistbuch @  16.4.2012,  18:13 Найти цитируемый пост)
Так как присвоить переменной значение константы


Код
a := b;


это же азЫ О_о
как же ты без них собрался программировать

Автор: chikistbuch 16.4.2012, 19:55
как

Код

var
 i: integer;
begin
     i:=cvWidth;  //так что ли??
end;



до этого cvWidth нужно же как-то добраться

мы же не пишем

Код

   caption:='123';
// мы пишем
form1.caption:='123';

Так вот вопрос, что нужно написать чтобы добраться, к примеру, к cvWidth

Кстати, спасибо что так быстро отреагировал!!

Автор: Akella 16.4.2012, 20:11
Цитата(chikistbuch @  16.4.2012,  19:55 Найти цитируемый пост)
Так вот вопрос, что нужно написать чтобы добраться, к примеру, к cvWidth


Цитата(Akella @  16.4.2012,  11:12 Найти цитируемый пост)
к ним не надо обращаться. Это константы. Значения констант присваиваются свойствам, например, или переменным. 


Автор: chikistbuch 16.4.2012, 20:13
ничего не понял, нет чтобы нормально объяснить! ну да ладно, буду сам пытаться (((((((((( smile 

Автор: Akella 16.4.2012, 20:15
Значение cvWidth нужно чему-то присвоить.

Добавлено через 1 минуту и 52 секунды
может быть так?

ColumnValue := [здесь перечисляй нужные константы];

например:
Код
ColumnValue := [cvColor, cvTitleColor, ....];



Цитата(chikistbuch @  15.4.2012,  17:16 Найти цитируемый пост)
Value    Indicates changes to 

cvColor    
The column's Color property. 

cvWidth    
The column's Width property. 

cvFont    
The column's Font property. 

cvAlignment    
The column's Alignment property. 

cvReadOnly    
The column's ReadOnly property. 

cvTitleColor    
The column title's Color property. 

cvTitleCaption    
The column title's Caption property. 

cvTitleAlignment    
The column title's Alignment property. 

cvTitleFont    
The column title's Font property. 

cvImeMode    
The column's ImeMode property. 

cvImeName    
The column's ImeName property. 


Добавлено через 2 минуты и 18 секунд
Тебе что, сложно в диспетчер свойств посмотреть?

Добавлено через 3 минуты и 57 секунд
ну и можно проверять
Код
if cvColor in ColumnValue then ..

почитай про множества и перечислимые типы

Автор: chikistbuch 16.4.2012, 20:20
СПАСИБО!!! Буду пробовать!

Автор: chikistbuch 27.4.2012, 00:54
 smile  Спустя более 20 суток получилось!!!!!!!!!!!!
Расскажу максимально подробно, чтобы даже таким валенкам как я было ясно:

Определяем новый класс TDBGrid
Код

unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, ........, Vcl.Samples.Spin;

type
   TDBGrid = class(Vcl.DBGrids.TDBGrid) //делаем это чтобы можно было обратится к процедуре и отрисовать стрелочку в title'e
   protected
     // Переопределяем метод отрисовки ячейки
     procedure DrawCell(ACol, ARow: Longint; ARect: TRect; AState: TGridDrawState); override;
  end;

type
  TForm1 = class(TForm)
    MySQLUniProvider1: TMySQLUniProvider;
    MainMenu1: TMainMenu;
..........



Процедура DrawGridTitle закрашивает все что было отрисовано самим Grid'ом и поверх него пишет заголовок нужной колонки соблюдая требуемый отступ для стрелки
Код

procedure DrawGridTitle(Column: TColumn; ARect: TRect); //закрашивает заголовок колонки Column и поверх пишет текст с отступом от левого края form1.ImageList2.Height
begin
      SetRect(ARect, ARect.Left, 0, ARect.Right, ARect.Bottom);
      InflateRect(ARect, -2, -2); { Поправка на окантовку Titles }
      with form1.DBGrid1.Canvas do begin
        Brush.Color := form1.DBGrid1.FixedColor;
        FillRect(ARect); // Заливаем область заголовка, стерев все, что там  нарисовано DBGrid'ом
        ARect.Left:= ARect.Left+form1.ImageList2.Height;
        DrawText(Handle, PChar(Column.Title.Caption), -1, ARect, DT_LEFT);
      end;
end;



Как я понял DrawCell вызывается каждый раз при необходимости перерисовки ячеки (любое изменение Grid'a)
в переменной order_n содержится номер колонки по которой будет производится сортировка данных, т.е. колонка в заголовке которой рисуем стрелку
updown: boolean - я её использую для определения направления рисования стрелки 
Код

procedure TDBGrid.DrawCell(ACol, ARow: Longint; ARect: TRect; AState: TGridDrawState);//процедура для отрисовки изображения в title DBGrid'a
begin                                                                                 //вызывается при отрисовки ячейки
  // Вызываем стандартную отрисовку...
  inherited;
  //...а затем рисуем свои картинки на заголовках!
  if (gdFixed in AState) then
    if (ACol=order_n) then begin
      DrawGridTitle(Form1.DBGrid1.Columns[(ACol-1)], ARect);//делаем смещение названия колонки для стрелочки. У меня (ACol-1), т.к. первую колонку я скрыл, а может потому что где-то нумерация колонок с 0 начинается, а где-то с 1... поздно уже хочу спать )))

      if updown then form1.ImageList2.Draw(Canvas, ARect.Left, ARect.Top, 0) //вверх.
        else form1.ImageList2.Draw(Canvas, ARect.Left, ARect.Top, 1);       //вниз

    end;
end;



Ну и наконец-то обработчик грида при нажатии на заголовок
Код

procedure TForm1.DBGrid1TitleClick(Column: TColumn);
begin
  form1.DBGrid1.InvalidateTitles;//обновляет (перерисовывает) title и тем самым затирает ранее нарисованные стрелки и текст с отступом

  if (column.Index+1)=order_n then begin
    if updown then updown:=false   //если бы  мне кто-то подсказал как это не городить и сделать типа updown:=updown*(-1) 
      else updown:=true;
  end
  else begin
    order_n:=column.Index+1;
    order:=column.Title.ToString;
    updown:=false;
  end;
end;


Вот что получилось, я счастлив  smile :

http://s2.ipicture.ru/

Автор: superVad 27.4.2012, 09:32
Цитата(chikistbuch @  26.4.2012,  23:54 Найти цитируемый пост)
if updown then updown:=false   //если бы  мне кто-то подсказал как это не городить и сделать типа updown:=updown*(-1)       else updown:=true;


Код

  updown := not updown;

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)