странный глюк с TStringGrid

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

странный глюк с TStringGrid

Сообщение VKB » 11.09.2009 14:27:05

Был у меня Лазарус 0.9.24(FPC 2.2.0). После переезда на другой компьютер я скопировал директорию с этим лазарусом и поверх неё поставил 0.9.26(FPC 2.2.2), не снося старого. Был у этих лазарусов глюк в дизайне - форма показывала точечки с периодом в 512 пикселей (256 показывает, потом 256 не показывает). Это было не только у формы, а у всех подобных контролов, например у TPanel. Ну странновато конечно, но работать совершенно не мешало. Я это воспринимал как фичу Лазаруса (см. period1.png).

Однако когда я вставил в проект TSrringGrid, то оказалось, что (хотя во время дизайна это и не видно) во время выполнения этот период проявляется неприятным образом - красные точечки вокруг текущей ячейки рисует только там, где во время дизайна были бы точечки, если бы это была форма или панель. Пришлось обойтись, отключив эти красные точечки вообще. После этого я стал считать это уже багом. См. period2.png и period3.png - я изменил DefaultColWidth с 64 на 60 чтоб было видно, что граница рисования красных точечек проходит на растоянии 256 пикселей от левого края грида.

Потом я скачал 0.9.29 (FPC 2.5.1) и поставил на другой компьютер - попробовать. Смотрю - а точечки во время дизайна стали всё заполнять и соответственно во время выполнения у грида тоже везде показывались. Ну, думаю, всё нормально, исправили баг. Поставил 0.9.29 поверх 0.9.26 на старом компьютере. Однако баг не исчез. Я снёс полностью лазарус, удалил остатки в директориях с примерами, поставил заново - баг не исчез. Попробовал ещё 0.9.29 версию для линукса - там этого бага тоже нет.

Теперь вопрос к знатокам - как бы мне так снести лазаруса, чтоб он не помнил, что у него был этот баг? Переустанавливать Windows я естественно не хочу. Почему он сносит себя не до конца?
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Последний раз редактировалось VKB 12.09.2009 13:26:53, всего редактировалось 1 раз.
VKB
новенький
 
Сообщения: 33
Зарегистрирован: 07.09.2009 13:57:35

Re: странный глюк с TSringGrid

Сообщение Максим » 11.09.2009 16:25:30

ОС какая? Windows XP?

Из того, что глюк наблюдается в скомпилированной программе, можно сделать вывод, что сама установка Lazarus (её файлы настройки) тут не причём.
В любом случае, достаточно удалить предыдущую версию Lazarus, удалить каталог с её остатками (ещё можно удалить каталог с настройками %Documents and Settings%\%User%\Local Settings\Application Data\lazarus\) и поставить новую версию.

Никогда у себя на XP такого глюка не наблюдал, поэтому, возможно, чудят драйвера видеокарты.
Аватара пользователя
Максим
энтузиаст
 
Сообщения: 598
Зарегистрирован: 27.07.2007 01:51:43
Откуда: Москва

Re: странный глюк с TStringGrid

Сообщение VKB » 11.09.2009 17:00:07

Глюк наблюдается на компьютере с 32-битной вистой, но изначально (0.9.24) тот лазарус стоял на XP, где было то же самое. На новом компьютере, где сразу поставил 0.9.29, стоит XP. На линуксе (64-битный slackware13) тоже всё нормально.

Драйверы видеокарты чудить не могут, потому что скопированный экзешник работает так же. То есть лазарус генерит разный код на разных компьютерах. Папку Application Data я не стирал (В Висте она кстати в %LOCALAPPDATA%\lazarus, что расположено по умолчанию в %USERPROFILE%\AppData\Local\lazarus). Немного не правильная картинка (над гридом точки лишние) в period1.png - дефект при подготовке скриншота, я потом уже заметил, не стал его переделывать. Вставлял не стирая поверх предыдушего скриншота в графическом редакторе, мусор остался.
Последний раз редактировалось VKB 12.09.2009 13:27:30, всего редактировалось 1 раз.
VKB
новенький
 
Сообщения: 33
Зарегистрирован: 07.09.2009 13:57:35

Re: странный глюк с TSringGrid

Сообщение Максим » 11.09.2009 17:10:20

VKB писал(а):Драйверы видеокарты чудить не могут, потому что скопированный экзешник работает так же. То есть лазарус генерит разный код на разных компьютерах.

В этом случае полная переустановка Lazarus (включая удаление настроек) должна помочь.
Аватара пользователя
Максим
энтузиаст
 
Сообщения: 598
Зарегистрирован: 27.07.2007 01:51:43
Откуда: Москва

