• 0
striker

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

Вопросы

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

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

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


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

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

  • 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;

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

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


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

krapotkin, спасибо!

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

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

 

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


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

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


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

Для публикации сообщений создайте учётную запись или авторизуйтесь

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

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Похожий контент

    • От SIARHEI RAHOUSKI
      Как изменить сам Header, скролы ? Я открывал стайл блок, но всё что смог изменить там это цвет полей и всё.

    • От SIARHEI RAHOUSKI
      Здравствуйте, у меня возник вопрос Как базу данных подключить к TGrid? Я использую Delphi XE3 и База данных Accsess: ADOConnection + ADOQuery + DataSource. И вот как отобразить в TGrid Таблицу бд ?
    • От x11
      Бесплатная сетка для некомерческого использования. Я так понял, что без исходников.
      For Embarcadero RAD Studio 2009 and up to Tokyo 10.2 update 2, Delphi and C++, VCL and Firemonkey frameworks (all platforms: Windows 32 and 64 bit, Mac OSX, Android and iOS), and Lazarus FreePascal (Windows, Linux, etc)
      https://github.com/Steema/TeeGrid

    • От striker
      Всем привет!
      Нужен совет.
      Есть Grid, в нем расписание дня.
      В БД каждая строка это отдельная запись.
      Нужно как-то визуально сделать подобие объединения ячеек в Excel.
      Т.е. нужно занять расписание на 2 часа.
      При этом функционал по событиям для строки "второго часа" должен быть недоступен.
      Может хотя бы границу стирать, т.е. оставлять значение в верхней ячейки, а нижнюю просто не отображать.
      Как это лучше сделать?
      FMX, Windows, Delphi XE6, MySQL
       

    • От 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
      Спасибо!
  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу