Access Violation po przypisaniu wartości zmiennej typu wyliczeniowego.

0

Przyznam się że nigdy się nie spotkałem z taką sytuacją, jest ona dla mnie co najmniej dziwna. W pewnym momencie pracy nad programem zauważyłem że przy zamykaniu programu (już po OnDestroy) wywala Access Violation (w delphi 1, odpalony normalnie program: wywala błędy ciągle).

  TSortingMethod = (smNone,smAlphabetical, smFavouriteFirst, smByDate, smByModDate, smLength);
  TSortingDirection = (sdAscending, sdDescending);

Używam tych dwóch typów. Jeżeli przez cały czas życia programu nie będę ich w ogóle ruszał, wszystko będzie dobrze. Jeżeli przypiszę im jedną z wartości (np smNone, smAlphabetical), to przy wyłączeniu wywala rzeczony błąd.

Ktoś wie co jest przyczyną?

0

@_13th_Dragon Na pewno bo gdy zakomoentuję część kodu odpowiedzialną za przydzielanie wartości tym zmiennym, wszystko jest okej. Bardzo nieprzyjemnie się to debuguje bo wynik widać dopiero na końcu, więc dla każdej procedury (mającej jakiś związek z tymi zmiennymi) trzeba kompilować jeden raz.

Doszedłem do wniosku że przecież to nie przez "samo przydzielenie wartości" tylko procedurę która używa tych zmiennych (dziwne, bo wcześniej przez jakiś miesiąc żadnego access violationa nie było z tego powodu).

0

Teraz zbaraniałem -.- Zamieniłem typy TSortingMethod i TSortingDirection na Integer, zamiast smNone używam 0, smAlphabetical: 1, itp.

Jeżeli wywołam funkcję odpowiedzialną za zmianę wartości tych zmiennych, i zamknę program dostanę:
uzyje.jpg

jeżeli zmiennych nie ruszam, i zamknę program dostaję:
nie_uzyje.jpg

0

Nie wiem co to za dzieło ale spróbuj na początku działania programu odczytać domyślne wartości i zapisz do jakiś zmiennych tych właściwości i przy OnClose je przywrócić. Sprawdź też czy tylko sama próba odczytania tych właściwości nie spowoduje błędu.

0

@kAzek To z przypisanie wartości domyślnych także powoduje Access Violation. Odczytanie nie powoduje błędu.

0

No to trzeba przeanalizować kod odpowiedzialny za zmianę tych wartości. Co to jest jakiś komponent czy co?

0

To nie jest żaden komponent. Zwykła procedura. scr.jpg <irony>Ciekawostka</irony> Jeżeli przypiszę wartość smNone, też nie ma AV.

0
function CompareStrings(const aStr, aStr2: String): TValueRelationship;
begin
  if aStr > aStr2 then Result := 1 else
  if aStr < aStr2 then Result := -1 else
  Result := 0;
end;
procedure SortBy(aSortMethod: TSortingMethod; aSortDir: TSortingDirection);
var I, J, ProperRes: Integer;
begin
  if aSortMethod = smNone then Exit;
  if aSortDir = sdAscending
  then ProperRes := 1
  else ProperRes := -1;   //sdDescending otherwise

  for J := 0 to High(Notes) do
    for I := 0 to High(Notes) - J - 1 do
     Case aSortMethod of
       smAlphabetical:
         if CompareStrings  (LowerCase(Notes[I].Content), LowerCase(Notes[I+1].Content))  = ProperRes then ReplaceNotes(I, I + 1);

       smFavouriteFirst:
         //Ta sama metoda 

       smByDate:
         //..
       smByModDate:
         //..
       smLength:
         //..
    end;
end;

SortBy sortuje bąbelkowo, leci po wszystkich tych elementach, jeżeli jeden jest mniejszy/większy (pożądany, ustalany przez ProperRes) to zamienia miejscami elementy listy.

0