Re: странный глюк с TStringGrid

Сообщение VKB » 12.09.2009 16:09:51

Сорри, виноват, екзешник одинаковый - дело действительно в компьютере. При копировании на другую машину эффект не проявляется.

Остаётся только привести параметры глючного компьютера:

Производитель: Toshiba, модель U400-10O (PSU40E)
ОС: Windows Vista Home Premium OEM (Service Pack 2)
Дисплей: Mobile Intel 965 Express Chipset Family (драйвер 7.14.10.1329)

Кстати интересно, что параллельно тут у меня стоит OpenSuSE-11.1 с Лазарусом 0.9.26, так там этого эффекта нет.
Так же нет этого эффекта у программы с гридом, собранной Delphi6.

Поэтому это всё-таки сигнал разработчикам. Ибо драйвер драйвером, но пользователь не будет разбираться. Он увидит, что программа работает криво и спишет всё на Лазарус. И будет прав.
VKB
новенький
 
Сообщения: 33
Зарегистрирован: 07.09.2009 13:57:35

Re: странный глюк с TStringGrid

Сообщение VKB » 24.09.2009 15:52:16

Разобрался. Но как починить - это вопрос. Лазарус грид рисует через DrawRubberRect, в котором вызывается
Код: Выделить всё
function SetPixel(_para1:HDC; _para2:longint; _para3:longint; _para4:COLORREF):COLORREF; external 'gdi32' name 'SetPixel';
. А Delphi видимо по другому (не стал выяснять как). Но если написать
Код: Выделить всё
procedure TForm1.FormPaint(Sender: TObject);
  var
    i: integer;
  begin
    with canvas do begin
      for i:=0 to width do begin
        Pixels[i,10]:=$FF;
      end;
    end;
  end;
то это будет криво работать и в Delphi (проверил). Стало быть дело действительно в кривых драйверах, но новых на сайте нет. Интересно, как вообще система работает с такой реализацией SetPixel. Видимо из-за низкой скорости этот вызов никакие программы не используют, поэтому в обычной жизни он не проявляется. Поэтому формально к Лазарусу все претензии снимаются. Единственное - наверно лучше всё-таки выводить и точечки на форме во время дизайна и точечки вокруг текущей ячейки грида какими-нибудь другими, более быстрыми вызовами. Delphi же не использует для этого SetPixel...
VKB
новенький
 
Сообщения: 33
Зарегистрирован: 07.09.2009 13:57:35

Re: странный глюк с TStringGrid

Сообщение Logo » 24.09.2009 17:29:08

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

Добавлено спустя 2 минуты 33 секунды:
Да, в Lazarus тоже этот параметр нужно помотреть.
Logo
постоялец
 
Сообщения: 464
Зарегистрирован: 20.08.2008 01:00:47

Re: странный глюк с TStringGrid

Сообщение VKB » 24.09.2009 23:58:42

Logo писал(а):Сколько пиксел на дюйм у вас в системе выставлено? Помойму не 96 и в этом может быть проблема я уже не помню виндовс, но если там есть возможность поставить по умолчанию, то попробуйте сделать по умолчанию.

Добавлено спустя 2 минуты 33 секунды:
Да, в Lazarus тоже этот параметр нужно помотреть.

Э... недопонял. Где нужно 96 пикселов на дюйм выставлять? Что в Лазарусе смотреть? Извиняюсь, Вы о чём вообще? У меня ноутбук (я писал об этом выше по теме) и соответственно ЖК дисплей. Естественно видеорежим стоит оптимальный, чтоб программно каждому пикселу соответствовал ровно 1 пиксел матрицы. 96 и 120 это помнится были размеры шрифта. Но, во-первых, я ничего не менял, всё стоит как было предустановлено, во-вторых, где поменять в Висте я даже не нашёл. В третьих, какое отношение размер шрифта по умолчанию имеет к системному вызову SetPixel?
VKB
новенький
 
Сообщения: 33
Зарегистрирован: 07.09.2009 13:57:35

Re: странный глюк с TStringGrid

Сообщение Sergei I. Gorelkin » 25.09.2009 01:53:44

VKB писал(а): В третьих, какое отношение размер шрифта по умолчанию имеет к системному вызову SetPixel?

"Размер шрифта" (а точнее, количество точек на дюйм) влияет на преобразование логических координат в физические, и действует почти на все графические функции, принимающие координаты x,y. В том числе и размер шрифта, заданный в пунктах (пункт=1/72 дюйма) будет меняться при измерении в пикселах.

