AGB  ·  Datenschutz  ·  Impressum  







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

Fehler mit CustomSort

Ein Thema von okoeller · begonnen am 4. Dez 2007 · letzter Beitrag vom 5. Dez 2007
Antwort Antwort
okoeller

Registriert seit: 21. Nov 2006
66 Beiträge
 
Turbo Delphi für Win32
 
#1

Fehler mit CustomSort

  Alt 4. Dez 2007, 21:52
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.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Fehler mit CustomSort

  Alt 4. Dez 2007, 21:58
Dann nimm doch mal eine Variable.
Markus Kinzler
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#3

Re: Fehler mit CustomSort

  Alt 4. Dez 2007, 22:14
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...
  Mit Zitat antworten Zitat
okoeller

Registriert seit: 21. Nov 2006
66 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: Fehler mit CustomSort

  Alt 5. Dez 2007, 08:23
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.
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#5

Re: Fehler mit CustomSort

  Alt 5. Dez 2007, 17:33
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
  Mit Zitat antworten Zitat
okoeller

Registriert seit: 21. Nov 2006
66 Beiträge
 
Turbo Delphi für Win32
 
#6

[gelöst] Fehler mit CustomSort

  Alt 5. Dez 2007, 18:31
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
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#7

Re: Fehler mit CustomSort

  Alt 5. Dez 2007, 18:33
Sind die verschiedenen ListViews auf verschiedenen Formularen? Dann bietet sich eine eigene Unit an, in der Du die SortProc bereitstellst.
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
okoeller

Registriert seit: 21. Nov 2006
66 Beiträge
 
Turbo Delphi für Win32
 
#8

Re: Fehler mit CustomSort

  Alt 5. Dez 2007, 18:58
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 }
. . .
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#9

Re: Fehler mit CustomSort

  Alt 5. Dez 2007, 19:08
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
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
okoeller

Registriert seit: 21. Nov 2006
66 Beiträge
 
Turbo Delphi für Win32
 
#10

Re: Fehler mit CustomSort

  Alt 5. Dez 2007, 20:01
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;
  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 03:50 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