Форум: "Игры";
Текущий архив: 2004.10.17;
Скачать: [xml.tar.bz2];
ВнизПрошу разъяснить и помочь Найти похожие ветки
← →
ferr (2004-06-15 21:25) [0]Когда я беру пример из книги Краснова DirectX Chap4 Ex09 его (Краснова программа на диске) откомпилированная версия работает нормально, но если я скомпилирую сам, данный проект, то при завршении он генерирует ошибку.
Может кто подскажет что делать.
← →
Jel © (2004-06-15 21:52) [1]Телепаты нонче в отпуске. Ты бы хоть написал какую ошибку, кода кусочек привел. А так...
← →
ferr (2004-06-15 22:41) [2]Телепаты нонче в отпуске.
А жаль.
Цитирую ошибку с экрана монитора:
Access violation at adress 004068b8 in module "He.exe". Read of address 00000008.
procedure TfrmDD.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Hide
end;procedure TfrmDD.FormDestroy(Sender: TObject);
var
i : Integer;
begin
{OK}
if Assigned(FDD) then begin
if Assigned(FDDPal) then FDDPal := nil;
{OK}
for i := 0 to NumSprites - 1 do begin
{OK - 1}
if Assigned(spr [i].FSpriteSurface) then begin
{OK - 1}
spr [i].FSpriteSurface._Release;
{OK - 1}
spr [i].FSpriteSurface := nil;
{NOT}
end;
{NOT}
spr [i].Free;
end;
if Assigned(FDDSPrimary) then begin
FDDSPrimary._Release;
FDDSPrimary := nil;
end;
FDD._Release;
FDD := nil;
end;
end;
← →
Огромное Кулясище (2004-06-15 23:40) [3]Это если запускаешь из Delphi. Компилируй и запускай вне среды.
← →
ferr (2004-06-16 00:37) [4]Из Delphi я никогда не запуская, в 50% запусков компутер виснет напрочь, да и при чём это.
← →
Огромное Кулясище (2004-06-16 01:01) [5]Нынче совсем сейчас запускал пример (тот, что с Мона Лизой) из под Delphi, после окончания - AV вылетает. Запустил откомпиленое приложение просто из проводника - всё нормально. Дело в отладчике Delphi. Так что подумал...
В твоём случае... э, если ты дейстивтельно не запускал из под Delphi, то либо: конфликт версий Delphi, проблемы с видеокартой, покоцаный DirectX, вмешалось НЛО...
← →
cyborg © (2004-06-16 09:22) [6]Закомментируй все строчки ._Release;
Там примеры для Дельфи5, а у тебя или шестая или седьмая.
← →
ferr (2004-06-16 11:52) [7]Закомментируй все строчки ._Release;
Там примеры для Дельфи5, а у тебя или шестая или седьмая.
Вы совершенно правы, но я не знаю что значит закомментируй.
← →
cyborg © (2004-06-16 11:58) [8]Это значит впереди поставить //
← →
ferr (2004-06-16 12:01) [9]Может так
TSprite = class
FSpriteSurface : IDirectDrawSurface7;
...
TfrmDD = class(TForm)
...
private
FDD : IDirectDraw7;
FDDSBack : IDirectDrawSurface7;
FDDSPrimary : IDirectDrawSurface7;
FDDPal : IDirectDrawPalette;
...
← →
ferr (2004-06-16 12:03) [10]const
NumSprites = 10;
varspr : Array [0..NumSprites - 1] of TSprite;
← →
cyborg © (2004-06-16 12:07) [11]
> [9] ferr (16.06.04 12:01)
Что может так?
← →
ferr (2004-06-16 12:08) [12]Это от меня требовалось?
← →
cyborg © (2004-06-16 12:27) [13]От тебя требуется:
procedure TfrmDD.FormDestroy(Sender: TObject);
var
i : Integer;
begin
if Assigned(FDD) then begin
if Assigned(FDDPal) then FDDPal := nil;
for i := 0 to NumSprites - 1 do begin
if Assigned(spr [i].FSpriteSurface) then begin
// spr [i].FSpriteSurface._Release;
spr [i].FSpriteSurface := nil;
end;
spr [i].Free;
end;
if Assigned(FDDSPrimary) then begin
// FDDSPrimary._Release;
FDDSPrimary := nil;
end;
// FDD._Release;
FDD := nil;
end;
end;
← →
ferr (2004-06-16 12:35) [14]Так я уже пытался.
Приожение подвисает и Windows заботливо хочет что-то отправить, но мы ему отказываем и тут:
Application Error
Exception EAccessViolation in module Project1.exe at 000059A4.
Access violation at address 004059A4 in module "*.exe". Read of address 00000008
← →
cyborg © (2004-06-16 12:38) [15]Сомневаюсь я, что так ты пытался, судя по [2] ferr (15.06.04 22:41) ошибка вываливается на релизе, закомментируй его, не будет вываливаться.
← →
ferr (2004-06-16 12:45) [16]Судя по ferr (16.06.04 12:35) [14] я не брезговал второй раз попытаться.
← →
cyborg © (2004-06-16 12:58) [17]Ну так покажи где теперь вываливается?
← →
КиТаЯц © (2004-06-16 13:09) [18]Да... У меня вот тоже "затыки" бывают. Ну не идет прога и все тут. Хоть че ремарь - не идет, или ввобще ничего на форме нет (это когда заремариш слишким много). Ну, думаеш, надо успокоится и с другого бока подойти. Покуриш, кофя тяпнеш, садишся за комп... А сам радостный такой - думаеш - ништяк!!! ща все получится! А прога как не шла так и не идет. Тьфу :(
А потом зову колегу, ну, типа, помогай, смотри где ошибка. Он смотрит - нет ошибки, а прога не идет. Прям рычать хочется.
И как думаете с такой ситуацией борюсь? А никак. Сидиш себе, дальше другой юнит колупаеш, и вдруг ловиш себя на мысли, что ошибки-то и нету... Куда делась? Где была? Прям, блин, полтергейс какой-то...
Занятное это дело - программирование...
← →
cyborg © (2004-06-16 13:11) [19]Ребуилд нужно делать, тогда шайтаны убегут сверкая пятками.
← →
ferr (2004-06-16 13:33) [20]Если убрать, то код Destroy весь проскакивает потом программа чего-то ждёт в свёрнутом виде, на щелчки не отзываясь и потом...
ferr [14]
← →
cyborg © (2004-06-16 13:37) [21]таймеры какие нибудь понавтыкал наверное?
И вообще непонятно чего там у тебя, что ты ждёшь, что тебе скажут, что ошибка в 14-ой строке?
← →
ferr (2004-06-16 13:53) [22]Вот подобрал пример, который помельче, но с той же ошибкой.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
AppEvnts, ExtCtrls,
DirectDraw, DDUtil;
type
TfrmDD = class(TForm)
ApplicationEvents1: TApplicationEvents;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormPaint(Sender: TObject);
procedure ApplicationEvents1Deactivate(Sender: TObject);
procedure FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure ApplicationEvents1Restore(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
FDD : IDirectDraw7;
FDDSBack : IDirectDrawSurface7;
FDDSPrimary : IDirectDrawSurface7;
FDDSBackGround : IDirectDrawSurface7;
FDDSImage : IDirectDrawSurface7;
function RestoreAll : HRESULT;
procedure ErrorOut(hRet : HRESULT; FuncName : String);
public
{ Public declarations }
protected
procedure FormSetCursor(var aMsg : TMessage); message WM_SETCURSOR;
end;
const
ScreenWidth = 640;
ScreenHeight = 480;
ScreenBitDepth = 16;
groundBmp = "..\lake.bmp";
imageBmp = "..\mouse.bmp";
var
frmDD : TfrmDD;
mouseX : Integer = 0;
mouseY : Integer = 0;
implementation
{$R *.DFM}
procedure TfrmDD.ErrorOut(hRet : HRESULT; FuncName : String);
var
t : TextFile;
begin
AssignFile (t, "Debug.txt");
Rewrite (t);
WriteLn (t, FuncName + ": " + DDErrorString (hRet));
CloseFile (t);
Destroy;
end;
procedure TfrmDD.FormCreate(Sender: TObject);
var
hRet : HRESULT;
ddsd : TDDSurfaceDesc2;
ddscaps : TDDSCaps2;
begin
FDDSImage := nil;
FDDSBack := nil;
FDDSBackGround := nil;
FDDSPrimary := nil;
FDD := nil;
hRet := DirectDrawCreateEx (nil, FDD, IDirectDraw7, nil);
if Failed (hRet) then ErrorOut(hRet, "DirectDrawCreateEx");
hRet := FDD.SetCooperativeLevel(Handle, DDSCL_FULLSCREEN or DDSCL_EXCLUSIVE);
if Failed (hRet) then ErrorOut(hRet, "SetCooperativeLevel");
hRet := FDD.SetDisplayMode (ScreenWidth, ScreenHeight, ScreenBitDepth, 0, 0);
if Failed (hRet) then ErrorOut(hRet, "SetDisplayMode");
ZeroMemory (@ddsd, SizeOf(ddsd));
with ddsd do begin
dwSize := SizeOf(ddsd);
dwFlags := DDSD_CAPS or DDSD_BACKBUFFERCOUNT;
ddsCaps.dwCaps := DDSCAPS_PRIMARYSURFACE or DDSCAPS_FLIP or DDSCAPS_COMPLEX;
dwBackBufferCount := 1;
end;
hRet := FDD.CreateSurface(ddsd, FDDSPrimary, nil);
if Failed (hRet) then ErrorOut(hRet, "Create Primary Surface");
FDDSBackGround := DDLoadBitmap(FDD, groundBmp, ScreenWidth, ScreenHeight);
if FDDSBackGround = nil then ErrorOut(DD_FALSE, "DDLoadBitmap");
ZeroMemory(@ddscaps, SizeOf(ddscaps));
ddscaps.dwCaps := DDSCAPS_BACKBUFFER;
hRet := FDDSPrimary.GetAttachedSurface(ddscaps, FDDSBack);
if Failed (hRet) then ErrorOut(hRet, "GetAttachedSurface");
FDDSImage := DDLoadBitmap(FDD, imageBmp, 0, 0);
if FDDSImage = nil then ErrorOut(DD_FALSE, "DDLoadBitmap");
hRet := DDSetColorKey (FDDSImage, RGB(0, 0, 0));
if Failed (hRet) then ErrorOut(hRet, "DDSetColorKey");
end;
procedure TfrmDD.FormDestroy(Sender: TObject);
begin
if Assigned(FDD) then begin
if Assigned(FDDSImage) then begin
// FDDSImage._Release;
FDDSImage := nil;
end;
if Assigned(FDDSBackGround) then begin
// FDDSBackGround._Release;
FDDSBackGround := nil;
end;
if Assigned(FDDSPrimary) then begin
// FDDSPrimary._Release;
FDDSPrimary := nil;
end;
// FDD._Release;
FDD := nil;
end;
end;
procedure TfrmDD.FormPaint(Sender: TObject);
var
hRet : HRESULT;
begin
while True do begin
hRet := FDDSBack.BltFast (0, 0, FDDSBackGround, nil, DDBLTFAST_WAIT);
if hRet = DDERR_SURFACELOST then begin
if Failed (RestoreAll) then Exit;
end
else Break;
end;
while True do begin
hRet := FDDSBack.BltFast (mouseX, mouseY, FDDSImage, nil,
DDBLTFAST_WAIT or DDBLTFAST_SRCCOLORKEY);
if hRet = DDERR_SURFACELOST then begin
if Failed (RestoreAll) then Exit;
end
else Break;
end;
while True do begin
hRet := FDDSPrimary.Flip(nil, DDFLIP_WAIT);
if hRet = DDERR_SURFACELOST then begin
if Failed (RestoreAll) then Exit;
end
else Break;
end;
end;
procedure TfrmDD.ApplicationEvents1Deactivate(Sender: TObject);
begin
Application.Minimize;
end;
procedure TfrmDD.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if (Key = VK_ESCAPE) or (Key = VK_F12) then Close;
end;
procedure TfrmDD.FormSetCursor(var aMsg : TMessage);
begin
SetCursor(0);
end;
procedure TfrmDD.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if X <= ScreenWidth - 40 then mouseX := X;
if Y <= ScreenHeight - 40 then mouseY := Y;
FormPaint (nil);
end;
function TfrmDD.RestoreAll : HRESULT;
var
hRet : HResult;
begin
hRet := FDDSPrimary._Restore;
if Succeeded (hRet) then begin
hRet := FDDSBackGround._Restore;
if Failed (hRet) then begin
Result := hRet;
Exit;
end;
hRet := DDReLoadBitmap(FDDSBackGround, groundBmp);
if Failed (hRet) then begin
Result := hRet;
Exit;
end;
hRet := FDDSImage._Restore;
if Failed (hRet) then begin
Result := hRet;
Exit;
end;
Result := DDReLoadBitmap(FDDSImage, imageBmp);
end
else Result := hRet;
end;
procedure TfrmDD.ApplicationEvents1Restore(Sender: TObject);
begin
WindowState := wsMaximized;
end;
procedure TfrmDD.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Hide
end;
end.
← →
ferr (2004-06-16 14:12) [23]Вроде вот так работает
if Assigned(FDD) then begin
if Assigned(FDDSImage) then begin
// FDDSImage._Release;
Pointer(FDDSImage) := nil;
end;
if Assigned(FDDSBackGround) then begin
// FDDSBackGround._Release;
Pointer(FDDSBackGround) := nil;
end;
if Assigned(FDDSPrimary) then begin
// FDDSPrimary._Release;
Pointer(FDDSPrimary) := nil;
end;
// FDD._Release;
Pointer(FDD) := nil;
end;
← →
ferr (2004-06-16 14:15) [24]Всем большое человеческое Спасибо...
Страницы: 1 вся ветка
Форум: "Игры";
Текущий архив: 2004.10.17;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.036 c