Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите с перерисовкой компонентов TImage, 2 TImage'а, при появлении 2го, 1ый исчез 
:(
    Опции темы
DelphiFun
Дата 3.12.2006, 02:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 10.11.2006

Репутация: нет
Всего: нет



Имеется 2 компонента TImage: Image1, Image2.
Image2 поверх Image1 ( размеры обоих идентичны ).
Image2.Visible по загрузке у меня False. На Image1 производится отрисовка через Image1.Canvas.
После того, как я отображаю Image2 ( код на кнопке ):
Код
Image2.Visible := True;

Все заливается белым, не видно прошлого Image1. Разве Image2.Transparent:=true; недостаточно для того, чтобы первый компонент был виден?
Как можно сделать так, что когда ( пустой ещё ) Image2 только становится быть видимым, чтобы при этом виделся и прошлый Image1?

Кстати, ещё проблемка такая есть... При том же расположении ( размеры Image'ев одинаковые ), когда "рисуешь" ( реализовано простейшим соединением линией текущей и прошлой точки ) на Image2 всё начинает моргать и DoubleBuffered:=True; не решает ситуацию. 
Как можно обойти эту проблему?

Добавлено @ 03:07 
Хм, первую проблему вроде бы решил. После Image2.Visible:=true; можно сделать:
Код
Image2.Picture := nil;

что и нужно, Image2 действительно прозрачна и соответственно виден Image1;
Не поверите, но 3 часа сегодня пробился с этой проблемой, написал сообщение в форум и тут же нашёл ответ smile


А вот со второй проблемой ( когда всё жутко моргает, видно как перерисовывается ) с этим не знаю что делать.. Подскажите, а?
PM MAIL   Вверх
DelphiFun
Дата 3.12.2006, 03:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 10.11.2006

Репутация: нет
Всего: нет



Проблема даже интереснее. Делаю:
Код
Image2.Transparent := FALSE;

рисую на нём и мелькает так, что виднеется Image1, хотя Image НЕ прозрачный..
PM MAIL   Вверх
ivan219
Дата 3.12.2006, 07:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1121
Регистрация: 19.11.2005
Где: Планета земля

Репутация: 2
Всего: 12



Может с ночало на рисовать обе картинки или одну а потом зделать эти картинки видимыми т.е. 
Код

 Image1.Visible := True;
 Image2.Visible := True;

и на обеих вкл. 
Код

Image1.Transparent:=True;
Image2.Transparent:=True;

PM MAIL ICQ   Вверх
DelphiFun
Дата 3.12.2006, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 10.11.2006

Репутация: нет
Всего: нет



неа, тоже не прокатывает.. Всё равно изображение мелькает.

Причем и вот это уже проделывал:
Код
InvalidateRect( Image1.Canvas.Handle, NIL, FALSE ) ;
Image1.ControlStyle := Image1.ControlStyle + [ csOpaque ] ;

и со второй тоже самое проделывал и хоть ты тресни! Как отключить эту перерисовку??

PM MAIL   Вверх
jsa
Дата 4.12.2006, 06:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 704
Регистрация: 19.1.2006
Где: Новосибирск

Репутация: 1
Всего: 20



используй ImageList, и один Image, и будет тебе счастье


--------------------
Все мы, на перине с песней, строим небо на земле © Ю. Шевчук
PM MAIL ICQ   Вверх
Paradise
Дата 4.12.2006, 11:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 85
Регистрация: 22.11.2006

Репутация: нет
Всего: нет



Цитата
используй ImageList, и один Image, и будет тебе счастье

Действительно, зачем тебе два Image, используй один:
  1) создается две процедуры (одна для фона, другая для линий (или что ты там рисуешь));
  2) в определенном месте кода, или при определенном событии используешь эти процедуры.
Попробуй smile 
PM MAIL   Вверх
x77
Дата 4.12.2006, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1255
Регистрация: 25.3.2002

Репутация: 19
Всего: 22



ещё имеет смысл включить для формы DoubleBuffered := TRUE. тогда чтобы у тебя не лежало на этой форме, оно сначала будет отрисовываться на виртуальный bitmap, и по идее, мерцания там не будет.


--------------------
Я никогда не сопротивлялся искушению, поскольку узнал: что мне
не нравится, то меня не искушает.
© Джордж Бернард Шоу (Ирландия)
PM MAIL ICQ   Вверх
DelphiFun
Дата 4.12.2006, 22:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 10.11.2006

Репутация: нет
Всего: нет



x77
Я в первом сообщении написал, что не решило это проблемы в моём случае.

Paradise
Ну вообще проблема у меня в следующем. Имеется некоторый рисунок отрисованный на канве. Нужно скажем нарисовать линию. 
Рисуется она как в MSPaint зажимаешь кнопку мыши, ведёшь и отпускаешь.
Цвет фона у меня белый. Когда происходит процесс "ведёшь" - я реализую это просто. Рисую следующую линию, прошлую закрашиваю цветом фона, белым.
Но получается, что и рисунок на канве также затирается этими белыми линиями.

