Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Задваивается изображение формы


Страницы:   1 2 3

delhpiCasual ©   (2012-07-13 06:56:00) 

создана форма tv. В один прекрасный момент вызывается команда tv.Show;

затем много раз по ходу выполнения вызывается процедура:

Procedure RefreshTV(tbmp: TBitmap);
begin
 tv.Left := 0;
 tv.Top := 0;
 tv.Height := tbmp.Height + 100;
 tv.Width := tbmp.Width + 100;
 tv.Image1.Left := 0;
 tv.Image1.Top := 0;
 tv.Image1.Height := tbmp.Height;
 tv.Image1.Width := tbmp.Width;
 tv.Image1.Picture.Assign(tbmp);
 tv.Refresh;
end;

после первой команды форма появляется примерно в центре экрана. Процедура же ее перемещает в верхний угол и меняет размеры. и рисует в ней картинку. В режиме отладки так все оно и происходит. Но если запускать exe файл непосредственно, или в режиме исполнения из делфи, то после первоначального появления формы на ней вдруг появляется надпись (не отвечает). А в верхнем углу появляется вторая такая же форма, а первая никуда не исчезает и ее размеры не меняются под размер картинки, но картинка исправно выводится в обе формы. основное окно программы и первую форму можно перетаскивать мышкой по рабочему столу, в то время как "правильная форма" никаким манипуляциям не поддается. Что за ужас?


Inovet   (2012-07-14 14:43:00) [1]

> [40] AV ©   (14.07.12 13:41)
> >  Application.ProcessMessages
>
> думаю :)

Ну так автор спросил перед этим где

> [37] delhpiCasual   (14.07.12 12:29)
> где?

Вот и сомневаюсь.


AV   (2012-07-14 13:41:00) [2]


>  Application.ProcessMessages

думаю :)


Inovet   (2012-07-14 13:19:00) [3]

> [38] delhpiCasual   (14.07.12 12:45)
> помогло

Что из двух?


delhpiCasual   (2012-07-14 12:45:00) [4]


> По-простому, лечится вызовом Application.ProcessMessages
> в теле цикла вычислений.
> Но лучше вынести долгие операции в отдельный поток.

помогло


delhpiCasual   (2012-07-14 12:29:00) [5]


> Так сказали уже.


где?


Омлет   (2012-07-14 12:25:00) [6]

> Но ведь никто не знает как это лечить, даж не понятно с
> чем это связано и что курить.


По-простому, лечится вызовом Application.ProcessMessages в теле цикла вычислений.
Но лучше вынести долгие операции в отдельный поток.


Inovet   (2012-07-14 12:19:00) [7]

> [34] delhpiCasual   (14.07.12 12:13)
> Но ведь никто не знает как это лечить, даж не понятно с чем это связано

Так сказали уже.


delhpiCasual   (2012-07-14 12:13:00) [8]

Нет естественно это не стало нормально. Но ведь никто не знает как это лечить, даж не понятно с чем это связано и что курить. Видимо остается только терпеть.


Омлет   (2012-07-14 09:47:00) [9]

В начале ветки ты спрашивал, что за ужас. А теперь для тебя это стало нормально? Т.е. тема закрыта?
1с 7.7 - плохой пример для подражания.


delhpiCasual   (2012-07-14 05:26:00) [10]

12% загрузка проца. 15 мб памяти занимает в озу.


delhpiCasual   (2012-07-14 05:25:00) [11]


> Да всегда виснет. Просто винда пишет, что не отвечает, если
> ты что-то пытаешься сделать с окном зависшего приложения.
>  Посмотри загрузку процессора в диспетчере задач.


ну в моем понимании "виснет", значит ничего не делает. Но я вижу что на самом деле процесс идет и она выдает сообщения о том что она делает, и выполняет действия, которые должна выполнять. Т.е. она идет по алгоритму. Такую же фигню можно наблюдать в 1с 7.7 когда выполняется обработка большая, если пытаться кантовать программу во время ее исполнения или выходить по альт. таб, то форма приложения перестает обновляться и выглядит так будто зависло, а потом обработка заканчивается и она "отвисает", может 7.7 тоже писали на делфи? )))


