Hallo zusammen,
vielleicht sehe ich den Wald vor lauter Bäumen nicht (mehr), aber kann mir jemand von Euch erklären, warum das folgende
"nicht funktioniert".
Dabei handelt es sich um die "Callback Funktion" der ObjectList.Sort Methode, wird also so aufgerufen
OL.Sort(@CompareAudioAtEnd)
Ziel ist es, diese MMItems so zu sortieren, dass diejenigen mit der Eigenschaft "isAudioOnly" ans Ende kommen, und beide Teile (isAudioOnly und not isAudioOnly) alphabetisch sortiert werden
Delphi-Quellcode:
function CompareAudioAtEnd(input1, input2: Pointer): Integer;
var b1, b2 : Boolean;
begin
b1 := TMMItem(input1).isAudioOnly;
b2 := TMMItem(input2).isAudioOnly;
if (b1) and (b2) then
Result := CompareText(TMMItem(input1).InputName, TMMItem(input2).InputName)
else
if b1 then
Result := 1
else
Result := -1;
end;
Funktioniert nicht bedeutet in diesem Fall: Der Debugger bleibt mit der Meldung "Stack Overflow" hängen und zeigt auf "begin" bzw. bricht das Programm einfach ohne Fehlermeldung ab ("Programm funktioniert nicht mehr") wenn ich es außerhalb der
IDE starte.
Hingegen das Folgende funktioniert sehr wohl, ist meiner Meinung nach aber von Hinten durch die Brust ins Auge.
Delphi-Quellcode:
function CompareAudioAtEnd(input1, input2: Pointer): Integer;
var t1, t2 : string;
begin
if TMMItem(input1).isAudioOnly then
t1 := 'audio'
else
t1 := 'video';
if TMMItem(input2).isAudioOnly then
t2 := 'audio'
else
t2 := 'video';
Result := CompareText(t2, t1);
if Result = 0 then
Result := CompareText(TMMItem(input1).InputName, TMMItem(input2).InputName);
end;
Falls es hilft (gekürzt):
Delphi-Quellcode:
TMMItem = class(TObject)
private
FIsAudioOnly : Boolean;
public
property isAudioOnly : Boolean read FIsAudioOnly;
end;
TMMList = class(TObject)
private
FItems : TObjectList;
public
procedure Sort;
end;
procedure TMMList.Sort;
function CompareAudioAtEnd(input1, input2: Pointer): Integer;
begin
[...]
end;
begin
FItems.Sort(@CompareAudioAtEnd);
end;
Wie gesagt, mich wundert, dass die eine Funktion (per Stringvergleich) funktioniert, die andere (per Boolean-Vergleich) jedoch nicht?
Oder übersehe ich (wieder mal) etwas Kritisches?
[edit]
Die "richtige" Lösung wurde von jaenicke zwei Posts weiter unten gegeben
if (b1) and (b2) then
muss heißen
if not (b1 xor b2) then