Чтобы как-то выйти из этой ситуации. Я решил расположить 2 TImage. На одном ( нижнем ) основной рисунок, на переднем ( прозрачном ) рисуем линию, после того как рисовании линии закончено кидаем её на задний фоновый.
Всё бы ничего, но как начало моргать smile

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

Касательно одной картинки ( Image ), приходит в голову только такое решение. Сохранять прошлое состояние канвы в TBitmap, рисуем линию ( при этом белыми линиями уродуем текущую канву ), после отпуска рисовании линии, рисуем его на прошлом состоянии и выгружаем результат в текущий рисунок.
Но это с "уродством" текущей картинки, т.к. будет заливаться белыми линиями, хотя после окончания рисования, белые линии исчезнут.. но всё-таки..
PM MAIL   Вверх
ivan219
Дата 5.12.2006, 00:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1121
Регистрация: 19.11.2005
Где: Планета земля

Репутация: 2
Всего: 12



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

Можно код посмотреть smile 
PM MAIL ICQ   Вверх
DelphiFun
Дата 5.12.2006, 06:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 10.11.2006

Репутация: нет
Всего: нет



Код я бы не хотел открывать.

А как же первую картинку сделать "неактивной". По видимому это именно то, что мне нужно, да не получается..
PM MAIL   Вверх
ivan219
Дата 5.12.2006, 08:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1121
Регистрация: 19.11.2005
Где: Планета земля

Репутация: 2
Всего: 12



Через Enable
PM MAIL ICQ   Вверх
Paradise
Дата 5.12.2006, 13:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 85
Регистрация: 22.11.2006

Репутация: нет
Всего: нет



  У меня тоже было чтото такое:
Когда я рисовал несколько графиков на канве формы, то получалось чтото вроде анимации (было видно как изображается каждая точка графика), но когда я стал ето все делать на Image анимации никакой небыло, просто белый фон до тех пор пока график не нарисуется полностью. 
  У меня было две процедуры (одна рисовала фон и координатную плоскость - Ф1, а другая графики Ф2), с помощью процедуры Ф1 я предавал начальный вид Image потом рисовал сколько хотел графиков процедурой Ф2, если нужно стереть все нарисованные графики, то Ф1. Только сопровождалось все это мерцанием белого фона (по моему твоя проблема). Ты рисуешь мышкой, потому при движенни мышкой рисунок перерисовывается и мигает фон (если мышкой не двигать то мерцания нет (я правильно понял?)). 
  Предлагаю тебе попробывать мой способ на канве формы, если получится, то нужно искать замену Image. smile 

Компонент ControlBar1 (закладка Additional) так же рисует как и канва формы.

Это сообщение отредактировал(а) Paradise - 5.12.2006, 15:42
PM MAIL   Вверх
DelphiFun
Дата 8.12.2006, 00:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 10.11.2006

Репутация: нет
Всего: нет



Эту проблему мне удалось обойти стороной.
Отличный пример на тему рисовалки:
...\Delphi7\Demos\Doc\Graphex\
где показано как можно стирать прошлую линию не закрашивая "цветом фона", а закрашивать теми цветами, что были под текущим нарисованым объектом.
Происходит это через "Pen.Mode := pmNotXor" канвы картинки.

Таким образом мне удалось обойтись без второй картинки. Но столкнулся со следующей проблемой, которая опять порождает необходимость введения второго Image, как и в прошлом случае. 
Может быть Вы подскажете как обойтись без него..?

А задача такая. Необходимо кинуть на канву некоторый объект ( прямая линия, кривая, окружность и т.д. и т.п. ), каким образом можно изменить размеры его?
Получается что, опять введение второго Image на котором будет этот объект, ему присвоить "Stretch := True" ( изначально размер его совпадает с размером объекта ) и изменять мышкой уже этот Image, после окончания деяния перекладывать его на основной Image.. Пока что такое решение у меня. Но тут думаю опять начнуться проблемы с перерисовкой.. Есть ли у Вас какие-либо предположения как это сделать можно по другому?
( вовсе не обязательно, что переразмерять прийдётся простые объекты, но и части канвы. Это я к тому, что объекты мат. формулой не задашь. )

PM MAIL   Вверх
Paradise
Дата 8.12.2006, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 85
Регистрация: 22.11.2006

Репутация: нет
Всего: нет



Насчет изменения размера ничего не могу сказать, но я забыл об одном компоненте PaintBox в закладке System. В нем есть событие OnPaint и рисует как канва формы, и прозрачен он сам-по-себе. По идее с этим компонентом у тебя проблемы должны исчезнуть каким бы ты способом не рисовал. Удачи smile 
PM MAIL   Вверх
Alexeis
Дата 8.12.2006, 18:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



DelphiFun, вообще мерцание закономерно smile от него будет не так просто избавиться, две имаги имеют общий DC (у них ведь одно родительское окно). Вот вторая имага должна стереться подождать пока закончит перерисовку первая и затем должна перерисоваться, но вот похоже, что в действительности их перерисовка асинхронна, потому советую не заморачиваться их синхронизацией и рисовать все объекты на одной единственной имаге самостоятельно.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0583 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.