Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 07.05.2015, 07:19
Аватар для SpectraL
SpectraL SpectraL вне форума
Начинающий
 
Регистрация: 19.05.2011
Адрес: Санкт-Петербург
Сообщения: 112
Версия Delphi: 10.1 Berlin
Репутация: 10
Вопрос Удаление изображения при изменении размера TPaintBox

При изменении размера компонента TPaintBox его изображение удаляется, поэтому нужно его перерисовывать снова. При изменении размера формы её изображение не удаляется. Можно ли в TPaintBox отключить удаление изображения при изменении размера?
Ответить с цитированием
  #2  
Старый 07.05.2015, 07:54
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

TPaintBox всего лишь предоставляет контекст для рисования, поэтому изображение на нем может "удаляться". Единственно верным вариантом его использования является рисование изображения в событии OnPaint. В отличии от него, TImage "умеет" хранить нарисованное на нем изображение в своем объекте Picture, которое в нужным момент сам перерисует. Плата за такое "удобство" - быстродействие.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #3  
Старый 08.05.2015, 07:16
Аватар для SpectraL
SpectraL SpectraL вне форума
Начинающий
 
Регистрация: 19.05.2011
Адрес: Санкт-Петербург
Сообщения: 112
Версия Delphi: 10.1 Berlin
Репутация: 10
По умолчанию

А форма не предоставляет "всего лишь контекст для рисования"? На форме, при изменении размера, изображение не удаляется и она не имеет объект Picture. Вот, что нашёл в модуле Vcl.ExtCtrls:
Код:
procedure TPaintBox.Paint;
begin
  Canvas.Font := Font;
  Canvas.Brush.Color := Color;
  if csDesigning in ComponentState then
    with Canvas do
    begin
      Pen.Style := psDash;
      Brush.Style := bsClear;
      Rectangle(0, 0, Width, Height);
    end;
  if Assigned(FOnPaint) then FOnPaint(Self);
end;
Подобный код (а может это он и есть) должен быть на удаление изображения при изменении размера и вероятно есть какое-то свойство, которое могло бы это отключить.
Ответить с цитированием
  #4  
Старый 08.05.2015, 07:40
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Форма также не сохраняет изображение.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #5  
Старый 08.05.2015, 07:44
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Цитата:
Сообщение от SpectraL
Подобный код (а может это он и есть) должен быть на удаление изображения при изменении размера и вероятно есть какое-то свойство, которое могло бы это отключить.
когда нет изображения, то собственно и нечего удалять
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #6  
Старый 08.05.2015, 07:50
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Проще сказать, Винде по фигу, что имеется на холсте. Задача программиста обновлять холст и следить за его содержанием.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #7  
Старый 08.05.2015, 08:03
Аватар для SpectraL
SpectraL SpectraL вне форума
Начинающий
 
Регистрация: 19.05.2011
Адрес: Санкт-Петербург
Сообщения: 112
Версия Delphi: 10.1 Berlin
Репутация: 10
Счастье

angvelem,
1. в Delphi XE7, нарисованное на форме изображение, после изменения размера формы, не удаляется.
2. задача кода - не удалять изображение программиста.

NumLock, изображение есть в Canvas.Pixels.
Ответить с цитированием
  #8  
Старый 08.05.2015, 08:10
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Цитата:
Сообщение от SpectraL
... в Delphi XE7, нарисованное на форме изображение, после изменения размера формы, не удаляется...
А теперь попробуй форму задвинуть за край экрана и вернуть назад. Будет интересно.
И не важно какая версия Дельфи.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #9  
Старый 08.05.2015, 08:12
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Если нужно чтобы изображение не терялось, храни его, к примеру, в битмапе, а процедуре OnPaint TPaintBox-а выводи его.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #10  
Старый 08.05.2015, 08:19
Аватар для SpectraL
SpectraL SpectraL вне форума
Начинающий
 
Регистрация: 19.05.2011
Адрес: Санкт-Петербург
Сообщения: 112
Версия Delphi: 10.1 Berlin
Репутация: 10
По умолчанию

Цитата:
Сообщение от angvelem
А теперь попробуй форму задвинуть за край экрана и вернуть назад. Будет интересно.
Это к изменению размера формы не имеет отношения.
Цитата:
Сообщение от angvelem
Если нужно чтобы изображение не терялось, храни его, к примеру, в битмапе, а процедуре OnPaint TPaintBox-а выводи его.
Я так и делаю. А теперь мне нужно отключить удаление изображения при изменении размера, чтобы избавиться от мерцания.

Последний раз редактировалось SpectraL, 08.05.2015 в 10:14.
Ответить с цитированием
  #11  
Старый 08.05.2015, 08:51
icWasya icWasya вне форума
Местный
 
Регистрация: 09.11.2010
Сообщения: 499
Репутация: 10
По умолчанию

Цитата:
, чтобы избавиться от мерцания.
Так бы сразу и сказал.
Для начала Form.DoubleBuffered:=True;
Ответить с цитированием
  #12  
Старый 08.05.2015, 09:29
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Цитата:
Сообщение от SpectraL
изображение есть в Canvas.Pixels.
это ты видишь результат последних вызовов GDI функций. в реальности информация о Pixels в TPaintBox нигде не сохраняется, поэтому изображение не сохраняется.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #13  
Старый 08.05.2015, 10:10
Аватар для SpectraL
SpectraL SpectraL вне форума
Начинающий
 
Регистрация: 19.05.2011
Адрес: Санкт-Петербург
Сообщения: 112
Версия Delphi: 10.1 Berlin
Репутация: 10
По умолчанию

Цитата:
Сообщение от icWasya
Так бы сразу и сказал.
Для начала Form.DoubleBuffered:=True;
Стало больше мерцания.

Цитата:
Сообщение от NumLock
это ты видишь результат последних вызовов GDI функций. в реальности информация о Pixels в TPaintBox нигде не сохраняется, поэтому изображение не сохраняется.
Сохраняется в краткосрочной памяти, что также нормально, как и в долгосрочной.
Ответить с цитированием
  #14  
Старый 08.05.2015, 11:25
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

увеличиваем размер окна, согласись это и есть изменение размеров окна, что должно быть нарисовано во вновь появившейся области? правильно, а фиг его знает) пока сам не нарисуешь там.
так что все работает правильно, неправильно работает программист
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #15  
Старый 08.05.2015, 12:11
Аватар для SpectraL
SpectraL SpectraL вне форума
Начинающий
 
Регистрация: 19.05.2011
Адрес: Санкт-Петербург
Сообщения: 112
Версия Delphi: 10.1 Berlin
Репутация: 10
По умолчанию

Цитата:
Сообщение от NumLock
увеличиваем размер окна, согласись это и есть изменение размеров окна, что должно быть нарисовано во вновь появившейся области? правильно, а фиг его знает) пока сам не нарисуешь там.
так что все работает правильно, неправильно работает программист
Да, удаление изображения при изменении размера - вещь правильная, но мне нужно её отключить.

Последний раз редактировалось SpectraL, 08.05.2015 в 12:14.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 16:55.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025