Перейти к содержанию
Fire Monkey от А до Я
  • 0

Долго загружаются данные в Grid


striker

Вопрос

Добрый день!
Работаю с MySQL
Подключаюсь через FireDac.
FDQuery+FDConnecton+Bind+Grid

Запрос выполняется моментально, но как только подключаю Grid - начинает висеть. Grid заполняется очень долго - секунд 12-15.
Причем результат запроса - всего 230 строк, хоть и join присутствует.
Куда копать? Может дело быть именно в FMX?

Ссылка на комментарий

Рекомендуемые сообщения

  • 0

Нагуглил тут про FMX.Types.GlobalUseDirect2D := False;

Не помогло. Что ещё отключить можно?

Собственно приложение задумывалось быть кросслпатформенным. Но сейчас используется только под Windows.

Так что все "навороты" можно поотключать, если в этом дело.

 

Ссылка на комментарий
  • 0
В 21.09.2017 в 08:54, striker сказал:

как только подключаю Grid - начинает висеть

Как подключаете? Через LiveBindings? Если "да", то это может быть причиной торможения (тем в более в ранних версиях XE).

Если заполняете "вручную", то проверьте наличие конструкций BeginUpdate, EndUpdate

  Grid1.BeginUpdate;
  try
// заполнение
  finally
    Grid1.EndUpdate
  end;

 

1 час назад, striker сказал:

Delphi XE6

Большинство порекомендует Вам перейти на версию Berlin (в ней работа Grid значительно переработана)

Ссылка на комментарий
  • 0

Посмотрел, на Берлин пока переходить не вариант... куча несостыковок.

Весь мозг сломал как в этой версии XE6 обойтись без LiveBindings...

Как руками заполнить Grid?

Есть Query и Grid.

Пробовал по-разному - то одного не знает, то другого

Ссылка на комментарий
  • 0

вот вообще ничего не менялось в стринггриде в этой конкретно строке

StringGrid1.Cells[ACol, ARow] := myString;

перед этим нужно только добавить в грид нужное количество колонок

Ссылка на комментарий
  • 0

Хорошим способом будет держать структуру данных и ее заполнять из базы

а грид уже из структуры данных

по OnSelectCell берете из структуры данных ключ к таблице и перемещаетесь по ней.

Но так делать тоже не очень гут. Если мы работаем со структурами данных, по ним и ходим

Ссылка на комментарий
  • 0

Это не так удобно. Конечно можно написать свой обработчик/компонент чтобы к любому гриду так цепляться, но я пока ещё не достиг такого уровня ))

Тем более если были стандартные решения (тот же DataSource)

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

LiveBindings действительно загрузку в Grid вешает. Заливается Grid руками намного быстрее.

Приму ещё советы по упрощению этих проблем ))

 

Ссылка на комментарий
  • 0

в FMX нету datasource и в принципе не будет, хотя бы потому, что этот вариант слабо реализуем и даже вреден на мобилах

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

Подключать Objects и пихать туда integer, как на VCL, тоже не будет работать.

Так что привыкайте создавать нормальные модели данных и работать с ними...

Ссылка на комментарий
  • 0

kraporkin, спасибо!

Проблема не решилась. Изначально я убрал LiveBindings , т.к. думал тормозит заливка грида из-за него.
А заливка даже ручная, какую я написал всё-равно тормозит и заливает в грид секунд 15-20...
 

MainForm.StringGrid1.BeginUpdate;
try
MainForm.qClients.First;
for i:=0 to MainForm.qClients.RecordCount-1 do
  begin
    MainForm.StringGrid1.RowCount:=MainForm.StringGrid1.RowCount+1;
    MainForm.StringGrid1.Cells[0, i] :=MainForm.qClients.FieldByName('FAM').AsString;
    MainForm.StringGrid1.Cells[1, i] :=MainForm.qClients.FieldByName('IM').AsString;
    MainForm.StringGrid1.Cells[2, i] :=MainForm.qClients.FieldByName('ID').AsString;
    MainForm.zqClients.Next;
  end;

finally
    MainForm.StringGrid1.EndUpdate;
end;

 

Изменено пользователем striker
Ссылка на комментарий
  • 0

Вы не прилагаете тестовый пример. Сделал это за Вас.
Итак. В моем примере, откомпилированном в Delphi Berlin и запущенном на Windows, 500 строк заполняются за 13-20 миллисекунд.
Запустите его на Delphi XE6 и скажите Ваш результат. Если результат соизмерим с моим, то дело не в StringGrid.

 

tstStringGrid.rar

Ссылка на комментарий
  • 0
2 часа назад, striker сказал:

MainForm.StringGrid1.RowCount:=MainForm.StringGrid1.RowCount+1;

это очень нехорошо.

должно быть

query.Open;
grid.RowCount:=query.RecordCount; // это не очень верно, но пока ладно...
n:=0;
while not query.eof do
begin
  FillRow(n);
  query.Next;
  inc(n);
end;
query.Close;

ну и да, соглашусь. даже секунда, это многовато...

Изменено пользователем krapotkin
Ссылка на комментарий
  • 0

enatechno, спасибо!

Действительно в Вашем примере и у меня моментально загружается...

Проблема не в Grid и не в запросе, а получается в их соединении.

Попробую ещё раз с нуля создать другой запрос и другой Grid. Непонятно...

Ссылка на комментарий
  • 0

Я бы порекомендовал добавить на форму Memo и разбросать по своему коду комбинацию из моего примера для поиска места, где происходит задержка:
 

  LTime := Now;
// действие
  Memo1.Lines.Add('Тут название действия: '+ IntToStr(MilliSecondOfTheMinute(Now - LTime)) + ' ms');

 

Ссылка на комментарий
  • 0

Нашел...

У Query в событии AfterScroll у меня обновлялись связанные таблицы...

Это и вешало всё.

Перенес на Grid.OnSelectCell

Как проходил мимо этого - непонятно.

Время кстати такое было:
 

Цитата

Начало: 0 ms
Конец: 252 ms
Последняя запись: 364 ms
Всего записей: 261
Старт заполнения StringGrid: 365 ms
Финиш заполнения StringGrid: 28741 ms

В Delphi 7 алгоритм заполнения через DataSource другой? Делал там аналогично - такого не наблюдается.

enatechno, krapotkin, спасибо большое за участие!

Изменено пользователем striker
Ссылка на комментарий
  • 0

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

Ссылка на комментарий

Присоединяйтесь к обсуждению

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

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...