Autor Beitrag
sahib
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 117

Win 2000 SP4+
Delphi 5 Prof.
BeitragVerfasst: Do 31.03.05 01:19 
Moin, Moin.

Sorry, ist hier falsch reingerutscht. Aber zum Anzeigen nutze ich VCL.

Ich bin am verzweifeln. Ich habe eine TListt mit Zeigern auf einen Record. Diese teile ich nachher auf zwei Spalten in einer (virtuellen) TListView auf. Nun wollte ich zuerst nach Spalte 1 sortieren und anschliessend nach Spalte 2 und zwar ohne dass die Reihenfolge der Spalte 1 geändert wird. Bsp. zur Verdeutlichung:
1 2 Spalte
B A
A B
C C
A C

sollte nach sortieren so ausshen:
1 2 Spalte
A B
A C
B A
C C

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:
type
  PRangeData = ^TRangeData;
  TRangeData = record
    Rule: Byte;
    Rule2: Integer;
[...]
  end;

var
  lstMain: TList;
[...]

function SortyByRule(Item1, Item2: Pointer): Integer;
begin
  if PRangeData(Item1)^.Rule > PRangeData(Item2)^.Rule then
    Result := 1
  else
  if PRangeData(Item1)^.Rule < PRangeData(Item2)^.Rule then
    Result := -1
  else
    Result := 0
end;

[...]
lstMain.Sort(@SortyByRule);

// dann Darstellung in der ListView


Mein Explorer meldet Fehler, ich hoffe, man kann es lesen. Kann mir da wer helfen? Einen Schnipsel hatte ich in den Tiefen des iNet schon einmal gefunden, aber jetzt finde ich den nicht mehr...

Viele Grüße, Christian

Moderiert von user profile iconGausi: (falsche)Code- durch (echte)Delphi-Tags ersetzt.
Moderiert von user profile iconGausi: Titel geändert. Es ist klar, dass es eine Frage ist.
Moderiert von user profile iconGausi: Topic aus VCL (Visual Component Library) verschoben am Do 31.03.2005 um 09:01
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8554
Erhaltene Danke: 481

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Do 31.03.05 07:58 
so geht das sortieren allgemein nach 2 Werten:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
function SortyByAundB(Item1, Item2: Pointer): Integer;   
var tmp:integer
begin
  tmp:=comparevalue(PMyrecord(Item1).A,PMyRecord(Item2).A); //oder comparestr, oder..
  //auf jeden Fall nach Eigenschaft A vergleichen

  if tmp = 0 then
    result:=comparevalue(PMyrecord(Item1).B,PMyRecord(Item2).B)
  else result:=tmp;
end;

Das sollte so in etwa klappen.

Edit: Hab ich noch vergessen: :welcome: im Delphi-Forum!

_________________
We are, we were and will not be.
sahib Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 117

Win 2000 SP4+
Delphi 5 Prof.
BeitragVerfasst: Do 31.03.05 09:11 
Hallo Daniel.

Vielen Dank für Deine Willkommensworte und die schnelle Antwort. Ich hatte Deinen Schnipsel meinen Belangen nach angepasst, aber das Ergebnis war nicht wie erwartet - was aber mit Sicherheit an meiner eigenen Unzulänglichkeit liegt :( Nur die Spalte 1 wurde richtig sortiert.

Spalte 1 besteht aus einem Byte, welches die Werte 0 und 1 annehmen kann. Spalte 2 ist ein Word von 0 bis $ffff.

Die Lösung sieht nun für mich wie folgt aus (tut mir leid, Explorer meldet Fehler, wenn ich das Code-Tag anklicke; wie schreibe ich es händisch?):

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
function SortyByStartIP(Item1, Item2: Pointer): Integer;
begin
  if PRangeData(Item1)^.Rule1 > PRangeData(Item2)^.Rule1 then
    Result := 1
  else
  if PRangeData(Item1)^.Rule1 < PRangeData(Item2)^.Rule1 then
    Result := -1
  else begin
    if PRangeData(Item1)^.Rule2 > PRangeData(Item2)^.Rule2 then
      Result := 1
    else
    if PRangeData(Item1)^.Rule2 < PRangeData(Item2)^.Rule2 then
      Result := -1
    else
      Result := 0
    end
end;


Jetzt müsste ich das nur noch kompakter hinbekommen - obwohl, es ist eigentlich flott genug (P3/500) ;) 0,18 Sekunden für 55984 Einträge pro Spalte.

Einen schönen sonnigen Tag noch, wünscht
Christian

Moderiert von user profile iconGausi: Code- durch Delphi-Tags ersetzt.
wulfskin
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1349
Erhaltene Danke: 1

Win XP
D5 Pers (SSL), D2005 Pro, C, C#
BeitragVerfasst: Do 31.03.05 09:26 
Hallo sahib,

schau dir nochmal den Tipp von Gausi an, dass ist die kürzeste Version. Die Funktion CompareValue müsste bei dir in etwas so aussehen:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
function CompareValue(const I1, I2: Integer): Integer;
begin
  if I1 > I2 then
    Result := 1
  else
  if I2 > I1 then
    Result := -1
  else
    Result := 0;
end;
So muss du diese Funktion nur zwei mal aufrufen und der Quelltext wird übersichtlich.

Gruß Hape!

P.S.: Die Delphi/Code-Tags in eckige ([, ]) Klammern einfassen! ;)

_________________
Manche antworten um ihren Beitragszähler zu erhöhen, andere um zu Helfen.
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8554
Erhaltene Danke: 481

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Do 31.03.05 09:29 
Bei mir gibt es die Unit Math, und da ist die Funktion compareValue Funktion dabei. Kann sein, dass die bei D5 noch nicht dabei ist.

_________________
We are, we were and will not be.
sahib Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 117

Win 2000 SP4+
Delphi 5 Prof.
BeitragVerfasst: Do 31.03.05 09:44 
@Hape:
Hallo Hape. Vielen Dank für Deine Antwort. Habe ich gleich getestet und es liefert das gleiche (falsche) Ergebnis: Spalte 1 korrekt, in der 2. Spalte 200 vor 38 ;) Meine Lösung sieht vielleicht nicht edel aus, arbeitet aber zuverlässig.
*EDIT* Sorry, Deine CompareValue-Funktion hat doch funktioniert. Ich habe aus Versehen nur eines der beiden Bytes im Integer sortiert :) Asche auf mein Haupt!

@Daniel: Vielen Dank nochmals. Bei Delphi5 ist die Math-Unit enthalten, aber die angesprochene Funktion fehlt. Aber wie gesagt, das ist schon in Ordnung so.

Christian
wulfskin
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1349
Erhaltene Danke: 1

Win XP
D5 Pers (SSL), D2005 Pro, C, C#
BeitragVerfasst: Do 31.03.05 09:54 
user profile iconGausi hat folgendes geschrieben:
Bei mir gibt es die Unit Math, und da ist die Funktion compareValue Funktion dabei. Kann sein, dass die bei D5 noch nicht dabei ist.
Danke für den Hinweis, hab ich net gewusst ;)!

_________________
Manche antworten um ihren Beitragszähler zu erhöhen, andere um zu Helfen.