Что такое прямоугольник щелкнутого заголовка в TDBGrid в Delphi?

Я хотел бы определить экранные координаты ячейки заголовка, которая была нажата в событии TDBGrid TitleClick (столбец: TColumn).

Я могу использовать свойство ColWidths (предоставленное через объявление типа TDBGrid = class(DBGrids.TDBGrid)), но мне трудно определить, были ли столбцы переупорядочены пользователем в сочетании с горизонтальной прокруткой TDBGrid. Я также хотел бы отслеживать, где находится этот столбец во время последующих перемещений и изменений размера, отмечая также, что этот столбец можно прокручивать вне сетки.

Я долго занимался этой проблемой и неплохо разбираюсь в Delphi, так что это не праздный вопрос.


person Jonathan    schedule 22.07.2012    source источник
comment
Почему вы должны беспокоиться, если столбец находится вне сетки? Очевидно, столбец виден, если пользователь может нажать на заголовок, верно?   -  person Hendra    schedule 22.07.2012
comment
Я использую заголовок, чтобы изменить индексы, и я показываю небольшое растровое изображение рядом с этим столбцом, чтобы указать, какой текущий порядок сортировки. Если сетка отсортирована в порядке, который находится в поле, которое в данный момент не отображается, я не хочу видеть изображение.   -  person Jonathan    schedule 22.07.2012
comment
Для этого есть бесплатные компоненты, такие как компонент smdbgrid с (scalabium.com) и JvDbgrid с сайта (jvcl.delphi-jedi.org).   -  person Hendra    schedule 22.07.2012
comment
Я реализую сложную TDBGrid, в которой TEdit будет плавать под каждым заголовком столбца, где пользователь может вводить фильтры. Позже это будет расширено до пользовательского TComboBox, где для каждого столбца можно ввести несколько фильтров и диапазонов, поэтому я создаю свой собственный компонент, но все это происходит на лету, поскольку он входит в TFrame, что технически делает сам TFrame моим полным компонент. С таким уровнем настройки легче работать с более простой базой, кроме того, я не собираюсь использовать пользовательский компонент для того, что вы решили для меня в 1 строке кода (строка = 0, поскольку я смотрю на заголовок!)   -  person Jonathan    schedule 22.07.2012
comment
Ааа, вижу, теперь понял. Пользовательские компоненты, о которых я упоминал выше, конечно, имеют не только функцию сортировки, но и многое другое. Мое намерение упомянуть их было в том, что вы, возможно, захотите изучить их функции и реализовать только те дополнительные, которые еще не реализованы, поэтому вам не нужно начинать с нуля.   -  person Hendra    schedule 23.07.2012


Ответы (2)


Используя трюк в Как получить координаты экрана Ячейка DBGrid, я написал:

type
...
  THackedGrid = class(TDBGrid);
...
implementation
...
procedure TForm1.DBGrid1TitleClick(Column: TColumn);
var
  currRow : Integer;
  rect : TRect;
begin
  currRow := THackedGrid(DBGrid1).Row;
  rect := THackedGrid(DBGrid1).CellRect(Column.Index+1,currRow);
end;

Это то, что вы хотите? Координата в прямоугольнике относится к сетке.

person Hendra    schedule 22.07.2012
comment
Ага, хороший спасибо. Я был так сосредоточен на захвате ячеек или столбцов (как мы могли в старые времена, когда TDBGrid произошел от TDrawGrid), что пропустил это очевидное, спасибо! Незначительное улучшение, как упоминалось в вопросе, заключается в том, что вы объявляете тип TDBGrid = class(DBGrids.TDBGrid); перед объектом формы он приведет DBGrid к локальному определению с дополнительным бонусом, заключающимся в том, что в этом блоке можно получить доступ к закрытым свойствам локально объявленных классов. Например, вы можете получить доступ к объявленным в частном порядке параметрам вашей формы из процедур вне ее, даже в разделе инициализации. - person Jonathan; 22.07.2012

Я начал работать над очень похожей сеткой вчера на работе. Я накладываю элемент управления на фиксированную строку сетки, как вы упомянули, активируя его при щелчке правой кнопкой мыши. Это то, что я делаю до сих пор, а затем устанавливаю фильтр в своем наборе данных. Однако у меня возникают проблемы при использовании множественного выбора в комбо. Мне было бы очень интересно посмотреть, что вы сделали с момента последнего поста.

procedure Tf_well.dbWellGridMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
var cell  : TGridCoord;
begin
    if Button = mbRight then
    begin
        Cell := dbWellGrid.MouseCoord(X, Y);
        //  showmessage(dbWellGrid.Columns[Cell.X-1].DisplayName);

        case Cell.X-1 of
            0:  begin
                    fieldComboWellName.Visible:=True;
                    fieldComboWellName.DroppedDown:=True;
                    fieldComboWellName.SetFocus;
                end;
person PaPaMc    schedule 19.08.2012