もちろん、この例は単純化されていますが、基本的には、別のフォーム (frmSettings) をトリガーするメイン フォームがあります。
function Execute(var aSettings: TSettings):Boolean
TSettings
設定を追跡するためにメインフォームで作成された私自身のオブジェクトです。
この新しく開いたフォーム (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;
ポインターだけを保存するのは良い考えではないようです。設定フォームを再度トリガーすると、リストが再作成され、ユーザーが「キャンセル」を押しても元のオブジェクトが失われるためです。
したがって、すべてのプロパティを正しく取得するには、割り当てを使用して、コピーを保存する方が良いようです。そして、最初にオブジェクトが既にあるかどうかを確認します。
If not Assigned(Settings.selectedObj) then Settings.selectedObj := TMyObj.Create;
Settings.selectedObj.Assign(myObjectList.Items[ListBox1.ItemIndex];);
これらの2行を代わりにメソッドに移動する必要がありますSettings.AssignSelectedObj(aMyObj:TMyObj)
これは正しいように見えますか、それとも間違った方法で実装していますか? 多かれ少なかれ必要なものはありますか?
メモリリークやその他のトラブルに巻き込まれないように、より安全に感じるように、いくつかのガイドラインが必要です。
コードを少し確認する以外に、本当の問題は次のとおりです。これは、SelectedObject を設定クラスに格納する正しい方法ですか?