在我的Delphi 2007数据库应用程序中,我有一个Generations列表。每一代都有一个定价模板列表,每个定价模板都是一组值。在应用程序中,用户可以创建订单项并从任何一代分配定价模板。通过克隆现有代创建新一代。因此,用户只需创建第一代,然后克隆它,只更改新一代中所需的定价模板值。这些代(和定价模板)由originids.ie连接,Generation1的originid将为零,而generation2将具有指向generation1'id等的originid。此外,用户可以从任何现有的one.ie,generation3创建新一代。起源可以是第1代。现在,用户想要刷新功能,其中用户可以将定价模板从一代更新到任何其他代(如果它们是“连接的”)。即,如果它们通过原始ID连接(不一定是通过直接连接。如果源代码的原始id直接指向目标的id或目标的任何直接子项,或目标子项的任何子项。 。等等)。请参阅下面的说明。
在这种情况下,从源搜索目标(算法/数据结构)的最佳方法是什么?
提前谢谢大家,
普拉迪普
GenerationName --Id - OriginID
第1代 - 100-- 0
第2代--101 - 100(从1克隆)
第3代--102 - 100(从1克隆)
第4代--103 - 102(从3克隆)
第5代--104 - 101(从2克隆)
此处,用户可以从第1代更新到第3代(第1代→第3代)或第4代(第1代→第3代→第3代)或第5代((第1代,第1代,第2代,第5代)因为它们已经连接了。但是第3代到第5代是不允许的,因为它们之间没有联系。
答案 0 :(得分:1)
在我看来,使用tree data structure
是解决这类问题的最佳方法。
来到Delphi IDE,您可以使用TTreeView
组件来实现此目的。
使用TTreeView
组件将数据放入树结构中。 Click here有关TTreeView的教程。
要在TTreeView中搜索,请浏览this link。
答案 1 :(得分:0)
要确定一代是否可以升级到另一代,我会使用与此类似的功能。这里 gen 是一个加载了你的世代并可以通过Id查找它们的结构。
function canUpgrade(fromId, toId: integer) : boolean;
var
id : integer;
begin
Result := false;
id := toId;
while id<>0 do
begin
if gen[id].originId=fromId then
begin
Result := true;
Break;
end
else
begin
id := gen[id].originId;
end;
end;
end;