• 0
striker

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

Вопрос

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

21 ответ на этот вопрос

  • 0

да...

Delphi XE6

Изменено пользователем striker

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 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

enatechno, спасибо!

Через LiveBindings.

Если переходить на Berlin - Grid'ы надо как-то будет переделывать нынешние?

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

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

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

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

Есть Query и Grid.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0
Grid2.BeginUpdate;
try
for i:=0 to qClients.RecordCount-1 do
  begin
    XXX:=qClients.Fields[0].AsString;  
    qClients.Next;
  end;
finally
    Grid2.EndUpdate;
end;

Что должно быть вместо XXX?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

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

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

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

striker и Anatoliy понравилось это

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

krapotkin, спасибо!

А при ручном заполнении AfterScroll по Query при перемещении по записям Grid как сделать?

Т.е. раньше я ходил по Grid и выполнялся Query.AfterScroll

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

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

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

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

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

wamaco понравилось это

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

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

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

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

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

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

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

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

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

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

striker понравилось это

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 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

krapotkin и striker понравилось это

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 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

Вы пишете что работаете с MySQL. Вы делаете запрос к базе находящейся в интернет?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 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 мсек. Поэтому если мы прокручивали несколько записей, то дочерняя переоткрывалась только единожды

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!


Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.


Войти сейчас

  • Похожие публикации

    • Автор: Ilya.Z
      День добрый, может кто то сталкивался с такой проблемой - при использовании связки Unidac (пробовал и  FireDac) Delphi 10,1 + FirePower 10
      Подключаю Grid и в обычном wwDataGrid отрабатывается нормально,
      если взять wwLayoutGrid то ,при запуске программы, во всех ячейках отображается первая запись таблицы, при этом в дизайн моде все правильно показывает.
      в демосах при использовании MemDataset все норм, все красиво
      PS если dataset находится в той же форме что и layoutgrid все работает как надо, стоит перенести в отельный datamodule показывает лишь первую запись во всей таблице
      может кто подскажет идею, куда копать ? или сталкивался с похожей ситуацией ?
      Спасибо
       
      PS Вопрос закрыт, проблема в моем же дополнительном компоненте ..сорри мдам, буду разбираться от чего )
    • Автор: notricky
      Суть вопроса в заголовке.
      Есть ли какие-то настройки у базы или FireDAC чтобы в английской системе (винда 7) русский текст отображался не вопросами, а русским текстом?
      Настройки у БД UTF-8.
    • Автор: Anasazi
      Всем доброго времени суток. Возникла необходимость решить такую задачу: в таблице базы MySQL хранится список изображений и их URL. Необходимо получить этот список массивом. Затем загрузить изображения и поочередно с интервалом показать их в TImage.
      Понимаю, что получить список изображений правильнее при помощи PHP скрипта, но в каком виде скрип должен вернуть данные, чтобы в Delphi получить из них массив не знаю.
      Раньше для получения изображений использовал такую процедуру. Но вопрос, где хранить изображения перед демонстрацией их в TImage? Создавать несколько MemoryStream?
      procedure LoadWebImage(url: string; image: TBitmap);
      var
        idhttp : TNetHTTPClient;
        ms : TMemoryStream;
      begin
       IdHTTP := TNetHTTPClient.Create(nil);
        ms := TMemoryStream.Create;
        try
          idhttp.Get(url, ms);
          ms.Position := 0;
          image.LoadFromStream(ms);
        finally
          ms.Free;
          idhttp.Free;
        end;
      end;
    • Автор: ENERGY
      Как залить с Delphi Android в базу MySql строки, я примерно понял - составляем GET запрос и вставляем строки в параметры, затем считываем их в PHP скрипте и в базу.
      А вот как быть с картинкой. Как добавить картинку через PHP скрипт из программы на Android?
      POST запрос? Кто нибудь делал такое уже?
      Спасибо 
       
      P.s. На данный момент FireDAC не поддерживает работу с MySQL из под Android. Пока только SQLite и  InterBase ToGo. Даже если в будущем будет поддерживать, многие на этом форуме рекомендуют не использовать прямое подключение к базам из под мобильных систем, а использовать прямые GET запросы к примеру к PHP скриптам. Это связано с нестабильностью интернета т.к. так интернет может часто переключаться (от вышки к вышке) и менять параметры подключения. 
    • Автор: Илья Захаров
      Пишу приложение под iOS и Android... Создал базу данных на хостинге написал скрипты на PHP для получения данных. Пробовал GET запросом получить данные, возвращает пустые значения. Если через браузер смотреть то массивы данных возвращает правильно. Кто ни буть цепочки может написать как правильно это все реализовать.... Какие компоненты и какие статьи почитать... Заранее спасибо...
    • Автор: striker
      Всем привет!
      Я новичок в FMX.
      Сталкиваюсь с проблемами различий с VCL.
      Некоторые проблемы:
      1) Текст в edit мышью невозможно выделить, выделение скачет.
      Думаю связано с заточкой под тач, как починить и возможно ли - нигде не нашёл.
      2) Покрасить грид (строчку) в зависимости от значения можно?
      В VCL это делается OnDrawColumnCell
      Спасибо!
    • Автор: notricky
      Собственно как это делают люди?

      Речь, конечно, не про выполнение скрипта "update table set...", а про использование Edit/Post с изменением как в Датасете, так и в БД.

      Какие нужны настройки, в частности у TFDQuery.
      // настройки qr.UpdateOptions = [KeyFields = id][UpdateChangedFields = true] // при этом селект не смотрит напрямую в theTable, но id - это поле theTable qr2.UpdateOptions.UpdateTableName := 'theTable'; qr2.Edit; qr2.FieldByName('Str').Value := Format('%s-%d',[qr2.FieldByName('Str').AsString, Code]); qr2.Post; В такой форме позволяет менять датасет, но в БД данные не скидываются. БД SQLite.
    • Автор: Илья Захаров
      Помогите пожалуйста, поделитесь информацией или примерчиком. Есть база данных MySQL на хостинге Макхост. Мне нужно для соединения,работы с ней использовать SSH протокол я не понимаю как это сделать... может в компонентах FireDAC есть какая ни будь фича?  
    • Автор: Bio HaZaRD
      Всем привет!
      Пишу проект на основе FireDac (TFDConnection, TFDQuery) + SQLite. На ПК с IDE программа запускается, а на других - нет. На ПК, без IDE, стоят все обновы.
      Помогите разобраться, где проблема или посоветуйте другой компонент, который поддерживает SQLite. Заранее спасибо!
       
      Примечания к файлу:
      Windows-Problemberichtserfassung = Windows Problem Reporting

    • Автор: GoldenEalge
      Всем привет только начинаю работать с sqlite и возникло пару вопросов.Добавляю на форму пару компонентов

      Устанавливаю связь с бд которая лежит в папке 

      при запуске все хорошо 

      но при попытки редактировать , выдает 

      база открыта только в софте , больше не где ,в чем может быть проблема?
       
  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу