Я использую Делфи Сиэтл.
Моя проблема возникает, когда я пытаюсь освободить объект, который я создал.
Я искал на этом сайте (а также на других сайтах) уже опубликованные ответы на этот вопрос, но все они немного отличаются. Согласно этим обсуждениям, мой код должен работать, но явно что-то не так.
Итак, мне нужна помощь...
Поток выполнения:
а) в форме fmLoanRequest я создаю объект на основе класса TStorageLoan (подкласс TLoan). Конструктор загружает всевозможные значения в некоторые атрибуты объекта (теперь показанные здесь).
б) Позже я передаю адрес объекта в другую форму (fmLoan) в соответствующую общедоступную переменную. fmLoan — это форма, в которой происходят все операции пользователя с содержимым Loan. Обратите внимание, что fmLoanRequest остается как есть, пока мы находимся в fmLoan. Мы вернемся к fmLoanrequest, когда fmLoan закроется.
в) Отображается форма fmLoan (и показывает данные в объекте - все работает хорошо).
г) При закрытии fmLoan вызывается процедура Освобождения объекта Loan - если он присвоен (см. строку 10 второго фрагмента кода). Кажется, работает нормально (без ошибок).
e) Ошибка «Недопустимая операция указателя» возникает при выполнении кода в строке 14 ниже: ( if Assigned(oLoan) then oLoan.Free; ).
Я добавил эту строку, чтобы убедиться, что объект будет освобожден, если fmLoan по какой-то причине не обработает его. Я понимаю, что к этому моменту объект был освобожден, но разве функция if Assgned() не должна предотвращать ненужное освобождение объекта?
Частичный код из формы fmLoanRequest (я добавил несколько номеров строк для справки)
1 // In form fmLoanRequest
2 // Create new Loan Object (from a Loan sub-class as it happens)
3 // Create the object here; Object address will be passed to fmLoan later for handling.
4 oLoan := TStorageLoan.Create(iNewLoanID);
5 ...
6 ...
7 fmLoan.oLoan := oLoan; // pass the address to the other form
8 fmLoan.show;
9 // User would click the 'btnClose' at this point. See event code below.
10 ...
11 ...
12 procedure TfmLoanRequests.btnCloseClick(Sender: TObject);
13 begin
14 if Assigned(oLoan) then oLoan.Free; // <--- ERROR HERE
15 fmLoanRequests.Close;
16 end;
Частичный код из формы fmLoan (я добавил несколько номеров строк для справки)
1 //Form fmLoan
2 ...
3 public
4 oLoan : TLoan;
5 ...
6 // In form fmLoan, I call the following upon closing the Form
7 // in the OnClick event of the 'btnClose' button.
8 Procedure TfmLoan.Clear_Loan_Object;
9 begin
10 if Assigned(oLoan) then oLoan.Free; // <-- THIS WORKS FINE
11 end;
Должен ли я попробовать другой подход?
Должен ли я просто удалить эту строку (строка 14 - первый фрагмент кода) и надеяться на лучшее. Это совсем не моя философия правильного кодирования!
Я иду к этому неправильно?
Примечание. Очевидно, я не использую указатели.
Любая помощь будет оценена по достоинству!