DB to jest globalna klasa [...]
DB
to globalny obiekt, nie klasa;
Przy except powinno być DB.Destroy, gdzieś mi umknęło.
No właśnie nie - zwalnianie obiektu ma być wykonane bez względu na to, czy wystąpi wyjątek czy nie; A tak to obiekt nie zawsze zostaje zwolniony i przy ponownej próbie utworzenia go wywala AV;
Result tutaj służy do powiadomienia czy wyjść z Frame'a. Nie mogłem tego uzyskać przez try ... finally.
Przecież Ci tłumaczę, że operacje po pojawieniu się wyjątku wykonuje się w bloku try .. except
, a dokładnie pomiędzy except .. end
, a nie poza tym blokiem; Z kolei blok try .. finally
miał dbać o każdorazowe zwalnianie obiektu DB
żeby uchronić przed błędami i wyciekami pamięci;
W zasadzie ta procedura ma sprawdzać, czy nastąpiło poprawne zapisanie do tabeli, jeśli tak to ramka jest zamykana (obecnie ukrywana), jeśli nie to pozostaje w stanie w jakim była przed kliknięciem buttonu.
procedure TTableNewFrame.TableSave_ButtonClick(Sender: TObject);
var
DB: TDataBase;
begin
DB := TDataBase.Create();
try
TransToTable();
DB.CheckExist('Table.dat');
try
DB.CreateTableFromArray(TableArray);
ShowMessage('OK.');
except
Self.Free();
ShowMessage('Błąd.');
end;
finally
DB.Free(); // lub FreeAndNil(DB), jeśli DB jest globalne
end;
end;