Омлет   (2012-07-13 23:42:00) [12]


> а почему оно "виснет" только если окно попытаться пошевелить,
>  и не виснет если нет?

Да всегда виснет. Просто винда пишет, что не отвечает, если ты что-то пытаешься сделать с окном зависшего приложения. Посмотри загрузку процессора в диспетчере задач.


delhpiCasual   (2012-07-13 19:52:00) [13]


> У тебя банально виснет приложение. Слишком часто(читай непрерывно)
> вызывается findPicture.


а почему оно "виснет" только если окно попытаться пошевелить, и не виснет если нет? а без окна так вообще все шикарно...


delhpiCasual   (2012-07-13 19:50:00) [14]


> ProcessMessage() вызываешь в цикле поиска картинки?


нет


Омлет   (2012-07-13 18:32:00) [15]


> delhpiCasual   (13.07.12 16:51) [25]

У тебя банально виснет приложение. Слишком часто(читай непрерывно) вызывается findPicture.


Inovet   (2012-07-13 17:15:00) [16]

> [25] delhpiCasual   (13.07.12 16:51)
> При этом на главная форма (на которой расположена кнопка
> запускающая программу) занята и соответственно не перемещается.
> А ТВ можно возить по экрану, только вот она становится неотвечающей
> и ничего не показывается в ней.

ProcessMessage() вызываешь в цикле поиска картинки?


delhpiCasual   (2012-07-13 16:51:00) [17]

больше кода не поможет. Упростил ситуацию до предела. Закоментировал рефреш вообще. Результат - второе окно не появляется. Но если передать фокус tv то оно переходит в состояние "не отвечает". Подозреваю что я неправильно создаю эту форму, только вот не знаю как правильно.

При этом на главная форма (на которой расположена кнопка запускающая программу) занята и соответственно не перемещается. А ТВ можно возить по экрану, только вот она становится неотвечающей и ничего не показывается в ней.

Если же рефреш вызывать, то еcли  tv.show вызывается прямо перед вызовом tvrefresh то обновляется показаное окно, расширяется и переносится в заданные координаты. Если же после tv.show программа долго пытается получить скрин, т.е. несколько секунд не вызывается ни поиск картинки ни рефрешь, то когда таки рефрешь делается. показанное окно остается на месте, а под всеми окнами появляется еще одно окно tv уже нормальной формы, т.е. вместо одного окна тv у меня их 2 ) и в обоих меняется картинка.

Procedure RefreshTV(tbmp: TBitmap);
begin
 
 if not tv.Visible then
   tv.Show;

 if (not(tv.Left = 0)) or (not(tv.Top = 0)) then
 begin
   tv.Left := 0;
   tv.Top := 0;
 end;
 if (not((tv.Height = tbmp.Height + 100))) or
   (not((tv.Width = tbmp.Width + 100))) then
 begin
   tv.Height := tbmp.Height + 100;
   tv.Width := tbmp.Width + 100;
 end;
BitBlt(tv.Canvas.Handle, 0, 0, tbmp.Width, tbmp.Height, tbmp.Canvas.Handle, 0, 0, SRCCOPY);

end;

т.е. если сделать так, то ситуация не меняется.


Омлет   (2012-07-13 12:16:00) [18]

Нужно больше кода.


delhpiCasual   (2012-07-13 12:12:00) [19]


> С такой скоростью ничего не должно висеть. Опять что-то
> скрываешь.


ну так она и не висит, она конкретно глючит )


delhpiCasual   (2012-07-13 12:09:00) [20]

хм, даже со слипом. в первый заход в рефреш форма не перерисовалась, а нарисовалась новая, а основная и первая остались висеть поверх новой. Причем ту что появилась при tv.Show можно таскать мышкой, а новую нельзя и при этом картинки нормально рисуются. И глюк этот никогда не появляется в режиме отладки, и гораздо реже в режиме исполнения если вставить паузу. вообщем дурдом.


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо