Autor Beitrag
Carnivean
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 36

Win 2000, Win Xp Prof
D3 Prof, D7 Prof, D2005 Pers
BeitragVerfasst: Sa 20.08.05 15:34 
Hi,
ich habe folgende Programmstrucktur:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
TSchueler = class(TPerson)
  private

  public
    Einschulung: String;
    NameVater: String;
    VornameVater: String;
    NameMutter: String;
    VornameMutter: String;
    Klasse: String;
  end;

TPersonenverwaltung = class(TObject)
  private

  public
    Schueler: TObjectlist;
    ShowSchueler: TObjectList;
    ShowLehrer: TObjectList;
  end;


So innerhalb von Schueler gibt es nur Objekte vom Typ TSchueler, nun will ich die Reihenfolge nach allen Feldern(also EInschulung, NameVater etc) sortieren, einmal alphatbetisch und auch gegenteilig(von Z nach A).

Nun wollte ich fragen, ob ihr irgendeine Idee habt, wie ich umgehen kann, dass ich für jedes Feld einen eigenen Algorithmus schreiben muss, bzw wie ihr das Problem lösen wollt. Ich will definitv keine komplette Lösung, aber ein paar Vorschläge, wie ihr das Problem angehen würdet, würde mir sicher sehr helfen, da ich noch nie mit Sortieralgorithmen gearbeitet habe.

Gruß
Carnivean

PS: Hallo alle, Forum sieht extrem nett aus, denke ich werd mich hier sehr wohl fühlen :)
AXMD
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 4006
Erhaltene Danke: 7

Windows 10 64 bit
C# (Visual Studio 2019 Express)
BeitragVerfasst: Sa 20.08.05 15:37 
:welcome:

IIRC hat TObjectList doch eine Sortier-Routine eingebaut, die du nur deinen Bedürfnissen anpassen musst.

AXMD
Carnivean Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 36

Win 2000, Win Xp Prof
D3 Prof, D7 Prof, D2005 Pers
BeitragVerfasst: Sa 20.08.05 20:05 
Hi,
ok hab jetzt mal ein bisschen rumgeguckt und steh vor folgendem Problem.

Da ich bisher noch nie mit Quicksort oder anderen Sortieralgorithmen gearbeitet habe, habe ich mir gedacht ich guck mir erstmal, den von TStringlist an, da ich meistens(nicht immer), Strings vergleichen will.
Zur Informationen, ich weiss immer wenn ich Sortieren will, ib ich nach Integer oder nach String sortieren möchte(sonst ginge es wahrscheinlich eh nicht bzw würd nur Mist rauskommen).

So Ich hab folgende beiden Routinen geschrieben:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
function TMyObjectList.SortierenName(Item1, Item2: TPerson): Integer;
begin
  Result := AnsiCompareText(Item1.Name, Item2.Name);
end;

function TMyObjectList.SortierenNameDes(Item1, Item2: TPerson): Integer;
begin
  Result := AnsiCompareText(Item1.Name, Item2.Name);
  Result := -Result;
end;


Einmal wird alphabetisch nach Name sortiert und einmal umgekehrt.

Nun, das erste Probleme, was ich habe, ist, dass ich eine abgeleitete Klasse von TObjectList nehme, damit ich die Sort Funktion (welche von TList übernommen wird), nach meinen wünschen ändern kann.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
 TMyObjectList = class(TObjectList)
  private
    function SortierenName(Item1, Item2: TPerson): Integer;
    function SortierenNameDes(Item1, Item2: TPerson): Integer;
  public
    procedure Sort(Compare: TListSortCompare);
  end;


So, in Sort wollte ich jetzt nur, dass man entweder nach Nme alphabetisch bzw dem gegenteil sortieren kann. Allerdings kann ich die Sucheprozedur von TList nicht übernehmen, da ich auf FList nicht mehr zugreifen kann, hier mein Quellcode:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure TMyObjectList.Sort(Compare: TListSortCompare; Mode: Byte);
begin
  if Mode = 1 then
    QuickSort(FList, 0, Count - 1, SortierenName);
  if Mode = 2 then
    QuickSort(FList, 0, Count - 1, SortierenNameDes);
end;


Wenn ich es compile, bekomme ich folgende Errormeldung: Uncleared Indetifier 'FList'.

Hier der Quicksort Algorithmus - Dazu muss ich sagen, dass ich den Quicksort Algorithmus ruskopiert habe aus der Classes Unit(wo TList deklariert ist), in die Form, da er sonst nich benuztzbar war.:
ausblenden 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:
procedure QuickSort(SortList: PPointerList; L, R: Integer;
  SCompare: TListSortCompare);
var
  I, J: Integer;
  P, T: Pointer;
begin
  repeat
    I := L;
    J := R;
    P := SortList^[(L + R) shr 1];
    repeat
      while SCompare(SortList^[I], P) < 0 do
        Inc(I);
      while SCompare(SortList^[J], P) > 0 do
        Dec(J);
      if I <= J then
      begin
        T := SortList^[I];
        SortList^[I] := SortList^[J];
        SortList^[J] := T;
        Inc(I);
        Dec(J);
      end;
    until I > J;
    if L < J then
      QuickSort(SortList, L, J, SCompare);
    L := I;
  until I >= R;
end;

Wie soll ich es machen, dass ich die Fehlermeldung umgehe? Einen eigenen Quicksort schreiben? Wenn ja, irgendeinen Ansatz? Habe bisher leider keien Erfahrung mit Sortierlagorithmen :/.

Hoffe auf baldige Antwort, danke.

Gruß
Carnivean
AXMD
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 4006
Erhaltene Danke: 7

Windows 10 64 bit
C# (Visual Studio 2019 Express)
BeitragVerfasst: Sa 20.08.05 20:08 
Ich glaub, du hast da was missverstanden ;)

ausblenden Delphi-Quelltext
1:
procedure Sort(Compare: TListSortCompare);					


Du rufst Sort von deiner ObjectList auf und übergibst deine Compare-Funktion als Parameter ;). Alles klar?

ausblenden Delphi-Quelltext
1:
MyObjectList.Sort(MyCompareFunction1);					


AXMD
Carnivean Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 36

Win 2000, Win Xp Prof
D3 Prof, D7 Prof, D2005 Pers
BeitragVerfasst: Sa 20.08.05 20:12 
Titel: Ups
Ähm ups ja das habe ich wohl ziemlich missverstanden, und zudem auch noch komplizierter gemacht als es ist :).

Thx für den Tipp, mal sehen ob ich es hinkriege. Solange lass ich es noch unbeantwortet. Kann nen Moment dauern, da ich erst die Klasse fertigschreiben möchte, bevor ich sie anwende.

//Edit: Wie gibt man eigentlich an, nach was er sortiert. Also ob er nach (Items[I] as TLehrer).Name oder (Items[I] as TLehrer).Vorname ?

/7Edit2: Ich bin so blöd, glaube ich hab es jetzt gerafft, hoffen wir es :)