AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TList Sort funktioniert nicht

Ein Thema von Errraddicator · begonnen am 8. Jul 2008 · letzter Beitrag vom 8. Jul 2008
Antwort Antwort
Seite 1 von 2  1 2      
Errraddicator

Registriert seit: 26. Jun 2008
161 Beiträge
 
Delphi 2007 Professional
 
#1

TList Sort funktioniert nicht

  Alt 8. Jul 2008, 14:11
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
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#2

Re: TList Sort funktioniert nicht

  Alt 8. Jul 2008, 14:34
AFAIK darf die Vergleichsroutine keine Methode, sondern muss eine einfache Funktion sein.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: TList Sort funktioniert nicht

  Alt 8. Jul 2008, 14:42
Kleiner Tipp am Rande: Wenn du nicht weißt, was du tust, caste NIE Zeiger auf Code irgendwelcher Art.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Errraddicator

Registriert seit: 26. Jun 2008
161 Beiträge
 
Delphi 2007 Professional
 
#4

Re: TList Sort funktioniert nicht

  Alt 8. Jul 2008, 14:44
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*
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#5

Re: TList Sort funktioniert nicht

  Alt 8. Jul 2008, 14:46
Nur weil mein Compiler nicht meckert, heißt das ja nicht, dass ich keine Fehler mache.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Errraddicator

Registriert seit: 26. Jun 2008
161 Beiträge
 
Delphi 2007 Professional
 
#6

Re: TList Sort funktioniert nicht

  Alt 8. Jul 2008, 14:49
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 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*
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#7

Re: TList Sort funktioniert nicht

  Alt 8. Jul 2008, 14:51
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.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Benutzerbild von iKilledKenny
iKilledKenny

Registriert seit: 25. Apr 2007
Ort: Bergstrasse
49 Beiträge
 
Delphi 5 Professional
 
#8

Re: TList Sort funktioniert nicht

  Alt 8. Jul 2008, 14:51
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;
//...
Alexander Stork
  Mit Zitat antworten Zitat
Errraddicator

Registriert seit: 26. Jun 2008
161 Beiträge
 
Delphi 2007 Professional
 
#9

Re: TList Sort funktioniert nicht

  Alt 8. Jul 2008, 15:06
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.

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.

...

Irgendwie steh ich Heute komplett auffem Schlauch.
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#10

Re: TList Sort funktioniert nicht

  Alt 8. Jul 2008, 15:19
Zitat:
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.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:14 Uhr.
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