Этот пример, конечно, упрощен, но в основном у меня есть основная форма, которая вызывает другую форму (frmSettings) с
function Execute(var aSettings: TSettings):Boolean
TSettings
- это мой собственный объект, созданный в главной форме для отслеживанияsettings.
В этой недавно открытой форме (frmSettings) я получаю TMyObjectList
, который является потомком TObjectList
.Он заполняется TMyObj
.
Затем я заполняю TListBox
значениями из этого TMyObjectList.
код:
...
FMyObjectList : TMyObjectList;
property MyObjectList: TMyObjectList read getMyObjectList;
...
function TfrmSettings.getMyObjectList: TMyObjectList ;
begin
If not Assigned(FMyObjectList) then FMyObjectList := TMyObjectList.Create(True)
Result := FMyObjectList;
end;
function TfrmSettings.Execute(var aSettings: TSettings): Boolean;
begin
//Fill myObjectList
FetchObjs(myObjectList);
//Show list to user
FillList(ListBox1, myObjectList);
//Show form
ShowModal;
Result := self.ModalResult = mrOk;
if Result then
begin
// Save the selected object, but how??
// Store only pointer? Lost if list is destroyed.. no good
//Settings.selectedObj := myObjectList.Items[ListBox1.ItemIndex];
// Or store a new object? Have to check if exist already?
If not Assigned(Settings.selectedObj) then Settings.selectedObj := TMyObj.Create;
Settings.selectedObj.Assign(myObjectList.Items[ListBox1.ItemIndex];);
end;
end;
procedure TfrmSettings.FillList(listBox: TListBox; myObjectList: TMyObjectList);
var
i: Integer;
begin
listBox.Clear;
With myObjectList do
begin
for i := 0 to Count - 1 do
begin
//list names to user
listBox.Items.Add(Items[i].Name);
end;
end;
end;
procedure TfrmSettings.FormDestroy(Sender: TObject);
begin
FreeAndNil(FMyObjectList);
end;
Хранение только указателя не делаетХорошей идеей является то, что при повторном запуске формы настроек воссоздается список, и исходный объект будет утерян, даже если пользователь нажмет «отменить»
Таким образом, сохранение копии кажется более подходящим с использованием команды assign, чтобы получить всесвойства правильные.И сначала проверка, если у меня уже есть объект.
If not Assigned(Settings.selectedObj) then Settings.selectedObj := TMyObj.Create;
Settings.selectedObj.Assign(myObjectList.Items[ListBox1.ItemIndex];);
Должен ли я переместить эти две строки в метод, вместо этого, как Settings.AssignSelectedObj(aMyObj:TMyObj)
Выглядит ли это правильно, или я реализую это неправильнопуть?Что-то более или менее необходимое?
Мне нужны некоторые рекомендации, чтобы я чувствовал себя более защищенным, чтобы не открыться для утечек памяти и других проблем.
Кроме того, что мы немного пересматриваем код,реальный вопрос: Это правильный способ сохранить мой SelectedObject в классе настроек?