А сетку можно, наверное, рисовать пунктирными линиями, задав предварительно "пунктир" как 1 пиксел из 8. Потом горизонтальные линии через каждые 8...
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1405
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: странный глюк с TStringGrid

Сообщение Logo » 25.09.2009 02:00:15

96 и 120 - это не размер шрифта, а разрешение экрана, причем очень виртуальное, не совсем совпадающее с реальными пикселами. С Виндовс очень давно работал, но помнится именно эта проблема была, с несоответствием разрешения системы и формой Delphi.
Logo
постоялец
 
Сообщения: 464
Зарегистрирован: 20.08.2008 01:00:47

Re: странный глюк с TStringGrid

Сообщение VKB » 25.09.2009 02:36:22

Sergei I. Gorelkin писал(а):"Размер шрифта" (а точнее, количество точек на дюйм) влияет на преобразование логических координат в физические, и действует почти на все графические функции, принимающие координаты x,y. В том числе и размер шрифта, заданный в пунктах (пункт=1/72 дюйма) будет меняться при измерении в пикселах.

А сетку можно, наверное, рисовать пунктирными линиями, задав предварительно "пунктир" как 1 пиксел из 8. Потом горизонтальные линии через каждые 8...
Может быть Дельфи так и рисует. Не понимаю, что Вы мне предлагаете? Я вижу у себя 2 проблемы. Первая чисто моя (точнее моего драйвера) - неправильно работает SetPixel. Лазарус в решении этой проблемы никак не поможет. Вторая - возможно в лазарусе следует переписать некоторые места, которые используют SetPixel, для ускорения работы. В целом это не критично по времени, так что думаю, что разработчики сейчас этим заниматься специально не будут, а мне патчить свой лазарус из-за кривых драйверов тоже как-то не очень. Хотя это и помогло бы. Но правильно-то решать проблему кардинально - то есть исправлять драйвера. Потому что мало ли где какие глюки в драйверах, всё не учтёшь, особенно те глюки, которые ещё не реализованы :-).
Logo писал(а):96 и 120 - это не размер шрифта, а разрешение экрана, причем очень виртуальное, не совсем совпадающее с реальными пикселами. С Виндовс очень давно работал, но помнится именно эта проблема была, с несоответствием разрешения системы и формой Delphi.
Как я уже написал, я в любом случае не знаю, где это мне можно поменять (и не верю что это как-то может повлиять), но всё равно спасибо всем за попытки мне помочь!
VKB
новенький
 
Сообщения: 33
Зарегистрирован: 07.09.2009 13:57:35

Re: странный глюк с TStringGrid

Сообщение gamerz » 29.09.2009 11:54:37

Баг Висты скорее всего. Попробуй сменить тему, включить/отключить аэро.


SetPixel and SetPixelV fail to set pixel colors under certain Vista color schemes for the following values of X (the second parameter): 256-511, 768-1023, 1280-1535, 1792-2047, etc. The pattern is this: It sets pixel colors for the first 256 horizontal pixels, and for the next 256 pixels, nothing happens. Then it sets the next 256 pixels; then for 256 pixels, nothing happens. This pattern appears to continue indefinitely.

On Vista Home Basic, SetPixel (and SetPixelV) work fine unless the Windows Classic theme is enabled. Then, the problem described above manifests.

On Vista Home Premium, this problem also manifests when the color scheme is set to "Windows Standard" or "Vista Basic".
gamerz
незнакомец
 
Сообщения: 4
Зарегистрирован: 18.09.2009 13:03:15

Re: странный глюк с TStringGrid

Сообщение VKB » 29.09.2009 14:02:12

gamerz писал(а):Баг Висты скорее всего. Попробуй сменить тему, включить/отключить аэро.


SetPixel and SetPixelV fail to set pixel colors under certain Vista color schemes for the following values of X (the second parameter): 256-511, 768-1023, 1280-1535, 1792-2047, etc. The pattern is this: It sets pixel colors for the first 256 horizontal pixels, and for the next 256 pixels, nothing happens. Then it sets the next 256 pixels; then for 256 pixels, nothing happens. This pattern appears to continue indefinitely.

On Vista Home Basic, SetPixel (and SetPixelV) work fine unless the Windows Classic theme is enabled. Then, the problem described above manifests.

On Vista Home Premium, this problem also manifests when the color scheme is set to "Windows Standard" or "Vista Basic".

Спасибо. Помогло. Хотел я высказаться тут про Микрософт по этому поводу, но уж ладно, не буду, думаю всем всё понятно и незачем зазря флейм разводить...
VKB
новенький
 
Сообщения: 33
Зарегистрирован: 07.09.2009 13:57:35


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 38

Рейтинг@Mail.ru