Lazarus/LCL рисует только в маленьком уголке холста

В программе друга, написанной на Паскале (базовая игра в боулинг), игровые элементы (мяч, фон и т. д.) отрисовываются на холсте TShape (Shape1.Canvas)

Проблема в том, что элемент, нарисованный на этом холсте, обрезается в небольшой прямоугольник в верхнем левом холсте этого TShape. Посмотрите на этот скриншот: Скриншот сбоя

Обратите внимание, что я уже видел такую ​​​​проблему с другой программой Pascal, также использующей Lazarus / LCL (основную библиотеку графики / пользовательского интерфейса lazarus), и что эта программа для боулинга работает без каких-либо ошибок в Windows, ошибка возникает только в Linux, я думаю. .

Также обратите внимание, что при рисовании на этом холсте из процедуры, отличной от процедуры таймера (например, в OnFormCreate или что-то в этом роде), рисуется весь холст.

Вот выполняемые операции рисования (в процедуре таймера):

procedure TForm2.Timer1Timer(Sender: TObject);
var
  i: integer;
  affich:word;
begin
  Shape1.Canvas.Clear;
  Lapiste.display(shape1.Canvas);
  Laboule.move(Coupcourant, Lapiste);
  Laboule.display(Shape1.Canvas);
  //LeTabQuilles.collision(CoupCourant);
  for i := 1 to 10 do
    begin
      LeTabQuilles.tab[i].check(LaBoule, CoupCourant);
      (LeTabQuilles.tab[i] as CQuille).display(shape1.Canvas);
    end; 

// ... (rest of the procedure) 

Операции рисования (.display) в основном рисуют растровые изображения на холсте, заданном как атрибут...


person halflings    schedule 16.05.2012    source источник
comment
Есть ли причина, по которой вы рисуете на холсте формы, а не в TImage или TPaintBox? Просто интересуюсь. И есть ли какое-то особое значение, придаваемое размерам нарисованного прямоугольника? (например, это размер формы во время разработки и т. д. или он случайный)   -  person Thomas    schedule 16.05.2012
comment
Как сказано в сообщении ниже, мы рисуем это на TShape, а не на TForm, в основном потому, что рисование на TForm вызывает некоторые графические сбои (исчезновение меток и т. д.); Почему мы нарисовали его на TShape, а не на TImage или TPaintBox? ... Я действительно не знаю. Поскольку у всех этих древовидных объектов есть холст, мы просто выбрали один из них: TShape. Может ли это вызвать какую-либо ошибку? Для формы нарисованного прямоугольника, как видно на снимке экрана, похоже, что он имеет то же соотношение, что и TShape... Но обратите внимание, что содержимое холста обрезается, а не изменяется.   -  person halflings    schedule 16.05.2012
comment
Я не думаю, что это вызовет какую-либо ошибку, просто это показалось странным выбором. Это может быть ошибка с набором виджетов Linux, но я не знаю, можно ли увидеть какой-то код?   -  person Thomas    schedule 16.05.2012
comment
С точки зрения Windows (но я предполагаю, что Lazarus справится с тем же самым в Linux) вы должны только подготовить позиции того, что и где вы хотите отобразить, запросить у системы обновление управления, а рендеринг сохранить в событии OnPaint. Кажется, что форма закрашивает ваш элемент, но это всего лишь предположение.   -  person TLama    schedule 16.05.2012
comment
Не могли бы вы попытаться собрать и запустить this project в Linux ?   -  person TLama    schedule 16.05.2012
comment
Привет, ребята. Проблема решена (см. ответ ниже), спасибо за помощь. @TLama: Ваша программа работает правильно, даже если она рисует на Tshape ... mmmh. Для вашего предыдущего комментария рисунок также реализован, потому что он рисует непосредственно некоторый TBitmap, но использование TImage (и поэтому LCL рисует его сам по себе) было бы, возможно, лучшей идеей.   -  person halflings    schedule 17.05.2012


Ответы (1)


Кажется, что не все Холсты рождаются одинаковыми :).

Проблема решилась простой заменой TShape на TImage. Обратите внимание, что эта проблема очень частая (по крайней мере, в моей школе и только в Linux), а также возникает, если вы рисуете прямо на холсте формы (что довольно глупо, кстати).

person halflings    schedule 17.05.2012