Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.07.2011, 17:48   #1
АлексейАБ
Новичок
Джуниор
 
Регистрация: 04.07.2011
Сообщений: 4
По умолчанию Применение canvas и т.д.

Здравствуйте

Команды:
.....
MainForm.Canvas.Rectangle(X1,Y1,X2, Y2);
MainForm.Repaint;
написанные обработчике Click кнопки не дают видимого результата.

Команды:
....
MainForm.Canvas.Rectangle(X1,Y1,X2, Y2);

записанные в обработчик события OnPaint ожидаемый результат выдают.

Объясните, пожалуйста, в чем дело?
Спасибо.
АлексейАБ вне форума Ответить с цитированием
Старый 04.07.2011, 18:01   #2
Leo08
Delphi master
Пользователь
 
Аватар для Leo08
 
Регистрация: 28.05.2011
Сообщений: 96
По умолчанию

Добавьте к вару юнита
Код:
var
oldx1,oldy1,odx2,oldy2:integer;
и напишите такую процедуру:
Код:
procedure TMainForm.Draw(X1,Y1,X2,Y2,NewColor:integer);
var
tempcolor:integer;
begin
tempcolor:=Self.Canvas.Pen.Color;
Self.Canvas.Rectangle(oldX1,oldY1,oldX2, oldY2);
Self.Canvas.Pen.Color:=NewColor;
Self.Canvas.Rectangle(X1,Y1,X2, Y2);
oldX1:=X1;
oldY1:=Y1;
oldX2:=X2;
oldY2:=Y2;
Self.Canvas.Pen.Color:=tempcolor;
end;
И через неё рисуйте!
БЯЯЯГГАААААА
Leo08 вне форума Ответить с цитированием
Старый 04.07.2011, 18:03   #3
ReportCube
Форумчанин
 
Аватар для ReportCube
 
Регистрация: 11.03.2011
Сообщений: 426
По умолчанию

// Рисуем на канве
MainForm.Canvas.Rectangle(X1,Y1,X2, Y2);
// Обновляем канву - и затираем Ваш рисунок
MainForm.Repaint;
// Генерируем событие OnPaint
ReportCube вне форума Ответить с цитированием
Старый 04.07.2011, 21:54   #4
АлексейАБ
Новичок
Джуниор
 
Регистрация: 04.07.2011
Сообщений: 4
По умолчанию

Цитата:
Сообщение от ReportCube Посмотреть сообщение
// Рисуем на канве
MainForm.Canvas.Rectangle(X1,Y1,X2, Y2);
// Обновляем канву - и затираем Ваш рисунок
MainForm.Repaint;
// Генерируем событие OnPaint
Дело в том, что я не увидел результата команды
MainForm.Canvas.Rectangle(X1,Y1,X2, Y2).
Предположил, что результат будет виден после
MainForm.Repaint.
По аналогии, с присвоением неких свойств визуальным компонентам. Результат часто можно видеть только после Refresh().

В общем, вопрос остается.
Почему отсутствует видимый результат команды
MainForm.Canvas.Rectangle(X1,Y1,X2, Y2);
выполненной в обработчике ONCLICK кнопки?

Координаты были указаны правильно. Та же команда с теми же параметрами, вызванная в обработчике события ONPAINT формы сработала.
АлексейАБ вне форума Ответить с цитированием
Старый 04.07.2011, 22:02   #5
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

> вопрос остается

ну так вам же написали, что Repaint затирает ваш рисунок, какие ещё вопросы могут быть.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 04.07.2011, 22:08   #6
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,543
По умолчанию

Цитата:
В общем, вопрос остается.
Почему отсутствует видимый результат команды
MainForm.Canvas.Rectangle(X1,Y1,X2, Y2);
выполненной в обработчике ONCLICK кнопки?
после выполнения этих команд (после клика) система посчитала что неплохо было бы перерисовать форму (например перерисовать вид кнопки нажата/отжата) и соответственно этому отправила сообщение WM_PAINT. Результат восстановлен исходный вид.
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 04.07.2011, 22:15   #7
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

> система посчитала

тут прикол в том, что Repaint() вызывает сам программист )
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 04.07.2011, 22:54   #8
ReportCube
Форумчанин
 
Аватар для ReportCube
 
Регистрация: 11.03.2011
Сообщений: 426
По умолчанию

При наступлении события OnPaint виден результат команды... Вопрос: почему? Ставим в событие OnPaint точку останова, допустим на Sleep(0), выполняем первую команду и... оказываемся на точке останова... Почему? Смотрим исходники...
ReportCube вне форума Ответить с цитированием
Старый 05.07.2011, 08:22   #9
АлексейАБ
Новичок
Джуниор
 
Регистрация: 04.07.2011
Сообщений: 4
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
после выполнения этих команд (после клика) система посчитала что неплохо было бы перерисовать форму (например перерисовать вид кнопки нажата/отжата) и соответственно этому отправила сообщение WM_PAINT. Результат восстановлен исходный вид.
Теперь понятно в чем дело.
Спасибо огромное!
АлексейАБ вне форума Ответить с цитированием
Старый 05.07.2011, 08:31   #10
АлексейАБ
Новичок
Джуниор
 
Регистрация: 04.07.2011
Сообщений: 4
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
после выполнения этих команд (после клика) система посчитала что неплохо было бы перерисовать форму (например перерисовать вид кнопки нажата/отжата) и соответственно этому отправила сообщение WM_PAINT. Результат восстановлен исходный вид.
Теперь видимо понятно в чем дело.
Объект Canvas не хранит изображение! Перерисовка формы восстанавливает изображение визуальных компонент на форме потому что эти компоненты фактически прорисовывают себя заново на основе текущих своих свойств. А вот нанесенное на CANVAS изображение не перерисовывается. Следовательно, для видимости рисунка по CANVAS необходимо выполнять рисование в обработчике ONPAINT. Для изменения изображения надо менять описывающие изображение параметры и отправлять WM_PAINT для перерисовки с новыми параметрами.
Спасибо огромное!
АлексейАБ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
применение c++ vvsh Общие вопросы C/C++ 21 22.01.2011 22:53
Применение yacc Tane4ka Общие вопросы C/C++ 0 31.03.2010 21:38
применение ComboBox Improviz Компоненты Delphi 2 21.02.2010 12:52
Применение формул swips Microsoft Office Excel 2 30.06.2009 14:23
Применение KeyboardProc() Zeraim Win Api 3 14.05.2008 12:42