Delphi-PRAXiS

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 Fehler mit CustomSort (https://www.delphipraxis.net/104475-fehler-mit-customsort.html)

okoeller 4. Dez 2007 22:52


Fehler mit CustomSort
 
Hallo Delphianer,


warum fliegt mein Programm in procedure TForm1.ListView1ColumnClick . . .
in Zeile ListView1.CustomSort(@CustomSortProc, 0);

mit der Meldung " Variable erforderlich " raus?

Danke für hilfreiche Antworten.

okoeller


Delphi-Quellcode:
unit LVT;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, StdCtrls;

type
  TForm1 = class(TForm)
    ListView1: TListView;
    procedure FormCreate(Sender: TObject);
    procedure ListView1ColumnClick(Sender: TObject; Column: TListColumn);
  private
    procedure DatensaetzeHinzufuegen ;
    function CustomSortProc(Item1, Item2: TListItem; ParamSort: integer): integer; stdcall;
  public
  end;


var
  Form1: TForm1;


implementation

{$R *.dfm}


function TForm1.CustomSortProc(Item1, Item2: TListItem;
  ParamSort: integer): integer;
begin
   Result := -CompareText(Item1.Caption, item2.Caption);
end;


{*
  Testdaten
*}
procedure TForm1.DatensaetzeHinzufuegen;
var
  Litem : TListItem;
begin
  ListView1.Items.BeginUpdate;
  ListView1.Items.Clear;
  .
  .
  .
  ListView1.Items.EndUpdate;
end;


procedure TForm1.FormCreate(Sender: TObject);
begin
  DatensaetzeHinzufuegen;
end;


procedure TForm1.ListView1ColumnClick(Sender: TObject; Column: TListColumn);
begin
  ListView1.CustomSort(@CustomSortProc, 0);
end;


end.

mkinzler 4. Dez 2007 22:58

Re: Fehler mit CustomSort
 
Dann nimm doch mal eine Variable.

Hawkeye219 4. Dez 2007 23:14

Re: Fehler mit CustomSort
 
Hallo,

Delphi-Referenz durchsuchenTListView.CustomSort erwartet eine einfache Funktion, keine Methode:

Delphi-Quellcode:
function CustomSortProc(Item1, Item2: TListItem; ParamSort: integer): integer; stdcall;
begin
   Result := -CompareText(Item1.Caption, item2.Caption);
end;
Gruß Hawkeye

// Edit: "stdcall" vergessen...

okoeller 5. Dez 2007 09:23

Re: Fehler mit CustomSort
 
Hallo Hawkeye219,

ich dachte

Delphi-Quellcode:
function CustomSortProc(Item1, Item2: TListItem; ParamSort: integer): integer;
begin
   Result := -CompareText(Item1.Caption, item2.Caption);
end;
ist eine einfache Funktion.

Ich hab das Beispiel aus der Delphi 7 Hilfe und unter swissdelphicenter.ch gibt es ein erweitertes Beispiel, welches genauso vorgeht.
Zunächst wollte ich mit einer einfachen Sortiermethode anfangen, um zu verstehen wie es geht.
Leider bleibe ich hier schon stecken.
Danach muß die Sortiermethode in einer separate Unit oder Klasse gekapselt werden, da ich mehr als eine Liste habe.

Hawkeye219 5. Dez 2007 18:33

Re: Fehler mit CustomSort
 
Hallo,

in deinem Beitrag #1 hast du die Vergleichsroutine als Methode des Formulars vereinbart. Formal ähnelt sie einer Prozedur, die Methode besitzt jedoch einen unsichtbaren (Self-)Parameter und ist somit nicht kompatibel zu der von CustomSort erwarteten Routine. In meinem Beitrag habe ich die Routine so gezeigt, wie sie benötigt wird - jedenfalls fast, denn die Direktive stdcall hatte ich vergessen.

Hier sind noch einmal beide Möglichkeiten:

Delphi-Quellcode:
// Vergleichsroutine als Methode des Formulars
function TForm1.CustomSortMethod(Item1, Item2: TListItem; ParamSort: integer): integer; stdcall;
begin
  Result := -CompareText(Item1.Caption,Item2.Caption);
end;

// Vergleichsroutine als einfache Prozedur
function CustomSortProc(Item1, Item2: TListItem; ParamSort: integer): integer; stdcall;
begin
  Result := -CompareText(Item1.Caption,Item2.Caption);
end;

procedure TForm1.ListView2ColumnClick(Sender: TObject; Column: TListColumn);
begin
  ListView1.CustomSort(@CustomSortMethod, 0); // das wird NICHT akzeptiert
  ListView1.CustomSort(@CustomSortProc, 0);   // das wird akzeptiert
end;
Nur die zweite Form wird vom Compiler akzeptiert.

Gruß Hawkeye

okoeller 5. Dez 2007 19:31

[gelöst] Fehler mit CustomSort
 
Hallo Hawkeye,

danke für Deine Antwort.
Hab jetzt den Unterschied zwischen einer "Formular-Methode" und einer "einfachen Prozedur" verstanden.
Gut erklärt!!
Damit läuft jetzt auch mein MiniProgramm.
Jetzt muss ich nur noch herausfinden, wie ich so eine Sortiermethode auslagern kann, damit ich sie für mehrere ListViews verwenden kann.
Tu mich hier als Beginner noch etwas schwer mit solchen Dingen.

Gruß okoeller

DeddyH 5. Dez 2007 19:33

Re: Fehler mit CustomSort
 
Sind die verschiedenen ListViews auf verschiedenen Formularen? Dann bietet sich eine eigene Unit an, in der Du die SortProc bereitstellst.

okoeller 5. Dez 2007 19:58

Re: Fehler mit CustomSort
 
Hallo DaddyH,

die ListViews für die ich diese Lösung brauche befinden sich in Frames verschiedener Fenster.

Zunächst will ich die Aufgabe aber mit meinem kleinen Beispielprogramm lösen, hier hab ich nur eine ListView.
Für mein Beispielprogramm hab ich nun eine neue Unit ListeSortieren erstellt(sie ist von Thomas Stutz, swissdelphicenter.ch) und diese in meiner Unit LVT unter uses eingebunden. Leider funktioniert die Sortierung nicht wie gewünscht.
Muß der Aufruf jetzt vielleicht anders lauten, oder muss ich in der Unit ListeSortieren die "function CustomSortProc(Item1,..." anders deklarieren?

Gruß okoeller

Delphi-Quellcode:
unit ListeSortieren;
interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, StdCtrls;

type
  TCustomSortStyle = (cssAlphaNum, cssNumeric, cssDateTime);

function CustomSortProc(Item1, Item2: TListItem; SortColumn: Integer): Integer; stdcall;

var
  { variable to hold the sort style }
  LvSortStyle: TCustomSortStyle;
  { array to hold the sort order }
  LvSortOrder: array[0..4] of Boolean; // High[LvSortOrder] = Number of Lv Columns

implementation



function CustomSortProc(Item1, Item2: TListItem; SortColumn: Integer): Integer; stdcall;
var
  s1, s2: string;
  i1, i2: Integer;
  r1, r2: Boolean;
  d1, d2: TDateTime;

  { Helper functions }
. . .

DeddyH 5. Dez 2007 20:08

Re: Fehler mit CustomSort
 
Ich habe das mal so getestet:
Delphi-Quellcode:
unit MySort;

interface

uses SysUtils, comctrls;

function CustomSortProc(Item1, Item2: TListItem; ParamSort: integer): integer; stdcall;

implementation

function CustomSortProc(Item1, Item2: TListItem; ParamSort: integer): integer; stdcall;
begin
  Result := -AnsiStrIComp(PChar(Item1.Caption),PChar(Item2.Caption));
end;


end.
Nun diese Unit unter uses eingetragen und mit
Delphi-Quellcode:
procedure TForm1.Button3Click(Sender: TObject);
begin
  ListView1.CustomSort(@CustomSortProc,0);
end;
aufgerufen ;)

okoeller 5. Dez 2007 21:01

Re: Fehler mit CustomSort
 
Hallo DeddyH,

wie Du es beschrieben hast funktioniert es jetzt auch bei mir.
Mein Fehler lag in der ListView1ColumnClick. Dort hatte ich cssAlphaNum und cssNumeric nicht richtig eingesetzt. Man muss halt darauf achten welche Spalten der ListView numerische oder alphanumerische Werte enthalten und den LvSortStyle entsprechend setzen.

Danke für den Beitrag

Gruß okoeller


Delphi-Quellcode:
procedure TForm1.ListView1ColumnClick(Sender: TObject; Column: TListColumn);
begin
//  ListView1.CustomSort(@CustomSortProc, 0);

if Column.Index = 0 then
  LvSortStyle := cssNumeric
else
  LvSortStyle := cssAlphaNum;

ListView1.CustomSort(@CustomSortProc, Column.Index-1);
LvSortOrder[Column.Index] := not LvSortOrder[Column.Index];

end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:49 Uhr.

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