![]() |
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. |
Re: Fehler mit CustomSort
Dann nimm doch mal eine Variable.
|
Re: Fehler mit CustomSort
Hallo,
![]()
Delphi-Quellcode:
Gruß Hawkeye
function CustomSortProc(Item1, Item2: TListItem; ParamSort: integer): integer; stdcall;
begin Result := -CompareText(Item1.Caption, item2.Caption); end; // Edit: "stdcall" vergessen... |
Re: Fehler mit CustomSort
Hallo Hawkeye219,
ich dachte
Delphi-Quellcode:
ist eine einfache Funktion.
function CustomSortProc(Item1, Item2: TListItem; ParamSort: integer): integer;
begin Result := -CompareText(Item1.Caption, item2.Caption); end; 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. |
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:
Nur die zweite Form wird vom Compiler akzeptiert.
// 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; Gruß Hawkeye |
[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 |
Re: Fehler mit CustomSort
Sind die verschiedenen ListViews auf verschiedenen Formularen? Dann bietet sich eine eigene Unit an, in der Du die SortProc bereitstellst.
|
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 } . . . |
Re: Fehler mit CustomSort
Ich habe das mal so getestet:
Delphi-Quellcode:
Nun diese Unit unter uses eingetragen und mit
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.
Delphi-Quellcode:
aufgerufen ;)
procedure TForm1.Button3Click(Sender: TObject);
begin ListView1.CustomSort(@CustomSortProc,0); end; |
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