Autor Beitrag
greenhorn
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 68


D5
BeitragVerfasst: So 29.10.06 21:39 
Hallo Zusammen,

ich versuche beim Einfügen eines Satzes in einer DVerkettenListe diese direkt zu sortieren, doch irgenwie mag er die Datensätze nicht an der richtigen Stelle einfügen...

weiss jemand warum?

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
//Rückgabewerte der Sortierfunktion
// ITEM1 > ITEM2 --> >0
// ITEM1 < ITEM2 --> <0
// ITEM1 = ITEM2 --> 0
//Wurde geprüft und sind stimmig

procedure tDVKList.Insert(myPointer: pointer);
var
 v,n,t: tDVKListItem;
 tmpResult: integer;
 p: pointer;
begin
 if (fAnkerAnfang = NILOR (count = 0then
 begin
  add(myPointer);
 end
 else
 begin
  inc(fcount); //Zähler erhöhen
  t            := tDVKListItem.create;
  t.Data       := myPointer;

  if dvklsoSortOnInsert in fSortOptions then  //Sortiert
  begin
   p := first; //auf erstes Element positionieren
   while (p <> fAnkerEnde) and (p <> NILdo   //liste bis zum ende durchgehen
   begin
    tmpResult := fFuncSortCompare(fLauf.Data, t.data);
    if ((tmpResult > 0and (dvklsoAscending in SortOptions))
    or ((tmpResult < 0and (dvklsoDesending in SortOptions)) then
     break;
    p := Next;
   end;
  end;

  if fLauf = fAnkerAnfang then fLauf := fAnkerAnfang.Next;
  if fLauf = fAnkerEnde then   fLauf := fAnkerEnde.Prior;

  v := fLauf;
  n := fLauf.Next;

  v.Next  := t;
  t.Prior := v;

  n.Prior := t;
  t.Next  := n;

  fLauf   := t;
 end;
end;


Das Problem tritt sowohl beim auf- als auch beim absteigenden sortieren auf.

Ich find einfach die Ursache nicht :gruebel:

Könnt Ihr mir bitte helfen, wäre spitze :flehan:
greenhorn Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 68


D5
BeitragVerfasst: Mi 01.11.06 23:32 
hallo zusammen,

wiess hier keiner weiter???
greenhorn Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 68


D5
BeitragVerfasst: So 05.11.06 10:25 
So, jetzt hab ich die Lösung gefunden

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
PROCEDURE tDVKList.Insert(myPointer: pointer);
VAR
 MyNewObject: tDVKListItem;
 tmpResult:   INTEGER;
 ifInserted:  BOOLEAN;
BEGIN
 IF (fAnkerAnfang = nilOR (Count = 0THEN
 BEGIN
  add(myPointer);
 END
 ELSE
 BEGIN
  MyNewObject      := tDVKListItem.Create;
  MyNewObject.Data := myPointer;
  IF dvklsoSortOnInsert IN fSortOptions THEN  //Sortiert
  BEGIN
   ifInserted := False;
   First; //auf erstes Element positionieren
   tmpResult := fFuncSortCompare(fLauf.Data, MyNewObject.Data);
   IF ((tmpResult > 0AND (dvklsoAscending IN SortOptions)) //Sonderbehandlung für 1. Element
    OR ((tmpResult < 0AND (dvklsoDesending IN SortOptions)) THEN
   BEGIN
    InsertBefore(MyNewObject, fLauf);
    ifInserted := True;
   END
   ELSE
   BEGIN
    WHILE (fLauf <> fAnkerEnde) DO   //liste bis zum ende durchgehen
    BEGIN
     tmpResult := fFuncSortCompare(fLauf.Data, MyNewObject.Data);
     IF ((tmpResult > 0AND (dvklsoAscending IN SortOptions)) OR
      ((tmpResult < 0AND (dvklsoDesending IN SortOptions)) THEN
     BEGIN
      InsertBefore(MyNewObject, fLauf);
      ifInserted := True;
      break;
     END;
     Next;
    END;
   END;
   IF NOT ifInserted THEN  //Sonderbehandlung für letztes Element
    InsertAfter(MyNewObject, fLauf);
  END
  ELSE
  BEGIN
   InsertAfter(MyNewObject, fLauf);
  END;
 END;
END;


:dance2: :dance: :dance2: :dance: :dance2: :dance: :dance2: :dance: :dance2: :dance: :dance2: