Delphi DBGrid, показывающий сжатые строки

У меня странные проблемы с DBGrid от Delphi.

Я заметил, что Иногда, я имею в виду только иногда (это совершенно случайно), когда я загружаю строки в delphi DBGrid, сетка не отображает данные.

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

Что могло бы быть причиной этого? И как это исправить?

Обновить

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

См. Изображение ниже:  изображение сжатых строк

ЛЮБЫЕ ИДЕИ были бы потрясающими относительно того, что вызывает это, и как это предотвратить ...


person Marcel    schedule 03.11.2016    source источник
comment
Как мы можем воспроизвести эту проблему?   -  person Ken White    schedule 03.11.2016
comment
@KenWhite В этом и проблема. Вроде бы совершенно случайно. Со мной такое случалось всего пару раз, а мои клиенты видят это почти каждый день .... Я читал об этом пару лет назад. Но я больше не могу найти ресурсы: (.... Все, что у меня есть, это DBGrid, подключенный к источнику данных, подключенному к ZQuery, и это подключено к ZConnection   -  person Marcel    schedule 03.11.2016
comment
Что говорит @KenWhite. Я предлагаю вам добавить кнопку в свою форму, чтобы щелкнуть ее, когда возникает это условие: а) делается снимок вашей формы, чтобы читатели могли сами видеть симптомы, и б) фиксирует содержимое вашего набора данных в TClientDataSet, чтобы вы могли посмотрите, вызывает ли повторная загрузка тех же данных ошибку. Вы найдете, как сделать и то, и другое в других вопросах и ответах SO, если вы еще не знаете.   -  person MartynA    schedule 03.11.2016
comment
@MartynA Я постараюсь сделать снимок. Но я думаю, что я должен упомянуть, если вы перезагрузите запрос, то есть вы просто установите ZQuery на active false и active true, но сохраните все те же переменные в следующий раз, когда DBGrid загрузится должным образом.   -  person Marcel    schedule 03.11.2016
comment
У нас ежедневно используется более 40 производственных приложений, и мы никогда не сталкивались с этой проблемой. Ни разу, и когда я говорю используется, я имею в виду, что каждый день более 50 пользователей запускают несколько экземпляров нескольких приложений. Без некоторой информации, которую можно было бы использовать, это будет чрезвычайно сложно. Какую конкретную версию Delphi вы используете? DBGrid устанавливает конкретную фиксированную высоту строки, если ваш код или изменение свойства RowHeight в инспекторе объектов не изменяет ее, поэтому это не проблема VCL.   -  person Ken White    schedule 04.11.2016
comment
@KenWhite, честно говоря, у меня также есть несколько приложений delphi, которые я использую каждый день, и только с этим случилось такое. Я использую Delphi XE7, но сейчас ищу для вас скриншот :)   -  person Marcel    schedule 04.11.2016
comment
Также полезно, если вы описываете и / или показываете код событий, происходящих в этот момент. когда я загружаю строки слишком расплывчатый.   -  person Jan Doggen    schedule 04.11.2016
comment
В основном такие вещи вызваны OnDrawDatacell или Ondrawcolumcell, если это проблема вашего кода. Возможной причиной также может быть графический драйвер, экраны и т. Д. Единственная помощь - поиск различий: есть ли компьютер, где это иногда возникает, и есть ли компьютер, где этого никогда не было. Затем обратите внимание на разницу между обеими группами.   -  person Christine Ross    schedule 04.11.2016
comment
Я бы заподозрил перезапись памяти некоторыми данными из-за случайности. Сначала я бы включил Range checkingOverflow checking) в параметрах проекта - Компилятор Delphi - Компиляция (по умолчанию они отключены). И убедитесь, что они включены для Release configuration и Debug configuration. Надеюсь, это сработает, чтобы дать вам возможность преследовать.   -  person Tom Brunberg    schedule 04.11.2016
comment
У меня тоже такая проблема. Постараюсь разобраться. Версия Delphi: RX / 10.3   -  person Ignas    schedule 03.04.2019


Ответы (1)


Эта проблема возникла и у меня. И я думаю, что решил.

В моей ситуации я звонил ADOQuery.Open(); внутри TThread, и этот ADOQuery был привязан к DataSource, и он был привязан к DBGrid. Я подозревал, что может быть что-то с выполнением во вторичном потоке, поэтому я немного поигрался с ADOQuery.

Вот что я сделал, и моя проблема была решена. Перед вызовом ADOQuery.Open() и перед запуском нового потока я сделал DataSource.DataSet := nil;. Назначаю Thread.OnTerminate := RefreshGridFinished;. Затем я запускаю этот новый TThread с некоторой процедуры, в которой в конечном итоге вызывается ADOQuery.Open();. Затем, когда TThread завершится, у меня есть этот обработчик, который назначит выбранный и полный ADOQuery, также известный как DataSet, DataSource:

procedure TMyForm.RefreshGridFinished(Sender: TObject);
begin
  TThread.Synchronize(TThread(Sender),
    procedure
    begin
      DataSource.DataSet := ADOQuery; // I assign fetched dataset
    end);

  if TThread(Sender).FatalException <> nil then
  begin
    Exit;
  end;

  Thread := nil; // Class field
end;
person Ignas    schedule 03.04.2019