1

ClientDataSet に構造を持つ 3 つのレコードがあります。

数値: 整数; 開始: TTime; 終了: TTime;

1; 9:00; 10:00
2; 9:30; 10:00
3; 9:40; 10:20

次のように、これらのレコードを他の ClientDataSet に取得する必要があります。

1; 9:00; 9:30
2: 9:30; 9:40
3; 9:40; 10:00
4; 10:00; 10:20
4

1 に答える 1

5

を使用TList<TTime>し、両方の列を入力し、並べ替えてから、重複をスキップしてリストを繰り返します。このような。

var l: TList<TTime>; t1, t2: TTime; id2: cardinal;
begin
  l := TList<TTime>.Create;
  try
    cds1.First;
    while not cds1.Eof do begin
       l.Add( Frac(cds1.Fields[1].AsDateTime) );
       l.Add( Frac(cds1.Fields[2].AsDateTime) );
       cds1.Next;   
    end;

    l.Sort;

    cds2.Clear;
    if l.Count <= 0 then exit;

    t1 := l[0]; id2 := 0;
    for t2 in l do begin
        if t1 > t2 then raise Exception.create ('Sort silently failed!') else
        if t1 < t2 then begin
           Inc(id2);
           cds2.AppendRecord([ id2, t1, t2 ]);
           t1 := t2;
        end;
    end;
  finally 
    l.Free;
  end;
end;
于 2013-02-26T14:56:52.197 に答える