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

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

После запуска вылетает [D7]


Jonis_84 ©   (2012-04-24 23:10:00) 

Доброго времени суток!Подскажите пожалуйста почему после запуска прога или вылетает или наоборот закрыть можно только через дисп.задач.Если не сложно то подскажите решения(Прога снимает опред. часть экрана по заданным координатам)
procedure TForm2.Timer1Timer(Sender: TObject);
var
Poz:TPoint;
srect,drect :trect;
iwidth,iheight:integer;
itmpx,itmpy :real;
c :tcanvas;

begin
iwidth:=image1.width;
iheight:=image1.height;
 drect:=bounds(0,0,iwidth,iheight);
   itmpx:=iwidth/2 ;
   itmpy:=iheight/2;
Poz.X:=StrToInt(Edit1.Text);
Poz.Y:=StrToInt(Edit2.Text);
   srect:=rect(Poz.x,Poz.y,Poz.x,Poz.y);
   inflaterect(srect,round(itmpx),round(itmpy));
     c:=tcanvas.create;
     c.handle:=getdc(getdesktopwindow);
image1.canvas.copyrect(drect,c,srect);
     c.free;
application.processmessages;
end;


han_malign   (2012-04-25 15:03:00) [1]


  WM_TIMER   |  TApplication.Run
             |     TApplication.HandleMessage
             |        TApplication.ProcessMessage
             |          tform1.timer1timer
             |             ...  
             |             ...  
  WM_TIMER   |             ...  
             |             // Обязательно обрабатываем все сообщения windows.
             |             TApplication.ProcessMessages
             |                TApplication.ProcessMessage
             |                   tform1.timer1timer
             |                      ...  
             |                      ...  
  WM_TIMER   |                      ...  
             |                      // Обязательно обрабатываем все сообщения windows.
             |                      TApplication.ProcessMessages
             |                         TApplication.ProcessMessage
             |                            tform1.timer1timer
             |                               ...  
             |                               ...  
  WM_TIMER   |                               ...  
                 .........................................


Плохиш   (2012-04-25 11:44:00) [2]


> Jonis_84 ©   (25.04.12 11:10) [4]

Ты больше там говнокод не бери.

> Jonis_84 ©   (25.04.12 11:40) [8]

Надеюсь это application.processmessagesиз кода выкинул?


Jonis_84   (2012-04-25 11:40:00) [3]

Спасибо


AV   (2012-04-25 11:36:00) [4]

не успевает выйти из процедуры, как снова заходит
все параметры при входе и адреса возврата копируются в стэк
т.о. стэк растет пока не преполняется

конструкция

onTimer;
timer1.enable := false;
  бла-бла-бла
timer1.enable := true;

гарантирует, что не зайдет второй раз, пока не выйдет

примерно поэтому!!!!!!!!!!!!!!! :)


Jonis_84   (2012-04-25 11:32:00) [5]

Спасибо!!!Работает , а почему?????????????????????????????????????????????????


AV   (2012-04-25 11:12:00) [6]


>  'stack overflow

procedure tform1.timer1timer(sender: tobject);
....
begin
 timer1.enable := false;
   бла-бла-бла
 timer1.enable := true;
end;


Jonis_84   (2012-04-25 11:10:00) [7]

Работает но не продолжительно,через какое-то врямя сообщение "progect ....exe raised excepttion class $C00000FD with message 'stack overflow at 0x76b245cc'"-если запущено из delphi ,а если с  ....exe то закрыть можно только через дисп.задач,
исход. взял Здесь:
procedure tform1.timer1timer(sender: tobject);
var
srect,drect,posforme :trect;
iwidth,iheight,dmx,dmy:integer;
itmpx,itmpy :real;
c :tcanvas;
kursor :tpoint;

begin
if not isiconic(application.handle) then
begin // Получаем координаты курсора
getcursorpos(kursor);

// posform представляет прямоугольник с
// координатами form (image control).
posforme:=rect(form1.left,
form1.top,
form1.left+form1.width,
form1.top+form1.height);
//Показываем magnified screen
//если курсор за пределами формы.
if not ptinrect(posforme,kursor) then begin
// Далее код можно использовать для увеличения выбранной
// части экрана.
iwidth:=image1.width;
iheight:=image1.height;
drect:=bounds(0,0,iwidth,iheight);
itmpx:=iwidth / (trackbar1.position * 4);
itmpy:=iheight / (trackbar1.position * 4);
srect:=rect(kursor.x,kursor.y,kursor.x,kursor.y);
inflaterect(srect,round(itmpx),round(itmpy));
//Получаем обработчик(handle) окна рабочего стола.
c:=tcanvas.create;
try
c.handle:=getdc(getdesktopwindow);
//Передаём часть изображения окна в tImage.
image1.canvas.copyrect(drect,c,srect);
finally
c.free;
end;
end;
// Обязательно обрабатываем все сообщения windows.
application.processmessages;

end;
end;


Anatoly Podgoretsky   (2012-04-25 08:58:00) [8]


> А с какими целями в процедуру таймера поместили вызов application.
> processmessages;

Возможно, чтобы повесить программу.


AV   (2012-04-25 08:38:00) [9]

Чистый проект
copy|paste
- не вылетает, закрывается по крестику нормально


Германн   (2012-04-25 01:11:00) [10]

А с какими целями в процедуру таймера поместили вызов application.processmessages;
?


Наверх

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