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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.11.2011, 12:01   #1
Warn
Форумчанин
 
Аватар для Warn
 
Регистрация: 03.11.2011
Сообщений: 230
По умолчанию Ошибка при выходе из программы

Программа запускается работает но при нажатии Esc для выхода в релизной версии возникает ошибка, уже сто раз просматривал код, комментил строчки но все одно - вылетает ошибка. В чем может быть проблема?

Exe.dpr
Код:
program Exe01;

{$APPTYPE CONSOLE}

uses
  SysUtils, App;

var
	App : TApp;
begin

	App := TApp.Create();
  App.InitApplication();
  App.Process();
  //App.Destroy();
  
end.
App.pas
Код:
unit App;

interface
//{$DEFINE DEBUG_APP}

uses Windows, Messages;

const Default_Window_Width : Cardinal = 1024;
const Default_Window_Height : Cardinal = 768;
const Default_Window_Title : PChar = nil;

type procEvent = procedure ( wpr, lpr : Longint ) of object;

type TApp = class
	private
  	Wc : TWndClass;
    Msg : TMsg;
    Instance : HWnd;
    Handle : HWnd;
    Width : Integer;
    Height : Integer;
    X : Integer;
    Y : Integer;

    procedure InitWindow();
    procedure InitDirect3D();

  public
  	IsRunning : Boolean;

    constructor Create();
    procedure InitApplication();
    procedure Process();
    procedure MouseEvent( wpr, lpr : Longint );
    procedure KeyboardEvent( wpr, lpr : Longint );
    procedure ShowWindow ( Visible : Boolean );
    function WinProc ( HWND, MSG, WPR, LPR: Longint ) : Longint; stdcall;
    procedure Cleanup();
    destructor Destroy();override;
  end;
  PApp = ^TApp;


implementation

function WindowCallBack ( HWND, MSG, WPR, LPR : Longint ):Longint; stdcall;
var
	AppInst : PApp;
begin
  AppInst:=Pointer(GetWindowLongPtr(HWND, GWLP_USERDATA));
  if (AppInst<>nil) then begin
  	result := AppInst.WinProc(HWND, MSG, WPR, LPR);
    Exit;
  end;

  result:=defwindowproc(hwnd,msg,wpr,lpr);
end;

procedure TApp.Cleanup();
begin

	//PostQuitMessage(0);
	IsRunning := False;
end;

function TApp.WinProc ( HWND, MSG, WPR, LPR: Longint ) : Longint; stdcall;
begin

	if (msg=wm_KeyDown) then
  	begin
  		KeyboardEvent(wpr,lpr);
  	end
  else if(msg=WM_MOUSEMOVE) then
  	begin
  		MouseEvent(wpr,lpr);
  	end
  else if(msg=WM_DESTROY) then
  	begin
  		//Cleanup();
  	end;

    result:=defwindowproc(hwnd,msg,wpr,lpr);

end;

procedure TApp.MouseEvent( wpr, lpr : Longint );
begin

end;

procedure TApp.KeyboardEvent( wpr, lpr : Longint );
begin

	if (WPR = VK_ESCAPE) then
  begin
  	IsRunning := False;
  end;


end;

procedure TApp.ShowWindow ( Visible : Boolean );
begin
 if ( Visible ) then
 	Windows.ShowWindow ( Handle, SW_SHOW )
 else
  Windows.ShowWindow ( Handle, SW_HIDE );
end;

procedure TApp.InitWindow();
begin

	Instance:=GetModuleHandle(nil);

  Width := Default_Window_Width;
  Height := Default_Window_Height;

	wc.style := CS_HRedraw or CS_VRedraw;
	wc.Lpfnwndproc := @WindowCallBack;
	wc.cbClsExtra := 0;
	wc.Hinstance := Instance;
	wc.HbrBackground := CreateSolidBrush(BLACK_BRUSH);
	wc.LpszClassName := 'WinAppClass';
	wc.Hcursor := LoadCursor(0,IDC_ARROW);
	wc.lpszMenuName := nil;
	wc.hIcon := 0;

	Windows.RegisterClass(wc);

	Handle:=CreateWindow('WinAppClass', Default_Window_Title, WS_EX_TOPMOST, 0, 0, Width, Height, 0, 0, Instance, @WindowCallBack);
  SetWindowLong(self.Handle, GWL_USERDATA, Integer(self));

	Windows.ShowWindow( Handle, SW_SHOW );
	UpdateWindow( Handle );
	self.Width := Width;
	self.Height := Height;
	X:=0;
	Y:=0;

end;

procedure TApp.InitDirect3D();
begin

end;

constructor TApp.Create();
begin


end;

procedure TApp.InitApplication();
begin

	InitWindow();
  InitDirect3D();
end;

procedure TApp.Process();
begin
  IsRunning := True;
	while (IsRunning) do
  begin
  	GetMessage(Msg, Handle, 0, 0);
    //PeekMessage(msg,handle,0,0,PM_REMOVE);
    TranslateMessage(msg);
    DispatchMessage(msg);

  end;

  Cleanup();

end;

destructor TApp.Destroy();
begin
	UnregisterClass('WinAppClass',Instance);
  DestroyWindow(Handle);
end;

end.
Warn вне форума Ответить с цитированием
Старый 07.11.2011, 12:34   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

думаю ошибка в том, что винда уничтожает окно при завершении процесса(кстати, за собою не прибираете...)
и WM_DESTROY в том числе, а объекта уже нет.
у меня только такая идея(пока вы не отладите на точное место ошибки)

советую пробить бряком на WindowCallback(с сообщением WM_DESTROY)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 07.11.2011, 14:45   #3
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Какая именно ошибка и на какой строчке вылетает - это военная тайна или нам предлагается угадать?
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 07.11.2011, 16:16   #4
Warn
Форумчанин
 
Аватар для Warn
 
Регистрация: 03.11.2011
Сообщений: 230
По умолчанию

пробовал трассировать дебагером с момента выхода - ошибок нету.
выкинул класс TApp к чертям и сделал окно и его обработку на процедурах теперь все работает (пока что). может раньше и правда имела место ошибка - обращения к несуществующему классу (его инсту, которого нет уже).
Warn вне форума Ответить с цитированием
Ответ


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

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

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Подтверждения при выходе из программы Ayubkhon Общие вопросы Delphi 18 18.06.2013 00:53
Зависание программы при выходе codermoder Работа с сетью в Delphi 6 18.12.2010 23:16
Ошибка при выходе из игры cs 1.6 pavel42 Компьютерное железо 19 20.10.2009 21:00
Ошибка при выходе из ждущего режима. С.М.С Компьютерное железо 2 08.03.2009 02:38