[gelöst] tList.Sort

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
exc-jdbi
Beiträge: 64
Registriert: So 3. Aug 2014, 03:37

[gelöst] tList.Sort

Beitrag von exc-jdbi »

Guten Abend Community

Ich seh den Fehler nicht. Dieses Problem wurde schon einmal hier im Forum behandelt, aber als Integervariante.
Ich besitze hier eine Stringvariante. Warum funktioniert das nicht.

Fehlermeldung:

Code: Alles auswählen

Project "" hat Exception- Klasse >>External: SIGSEGV<< ausgelöst
Kompilieren lässt sich die Geschichte problemlos. Ich hab es auch schon mit einer Callback-Variante versucht, lässt sich aber nicht kompillieren. Es sollte doch möglich sein, z.B. mit einem Case wahlweise die Routine lstSortStrVorname oder lstSortStrNachname anzusprechen.

Hier mein Code.

Code: Alles auswählen

 
unit Unit1;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,windows;
 
type tListSortCompare=function(p1,p2:Pointer):integer;
 
  { TForm1 }
  pName=^tName;
  tName=record
     Vorname,Nachname:String;
  end;
 
  TForm1 = class(TForm)
    Button1: TButton;
    destructor Destroy;override;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    Liste:tList;
    lstCompare:tListSortCompare;
    function lstSortStrVorname(p1,p2:Pointer):integer;
  public
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.lfm}
 
{ TForm1 }
 
destructor TForm1.Destroy;
var i:integer;
begin
  if Assigned(Liste) then
  begin
    for i:=0 to Liste.Count-1 do
      Dispose(pName(Liste[i]));
  end;
  inherited Destroy;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var pN:pName;
    iCount:integer;
    str:string;
begin
  if Assigned(Liste) then
    for iCount:=10-1 downto 0 do
    begin
      pN:=GetMemory(SizeOf(tName));
      ZeroMemory(pN, SizeOf(tName));
      pN^.Vorname:='Vorname'+intToStr(iCount);
      pN^.Nachname:='Nachname'+intToStr(iCount);
      liste.Add(pN);
    end;
   Liste.Sort(lstCompare); {HIER DER FEHLER}
end;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  Liste:=tList.create;
end;
 
function TForm1.lstSortStrVorname(p1,p2:Pointer):integer;
begin
  Result:=CompareText(pName(p2)^.Vorname,pName(p1)^.Vorname);
end;
 
//function TForm1.lstSortStrNachname(p1,p2:Pointer):integer;
//begin
//  Result:=CompareText(pName(p2)^.Nachname,pName(p1)^.Nachname);
//end;
 
end.
 
Danke für die Hilfe.

Freundliche Grüsse


exc-jdbi
Zuletzt geändert von exc-jdbi am Mi 24. Sep 2014, 23:12, insgesamt 1-mal geändert.

Benutzeravatar
theo
Beiträge: 10872
Registriert: Mo 11. Sep 2006, 19:01

Re: tList.Sort

Beitrag von theo »

Da habe ich ein paar Fragezeichen, aber eins ist sicher: TListSortCompare ist eine einfache Funktion, also nicht eine Methode von z.B. TForm1.

Code: Alles auswählen

function SortComp(Item1, Item2: Pointer): Integer;
begin
 
end;  
 
Liste.Sort(@SortComp);
 

exc-jdbi
Beiträge: 64
Registriert: So 3. Aug 2014, 03:37

Re: tList.Sort

Beitrag von exc-jdbi »

Hallo Theo

Danke für die Antwort.

Ich hätte doch auch einen anderen Namen nehmen können als tListSortCompare (z.b. tLstCompare).

Funktioniert das nur, wenn es eine Methode der Form1 ist? wie müsste ich das den deklarieren?

Auch mit type? Oder einfach lstCompare:tLstCompare .

Freundliche Grüsse

Exc-jdbi

exc-jdbi
Beiträge: 64
Registriert: So 3. Aug 2014, 03:37

Re: tList.Sort

Beitrag von exc-jdbi »

Funktioniert leider nicht.

Ich habe deinen Vorschlag schon vorher ausprobiert. es kommt wieder die gleiche Meldung.

Benutzeravatar
theo
Beiträge: 10872
Registriert: Mo 11. Sep 2006, 19:01

Re: tList.Sort

Beitrag von theo »

Verstehe deine Frage nicht. Ich hab doch geschrieben wie es geht.

exc-jdbi
Beiträge: 64
Registriert: So 3. Aug 2014, 03:37

Re: tList.Sort

Beitrag von exc-jdbi »

Danke Theo das hat geklappt. Sorry ich habe das zuerst falsch verstanden, was du gemeint hast.

Freundliche Grüsse

exc-jdbi

Antworten