Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi TList Sort funktioniert nicht (https://www.delphipraxis.net/116900-tlist-sort-funktioniert-nicht.html)

Errraddicator 8. Jul 2008 13:11


TList Sort funktioniert nicht
 
Hidiho,

ich hab mir, wie hier im Forum irgendwo beschrieben war, eine Sortierfunktion für eine TList von mir gebastelt.
Diese TList beinhaltet x TStringLists.

Gehe ich die Liste mit for durch, funktioniert das einwandfrei.
Sprich, ich kann jedes Element der TList problemlos in eine TStringList umwandeln und dann damit arbeiten.

In meiner Sortierfunktion klappt das aber komischerweise nicht, da stürzt er mir immer ab, wenn ich "item2" umwandeln möchte ("item1" funktioniert prächtig).

Hat wer ne Idee, woran das liegen könnte?
Das Sort wird übrigens in der gleichen Funktion aufgerufen, in der ich per For auf die Liste zugreife, also an sich müsste die TList da ok sein.

...

Hier noch mal der relevante Quelltext den ich verwende:
Delphi-Quellcode:
//...
type
  {*--- functions ---*}
  TSourceSorter = function(item1, item2: Pointer): Integer of object;
//...
  {*--- TfrmMain ---*} 
  TfrmMain = class(TForm)
  private
    sourceSorter: TSourceSorter;
    function compareSources(item1, item2: Pointer): Integer;
//...
procedure TfrmMain.FormCreate(Sender: TObject);
begin
  sourceSorter := compareSources;
end;
//...
// builds the data-list based on the given source-list
function TfrmMain.buildDataList(sourceList: TList): TList;
begin
  sourceList.Sort(TListSortCompare(@sourceSorter)); // <- Abbruch!

  // loop through each source-set
  for sourceIdx := 0 to sourceList.Count - 1 do
  begin
    curSource := TStringList(sourceList[sourceIdx]); // <- Funktioniert einwandfrei
    sourceType := StrToInt(curSource[0]);
//...
// sorts the given source-sets
function TfrmMain.compareSources(item1, item2: Pointer): Integer;
begin
  // cast items to sets
  set1 := TStringList(item1);
  set2 := TStringList(item2); // <- Zugriffsverletzung

Danke im voraus

cu Patrick

DeddyH 8. Jul 2008 13:34

Re: TList Sort funktioniert nicht
 
AFAIK darf die Vergleichsroutine keine Methode, sondern muss eine einfache Funktion sein.

Apollonius 8. Jul 2008 13:42

Re: TList Sort funktioniert nicht
 
Kleiner Tipp am Rande: Wenn du nicht weißt, was du tust, caste NIE Zeiger auf Code irgendwelcher Art.

Errraddicator 8. Jul 2008 13:44

Re: TList Sort funktioniert nicht
 
Zitat:

Zitat von Apollonius
Kleiner Tipp am Rande: Wenn du nicht weißt, was du tust, caste NIE Zeiger auf Code irgendwelcher Art.

Komm ich denn in dem Falle da drum herum?

...

@Deddy
Also der Compiler meckert ja nich und ich kanns ja auch ausführen und debuggen, von daher denke ich nicht, dasses daran liegt.
Wäre die Funktion vom falschen Typ würde der Compiler ja schon meckern, oder er zumindest bei der Funktionszuweisung im Create-Event abstürzen. *denk*

DeddyH 8. Jul 2008 13:46

Re: TList Sort funktioniert nicht
 
Nur weil mein Compiler nicht meckert, heißt das ja nicht, dass ich keine Fehler mache.

Errraddicator 8. Jul 2008 13:49

Re: TList Sort funktioniert nicht
 
Zitat:

Zitat von DeddyH
Nur weil mein Compiler nicht meckert, heißt das ja nicht, dass ich keine Fehler mache.

Das is schon richtig. :)

Aber wenn die Funktion vom falschen Typ wäre, dann würde er doch direkt beim compilieren meckern, so wie ich es ganz am Anfang hatte, als ich es direkt mit
Delphi-Quellcode:
sourceList.Sort(@TfrmMain.compareSources)
versucht hatte.
Da kam ja dann die sinngemäße Fehlermeldung dass eine Methode nicht kompatibel zu einer Funktion ist.

Daraufhin habe ich mich hier im Forum mal kundig gemacht und ein Beispiel gefunden, wo es so beschrieben war, wie ich es jetzt versucht habe umzusetzten. *G*

Apollonius 8. Jul 2008 13:51

Re: TList Sort funktioniert nicht
 
Das ist genau mein Punkt. Wenn du castest, sagst du dem Compiler sinngemäß: "Lass mich nur machen, ich weiß schon, was ich tue." Nur dass das für dich nicht zuzutreffen scheint.

iKilledKenny 8. Jul 2008 13:51

Re: TList Sort funktioniert nicht
 
DeddyH hat Recht:
Delphi-Quellcode:
//...
type
  {*--- TfrmMain ---*} 
  TfrmMain = class(TForm)
  private
//...

implementation

// sorts the given source-sets
function compareSources(item1, item2: Pointer): Integer;
begin
  // cast items to sets
  set1 := TStringList(item1);
  set2 := TStringList(item2); // <- Zugriffsverletzung
end;

// builds the data-list based on the given source-list
function TfrmMain.buildDataList(sourceList: TList): TList;
begin
  sourceList.Sort(compareSources);
end;
//...

Errraddicator 8. Jul 2008 14:06

Re: TList Sort funktioniert nicht
 
Jetzt scheints zu funktionieren... Danke! :)

Aber dann erklärt sich mir nich, warum ein anderer mit dem (ursprünglich) gleichen Problem wie ich, nich direkt so beraten wurde wie ich, sondern auf diesem umständlichen Wege:
http://www.delphipraxis.net/internal...ct.php?t=36038

Oder ist das wieder was ganz Anderes :?:

...

@Apollonius
Irgendwie weiß ich immer noch nich, was genau Du jetzt von mir willst. :mrgreen: :?:

Dann sag mir doch einfach wie ich das Ganze lösen kann, ohne einen Pointer zu casten.
Wie die Vergleichsfunktion auszusehen hat is ja nun ma vorgegeben und das ich da 2 Pointer als Parameter hab, hab ich mir ja nich selber ausgedacht. :spin:

...

Irgendwie steh ich Heute komplett auffem Schlauch. :cheers:

Apollonius 8. Jul 2008 14:19

Re: TList Sort funktioniert nicht
 
Zitat:

Delphi-Quellcode:
sourceList.Sort(TListSortCompare(@sourceSorter));

So etwas sollst du nicht tun, wenn du dir nicht der Folgen bewusst bist. Ohne den Cast zeigte dir der Compiler an, wenn du falsche Parameter, falsche Aufrufkonvention o.Ä. angegeben hast.


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:25 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz