Как запустить событие двойного щелчка правой границы сетки по коду на delphi xe5?

Я использую компонент Dev Express DBGrid, я хочу масштабировать свой столбец, чтобы он соответствовал тексту моих строк, поэтому я использовал:

cxView.ApplyBestFit();

Это работает, но почему-то слишком медленно, поэтому я провел поиск и нашел этот пост на Веб-сайт Dev Express, но это мне мало помогает. Итак, я начал наблюдать за интерактивностью сетки, что привело меня к выводу, что если я дважды щелкну все правые границы сетки один за другим, сетка будет идеально и быстро масштабироваться, как вы видите на двух рисунках ниже:

это был четвертый клик правой границы

затем я продолжаю до последней границы, чтобы получить этот результат:

Как видите, хорошо масштабируется

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

Спасибо


person Mohammed Housseyn Taleb    schedule 20.09.2016    source источник


Ответы (1)


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

Код:

procedure TForm1.ApplyBestFits;
var
  i : Integer;
begin
  try
    cxGrid1DBTableView1.BeginUpdate;
    for i := 0 to cxGrid1DBTableView1.ColumnCount - 1 do begin
      cxGrid1DBTableView1.Columns[i].ApplyBestFit;
    end;
  finally
    cxGrid1DBTableView1.EndUpdate;
  end;
end;

Однако я не уверен, что в нынешнем виде это полное решение вашей проблемы. В моем тестовом примере со 100 столбцами и 2000 строками данных для выполнения требуется одна или две секунды, что, как мне кажется, намного медленнее, чем вы надеялись. Поэтому может потребоваться некоторая оптимизация.

Одной из очевидных оптимизаций будет вызов cxGrid1DBTableView1.Columns[i].ApplyBestFit только для столбцов, которые находятся в клиентском прямоугольнике DBTableView. Другой может заключаться в том, чтобы ограничить количество строк в наборе данных, подключенном к представлению таблицы, меньшим числом. Например, следующее вызывает ApplyBestFit только для столбцов, у которых левая координата находится в пределах ширины cxGrid.

procedure TForm1.ApplyBestFits;
var
  i : Integer;
  ALeft : Integer;
  ACol : TcxGridColumn;
begin
  try
    ALeft := 0;
    cxGrid1DBTableView1.BeginUpdate;
    //  Process only the visible columns whose Left properties
    //  are within the width of the grid
    for i := 0 to cxGrid1DBTableView1.VisibleColumnCount - 1 do begin
      ACol := cxGrid1DBTableView1.VisibleColumns[i];
      ACol.ApplyBestFit;
      Inc(ALeft, ACol.Width);
      if ALeft > cxGrid1.Width then
        Break;
    end;
  finally
    cxGrid1DBTableView1.EndUpdate;
  end;
end;
person MartynA    schedule 20.09.2016
comment
Я думаю, что это должно быть в порядке - я просто использую его в обработчике ButtonClick для целей тестирования. - person MartynA; 20.09.2016
comment
Привет, код отличный и хорошо подходит для содержимого столбца, но не для содержимого столбца, ПОЧЕМУ? Спасибо - person Mohammed Housseyn Taleb; 21.09.2016
comment
Извините, я не понимаю, что вы имеете в виду под не содержимым строк столбца. Если вы можете сделать скриншот, который иллюстрирует, что вы имеете в виду, я предлагаю вам опубликовать его как новый вопрос (не в этом, и, возможно, кто-то знает ответ. - person MartynA; 21.09.2016
comment
MartynA, когда я использовал тот же код без BeginUpdate и EndUpdate, я не получил такого же результата. ПОЧЕМУ? - person Mohammed Housseyn Taleb; 22.09.2016