Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.10.17;
Скачать: CL | DM;

Вниз

Прошу разъяснить и помочь   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.044 c
1-1096608379
Slonco
2004-10-01 09:26
2004.10.17
Как перевести текст из WIN кодировки в DOS кодировку ?


6-1092277120
Sash
2004-08-12 06:18
2004.10.17
IP


1-1096478831
RedDragon
2004-09-29 21:27
2004.10.17
Как по ходу прогона программы создавать ...


4-1094910412
Davinchi
2004-09-11 17:46
2004.10.17
Получение WndProc от запущенного приложения


3-1095770374
Nick-From
2004-09-21 16:39
2004.10.17
Вопрос по FibPlus