Access Violation a OpenDialog

0

Witam.
Piszę program, którego zadaniem będzie obróbka obrazów bmp. Jako, że nie jestem za mocny w C++, używam BC++B. Do otwarcia pliku wykorzystuję komponent OpenDialog (OpenPictureDialog), a do zapisu SavePictureDialog. Wczytany obraz wyświetlany jest w komponencie Image, a dodatkowo wpisywany w tablice. Następnie wykonywane są obliczenia na elementach tablicy. No i na zakończenie można zapisać obrobiony obraz do pliku.
Problem z jakim się borykam to błędy typu:
user image
Występuję one w przypadku, gdy wczytam obraz, dokonam obróbki, po czym znowu próbuję wczytać obraz.
Oto kod źródłowy:

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
#include "TObraz.hpp"
#include "stdio.h"
#include "dos.h"
//#include "jpeg.hpp"

//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
TObraz *Obraz=new TObraz;
int Height_1, Width_1;
int typ_mod;

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------

Graphics::TBitmap *MyImage=new Graphics::TBitmap;

void __fastcall TForm1::Open1Click(TObject *Sender)
{
  StaticText2->Visible=true;
  StaticText2->Caption="Wczytuję obraz";
  SpeedButtonOtworz->Enabled=false;
  Open1->Enabled=false;
  if (OpenDialog1->Execute())
  {
    SpeedButtonZapisz->Enabled=false;
    Image1->Visible=true;
    Image3->Visible=true;
    MyImage->LoadFromFile(OpenDialog1->FileName);
    Obraz->ImLoad(MyImage,'b');
    Image1->Picture->Graphic->Height=MyImage->Height;
    Image1->Picture->Graphic->Width=MyImage->Width;
    Image3->Picture->Graphic->Height=MyImage->Height;
    Image3->Picture->Graphic->Width=MyImage->Width;
    Obraz->ImChange(Image1, ProgressBar1);
    Obraz->ImChange(Image3, ProgressBar1);
    Obraz->ImLoad(MyImage,'r');
    Button1->Enabled=true;
    SpeedButtonZapisz->Enabled=true;
    Save1->Enabled=true;
    ProgressBar1->Enabled=true;
    Height_1=Image1->Picture->Graphic->Height;
    Width_1=Image1->Picture->Graphic->Width;
    Image3->Left=(Width_1+18);
    ProgressBar1->Position=0;
    WyborModyfikacji->Enabled=true;
  }
  StaticText2->Visible=false;
  SpeedButtonOtworz->Enabled=true;
  Open1->Enabled=true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  StaticText2->Visible=true;
  StaticText2->Caption="Filtruję";
  SpeedButtonOtworz->Enabled=false;
  SpeedButtonZapisz->Enabled=false;
  Open1->Enabled=false;
  Save1->Enabled=false;

  int wk, koszt, ip, jp, rozm_maski, ok=1, h;

  if(typ_mod==1 || typ_mod==2)
  {
    while(ok)
    {
      rozm_maski=StrToInt(InputBox("Filtracja","Podaj rozmiar maski >=5 <=13 (nieparzyste)","9"));
      if ((rozm_maski%2) > 0 && rozm_maski>=5 && rozm_maski<=13) ok=0;
      else (ShowMessage("Podałeś zły rozmiar maski"));
    }
  }
  else
  {
    while(ok)
    {
      rozm_maski=StrToInt(InputBox("Filtracja","Podaj rozmiar maski >=3 <=13 (nieparzyste)","9"));
      if ((rozm_maski%2) > 0 && rozm_maski>=3 && rozm_maski<=13) ok=0;
      else (ShowMessage("Podałeś zły rozmiar maski"));
    }
  }

  ok=1;
  while(ok)
  {
    h=StrToInt(InputBox("Filtracja","Podaj wartość wpółczynnika h 1÷50","20"));
    if (h > 0 && h < 51) ok=0;
    else (ShowMessage("Podałeś złą wartość współczynnika h"));
  }
  double progress=(double)100/Width_1;
  StaticText1->Visible=true;

  for (ip=0; ip<Width_1; ip++ )
  {
    for (jp=0; jp<Height_1; jp++)
    {
      Image3->Canvas->Pixels[ip][jp]=Obraz->Filtr(h,ip,jp,Height_1,Width_1,rozm_maski,'K', typ_mod);
    }
    Application->ProcessMessages();
    ProgressBar1->Position=ip*progress+1.5;
    StaticText1->Caption=(IntToStr(ProgressBar1->Position) +"%");
    Image3->Refresh();
  }

  StaticText2->Visible=false;
  SpeedButtonOtworz->Enabled=true;
  SpeedButtonZapisz->Enabled=true;
  Open1->Enabled=true;
  Save1->Enabled=true;
  ProgressBar1->Position=0;
  StaticText1->Visible=false;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Exit1Click(TObject *Sender)
{
  Application->Terminate();
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Save1Click(TObject *Sender)
{
  if (SavePictureDialog1->Execute())
  Image3->Picture->SaveToFile(SavePictureDialog1->FileName);
}
//---------------------------------------------------------------------------

void __fastcall TForm1::SpeedButtonOtworzClick(TObject *Sender)
{
  Open1->OnClick(Sender);
}
//---------------------------------------------------------------------------

void __fastcall TForm1::SpeedButtonZapiszClick(TObject *Sender)
{
  Save1->OnClick(Sender);
}
//---------------------------------------------------------------------------

void __fastcall TForm1::WyborModyfikacjiClick(TObject *Sender)
{
  typ_mod=WyborModyfikacji->ItemIndex;
}
//---------------------------------------------------------------------------

0

Takie błędy występują, gdy probujesz odniesc sie do nieswojej pamieci. Innymi slowy - czytasz/piszesz poza granicami swojej tablicy. Przeanalizuj swoj kod pod tym katem (mi sie nie chce ;p).

0

Wydaje mi się, że to nie jest związanie z moją tablicą (albo ja czegoś nie rozumiem).
Bo problem występuje w momencie, gdy otwiera się okno w którym powinienem wybrać plik do otwarcia.
Nie zdążę zaznaczyć żadnego pliku i wywala error.

0

a to jakaś wersja bcb bez debuggera?

0
Passagee napisał(a)

a to jakaś wersja bcb bez debuggera?

mnie debugger nic nie mówi :(

0

Sorki, że post pod postem, ale w końcu postanowiłem się zarejestrować.
Jak już pisałem, mi debugger nic nie mówi, a wygląda to tak:
user image

EDIT:
Czy jest możliwe, żeby w BC++B 6 był jakiś błąd? Bo zainstalowałem RAD Studio 2010 z C++ i wydaje mi się, że problem już nie występuje.

1 użytkowników online, w tym zalogowanych: 0, gości: 1