这个例子当然是简化的,但基本上我有一个触发另一个表单(frmSettings)的主表单
function Execute(var aSettings: TSettings):Boolean
TSettings
是我自己以主要形式创建的对象,用于跟踪设置。
在这个新打开的表单(frmSettings)中,我获取了TMyObjectList
一个来自TObjectList
. 它充满了TMyObj
。
TListBox
然后我用该 TMyObjectList 中的值填充 a 。
编码:
...
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 存储在设置类中的正确方法吗?