Odpowiedź jest dość prosta. Jak dla mnie wygląda to na memory leak w którymś miejscu w programie. Czasami bywa tak (sam tak miałem), że program np. wywala się przy wywołaniu obiekt.Free. Albo też przy przypisaniu zmiennej. Problem nie leży w tym miejscu w ogóle. Szukaj gdzieś zupełnie indziej. Przejrzyj kod pod względem zarządzania pamięcią, memory leaków itp.

0

No właśnie przypomniało mi się coś dzięki wypowiedzi @Juhas, jak odpalasz ten formularz Show czy ShowModal?

0
program Project1;

uses
  Forms,
  Windows,
  SysUtils,
  Graphics,
  Unit1 in 'Unit1.pas' {ViewNoteFrm},
  Unit2 in 'Unit2.pas' {WrtNtFrm},
  Unit3 in 'Unit3.pas' {SettingsForm},
  Unit4 in 'Unit4.pas' {ArrowForm},
  Unit5 in 'Unit5.pas' {PreviewNoteFrm},
  Unit6 in 'Unit6.pas' {AlarmCreator},
  Unit7 in 'Unit7.pas' {Form7},
  Unit8 in 'Unit8.pas' {Information};

var
  ExtendedStyle: Integer;
  I: Byte;

{$R *.res}


procedure EnterNoGUImode();
begin
  ViewNoteFrm.    Shape1.         Brush.Style := bsSolid;
  WrtNtFrm.       FormBelevShape. Brush.Style := bsSolid;
  SettingsForm.   MainSetShape.   Brush.Style := bsSolid;
  SettingsForm.   Shape1.         Brush.Style := bsSolid;
  PreviewNoteFrm. Shape1.         Brush.Style := bsSolid;
  AlarmCreator.   Shape1.         Brush.Style := bsSolid;
  Form7.          Color                       := clWhite;
end;


begin
  Application.Initialize;

  ExtendedStyle := GetWindowLong(Application.Handle,GWL_EXSTYLE);
  SetWindowLong(Application.Handle, GWL_EXSTYLE, ExtendedStyle or WS_EX_TOOLWINDOW and not WS_EX_APPWINDOW);

  Application.Title := 'xxxx';
  Application.CreateForm(TViewNoteFrm, ViewNoteFrm);
  Application.CreateForm(TArrowForm, ArrowForm);
  Application.CreateForm(TWrtNtFrm, WrtNtFrm);
  Application.CreateForm(TPreviewNoteFrm, PreviewNoteFrm);
  Application.CreateForm(TSettingsForm, SettingsForm);
  Application.CreateForm(TAlarmCreator, AlarmCreator);
  Application.CreateForm(TForm7, Form7);
  Application.CreateForm(TInformation, Information);
  Application.HintHidePause := 4000;
  Application.HintColor := RGB(247, 247, 255);
  

  ViewNoteFrm.Left := FormInsertionView;

  if FileExists('xxxx_gui.dll') then
    DllGUIReload()
  else
    begin
      EnterNoGUImode();
      for I := 0 to 4 do
        BtnsPics[I] := TBitmap.Create;
    end;
    
  didTheJob := True;
  Application.Run;
end.

Kod procedury DllGUIReload(); > http://4programmers.net/Pastebin/2119

0

W tym kodzie na pierwszy rzut oka widać pr0 nazewnictwo modułów. Jeżeli to ogarniasz to ok. Ale po 5 tygodniach na przykład możesz się motać modyfikując pliki. Poza tym no proszę Cię. Taki pr0 programista, który prawie samodzielnie chciał napisać na zlecenie klient torrentów, o ile pamiętam, w założeniu zlecającego niezgodnym z protokołem, a pozostawia domyślne nazwy dla modułów? ;>

0

http://delphi.about.com/od/adptips2006/qt/memory_leak.htm zastosuj się do tego i opowiedz co dostaniesz.

0

Czy możesz się z nami podzielić klasą do której przydzielasz wartości z TSortingMethod ?

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