【发布时间】:2015-04-20 08:39:14
【问题描述】:
对不起,如果我有同样的问题。
在 Delphi 中,我制作了这样的函数:
function TModuleDatabase.LoadCountryList():TDictionary<integer, String>;
var
UQ: TUniQuery;
UC: TUniConnection;
CountryList: TDictionary<integer, String>;
begin
CountryList := TDictionary<integer, String>.Create;
UC := UniConnection2;
UQ := TUniQuery.Create(nil);
try
UQ.Connection := UC;
try
UQ.SQL.Clear;
UQ.SQL.Add('SELECT ID,NAME FROM COUNTRY ORDER BY NAME ASC');
UQ.Open;
while not UQ.Eof do
begin
CountryList.Add(UQ.Fields.FieldByName('ID').AsInteger,UQ.Fields.FieldByName('NAME').AsString);
UQ.Next;
end;
Result := CountryList;
except
on E:Exception do
ModuleMsgDialog.WarningMsg(E.Message);
end;
finally
UQ.Close;
UQ.Free;
CountryList.Free;
end;
end;
我将功能与其他 DataModule 分开,以使我不会在每个表单中每次都重复此功能。但是当我从表单中调用这个函数时:
procedure TCompanyDetailsForm.FormCreate(Sender: TObject);
var
i: Integer;
sItem: String;
CountryList: TDictionary<integer, String>;
begin
PageControl1.ActivePage := AddressTab;
CountryList := ModuleDatabase.LoadCountryList();
for i in CountryList.Keys do
begin
LocationCbbx.Items.AddObject(CountryList.Items[i],TObject(i));
end;
end;
问题出在 CountryList.Free;。字典中的所有项目在使用前都已释放。 如果我不做free,就会造成内存泄漏。
如何在免费之前传输数据的最佳方式。或者如何在调用后以其他形式或单位释放价值。
感谢您的帮助。
【问题讨论】:
-
你应该使用类似
procedure TModuleDatabase.LoadCountryList( countries : TDictionary<integer, String> );的东西。这样,调用代码将(必须)提供字典的实例,调用者也将负责在需要时释放它。 -
您可以可能将 TDictionary 设为 TModuleDatabase 的字段,并且您的所有表单都可以共享同一个实例,而不是每个都有自己的副本。
标签: delphi delphi-xe2