Перейти к содержанию
  • Регистрация
  • 0
striker

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

Вопрос

Добрый день!
Работаю с 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

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

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


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

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

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

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

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

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

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

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

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


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

    • От estra
      FDQuery1.SQL.Text := 'select !x from dual'; FDQuery1.Macros.Clear; with FDQuery1.Macros.Add do begin Name := 'X'; Value := 'DUMMY'; end; FDQuery1.Prepare; Как получить результат prepare (запрос вида 'select DUMMY from dual')?
    • От estra
      Привет всем форумчанам!
      Нужна Ваша помощь. Есть пакет в ORACLE с глобальными переменными, типа:
      CREATE OR REPLACE PACKAGE GLOBALS IS
        BranchId NUMBER;
      -- 
      END GLOBALS;
      Вопрос: как получить значение переменных из пакета?
       
    • От sulion
      Коллеги, добрый день!
      Вопрос на засыпку - помогите пожалуйста, чего мне не хватает для успешного запуска?
      Список dll файликов прикрепляю внизу письма, Oracle 12.2 клиент стоит, PL/SQL Developer 12 использую каждый день
       
      Симптомы:
      Из хорошего - FireDAC Explorer успешно видит все нужные мне БД - и таблицы, и пакеты и т.д.
       
      В Delphi XE7 приложение работало успешно. Delphi 10.2.3 подчёркивает два модуля. Если эти два модуля закомментарить, то - компилирует успешно, но не может подцепиться ни к одной БД Oracle
       
      Создал пустое приложение, в него положил TFDConnection, драйвер Oracle он не видит
       
      Что уже пробовал:
      Вчера поставил все dll. Сегодня поставил Delphi 10.3.1 Architect Trial (на месяц), в нём проблема воспроизводится. Ещё раз переустановил драйвер Oracle.
       
      Что ещё можно сделать?
       
       
      Обещанный список dll:
      oci.dll
      ocijdbc12.dll
      ocijdbc12.sym
      ociw32.dll
      ociw32.sym
      ojdbc8.jar
      oramysql12.dll
      oramysql12.sym
      orannzsbb12.dll
      orannzsbb12.sym
      oraocci12.dll
      oraocci12.sym
      oraocci12d.dll
      oraocci12d.sym
      oraociei12.dll
      oraociei12.sym
      oraons.dll
      orasql12.dll
      orasql12.sym
       
       
       

      23.7z Request.7z
       
    • От 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;
  • Последние посетители   0 пользователей онлайн

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

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