AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Fehler in Vergleichsfunktion von TList.Sort
Thema durchsuchen
Ansicht
Themen-Optionen

Fehler in Vergleichsfunktion von TList.Sort

Ein Thema von everdream · begonnen am 3. Apr 2008 · letzter Beitrag vom 4. Apr 2008
Antwort Antwort
Benutzerbild von everdream
everdream

Registriert seit: 22. Feb 2007
Ort: Hiddenhausen
192 Beiträge
 
Delphi 2005 Personal
 
#1

Fehler in Vergleichsfunktion von TList.Sort

  Alt 3. Apr 2008, 22:57
Hallo,

ich habe mir für mein Programm, das eine Art Adressbuch werden soll, das Thema zur Listensortierung(TList.Sort akzeptiert Vergleichsfunktion nicht) angeshaut und die Methode übernommen. Jetzt stimmt aber was bei meiner Vergleichsunktion nicht. Erstmal der Code:

Delphi-Quellcode:
type
  TMyListSortCompare = function(Item1, Item2: Pointer): Integer of Object;

  TDirectory = class
  private
    fEntryList: TList;
    fCompareListItems: TMyListSortCompare;
  public
    constructor Create;
    function CompareListItems(Item1, Item2: Pointer): Integer;
    procedure AddEntry(Entry: TEntry);
    procedure Sort;
  end;

implementation

constructor TDirectory.Create;
begin
  inherited;
  fEntryList:=TList.create;
  fCompareListItems:=CompareListItems;
end;

procedure TDirectory.AddEntry(Entry: TEntry);
begin
  fEntryList.Add(Entry);
  ShowMessage('Item added (' + Entry.LastName + ')');
end;

function TDirectory.CompareListItems(Item1, Item2: Pointer): Integer;
var
  tmpEntry1, tmpEntry2: TEntry;
  tmpText1, tmpText2: string;
begin
  tmpEntry1:=TEntry(Item1);
  tmpEntry2:=TEntry(Item2); //Beim ersten Durchlauf Inaccessable Value

  tmpText1:=tmpEntry1.LastName;
  tmpText2:=tmpEntry2.LastName;

  Result := CompareText(tmpText1, tmpText2);
end;

procedure TDirectory.Sort;
begin
  try
    fEntryList.Sort(TListSortCompare(@fCompareListItems));
    ShowMessage('Items sorted: ' + TEntry(fEntryList.Items[0]).LastName //Zu Testzwecken füge ich am Anfang 4 Einträge ein...
                                 + TEntry(fEntryList.Items[1]).LastName
                                 + TEntry(fEntryList.Items[2]).LastName
                                 + TEntry(fEntryList.Items[3]).LastName);
  except
    ShowMessage('Items not sorted');
  end;
end;
Die Vergleichsfunktion wird akzeptiert, jedoch kriege ich beim Aufrufen der Methode eine Exception (Access violation). Beim Debuggen ist mir aufgefallen, dass man schon beim ersten Durchlauf nicht auf tmpEntry2 zugreifen kann (Inaccessable Value). tmpEntry1 erscheint mit den eingegebenen Werten, also ganz normal. Durch das Fehlen von tmpEntry2 hat sich der Rest natürlich erübrigt...

Weiß jemand, was ich da verbockt haben könnte?
Max
"Das Ziel ist im Weg!"
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#2

Re: Fehler in Vergleichsfunktion von TList.Sort

  Alt 3. Apr 2008, 23:39
Zitat von everdream:
Weiß jemand, was ich da verbockt haben könnte?
Nicht du, sondern omata im verlinkten Beitrag. Ich behaupte hier einfach mal, dass das verlinkte Ergebnis nicht klappen kann. Es ist immernoch der gleiche Fehler wie im verlinkten Beitrag.

Da Delphi recht typensicher ist, erkennt er richtigerweise, dass dies keine gültige Sortierroutine ist. Dies ist auch vollkommen richtig so. Der verlinkte Beitrag umgeht die Typprüfung einfach, behebt aber nicht den Grund für die Inkompatiblität. Die Lösung kann auch definitiv nicht klappen, da die Sortierroutine immernoch kein Self Parameter übergibt auf Aufruf. Damit verrutschen die Parameter und damit ist Item2 das eigentliche Item1 und Items1 ist deine Instanzenklasse - aber das willst du nicht haben.

Schlussendlich zu deinem Problem:

Delphi-Quellcode:
type
  TDirectory = class
  private
    fEntryList: TList;
  public
    constructor Create;
    procedure AddEntry(Entry: TEntry);
    procedure Sort;
  end;

implementation

constructor TDirectory.Create;
begin
  inherited;
  fEntryList:=TList.create;
end;

procedure TDirectory.AddEntry(Entry: TEntry);
begin
  fEntryList.Add(Entry);
  ShowMessage('Item added (' + Entry.LastName + ')');
end;

function CompareListItems(Item1, Item2: Pointer): Integer;
var
  tmpEntry1, tmpEntry2: TEntry;
  tmpText1, tmpText2: string;
begin
  tmpEntry1:=TEntry(Item1);
  tmpEntry2:=TEntry(Item2); //Beim ersten Durchlauf Inaccessable Value

  tmpText1:=tmpEntry1.LastName;
  tmpText2:=tmpEntry2.LastName;

  Result := CompareText(tmpText1, tmpText2);
end;

procedure TDirectory.Sort;
begin
  try
    fEntryList.Sort(CompareListItems);
    ShowMessage('Items sorted: ' + TEntry(fEntryList.Items[0]).LastName //Zu Testzwecken füge ich am Anfang 4 Einträge ein...
                                 + TEntry(fEntryList.Items[1]).LastName
                                 + TEntry(fEntryList.Items[2]).LastName
                                 + TEntry(fEntryList.Items[3]).LastName);
  except
    ShowMessage('Items not sorted');
  end;
end;
  Mit Zitat antworten Zitat
Benutzerbild von everdream
everdream

Registriert seit: 22. Feb 2007
Ort: Hiddenhausen
192 Beiträge
 
Delphi 2005 Personal
 
#3

Re: Fehler in Vergleichsfunktion von TList.Sort

  Alt 4. Apr 2008, 20:27
Damit habe ich ja wieder das alte Problem:

List.Sort(@CompareListItems);
Zitat:
[Error] Variable required
Max
"Das Ziel ist im Weg!"
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#4

Re: Fehler in Vergleichsfunktion von TList.Sort

  Alt 4. Apr 2008, 20:29
Zitat von everdream:
Damit habe ich ja wieder das alte Problem:

List.Sort(@CompareListItems);
Zitat:
[Error] Variable required
Womit er auch vollkommen Recht hat. Es ist keine Variable somit kann der @ Operator dir auch keine Adresse liefern. Ich habe auch nirgendwo geschrieben das du dort ein @ benutzen sollst. Entweder richtig übernehmen oder selber wissen warum man es schreibt...
  Mit Zitat antworten Zitat
Benutzerbild von everdream
everdream

Registriert seit: 22. Feb 2007
Ort: Hiddenhausen
192 Beiträge
 
Delphi 2005 Personal
 
#5

Re: Fehler in Vergleichsfunktion von TList.Sort

  Alt 4. Apr 2008, 20:35
Ouh, tut mir Leid.
Max
"Das Ziel ist im Weg!"
  Mit Zitat antworten Zitat
Antwort Antwort


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 18:28 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