Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 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;

var
 spr : 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.042 c
1-1096533182
Erik1
2004-09-30 12:33
2004.10.17
Как убрать фокус с контрола и перевести на форму?


3-1095748099
stelius
2004-09-21 10:28
2004.10.17
Свойство Filter для строковых значений


3-1094742606
senya
2004-09-09 19:10
2004.10.17
Как подсчитать количество соединений к БД?


1-1096741709
Татьяна
2004-10-02 22:28
2004.10.17
Разрешение экрана


4-1095111547
Jetus
2004-09-14 01:39
2004.10.17
Набор тел.номера модемом





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский