[gelöst] ListView1ColumnClick aufrufen

Rund um die LCL und andere Komponenten
Antworten
catweasel
Beiträge: 230
Registriert: Di 17. Mär 2009, 10:51
OS, Lazarus, FPC: Win10 64Bit // Linux Mint 20.0 - (L 2.2.0 FPC 3.2.2)

[gelöst] ListView1ColumnClick aufrufen

Beitrag von catweasel »

Moin

Ich habe ein ListView auf meinem Programm das ich je nachdem auf welche Spalte ich klicke sortiere. Das funktioniert soweit:

Das sind die zum sortieren notwendigen Programmteile:

Code: Alles auswählen

procedure TMainForm.ListView1ColumnClick(Sender: TObject; Column: TListColumn);
begin
  Screen.Cursor:=crHourGlass;
  TListView(Sender).SortType := stNone;
  if Column.Index<>SortedColumn then begin
     SortedColumn := Column.Index;
     Descending := False;
  end else
      Descending := not Descending;
  TListView(Sender).SortType := stText;
  Screen.Cursor:=crDefault;
end;  
 
procedure TMainForm.ListView1Compare(Sender: TObject; Item1, Item2: TListItem;
  Data: Integer; var Compare: Integer);
begin
  if SortedColumn = 0 then Compare := CompareText(Item1.Caption, Item2.Caption)
                      else if SortedColumn <> 0 then Compare := CompareText(Item1.SubItems[SortedColumn-1], Item2.SubItems[SortedColumn-1]);
  if Descending then Compare := -Compare;
end;
Wie gesagt, das funktioniert soweit.

Allerdings möchte ich nach Programmstart, die Nummer der Spalte nach der sortiert werde soll, aus meiner INI einlesen und sofort den ListView sortieren, ohne das ich jedesmal nach Programmstart wieder auf die Spalte klicken muß.
Das Speichern und Einlesen der zu sortierenden Spalten-Nummer funktioniert auch, nur das Aufrufen des Ereignisses vom ListView nicht.


Ich versuche zum Test das Ereignis im Programmcode wie folgt aufzurufen, was aber zu einem Programmabsturz führt:

Code: Alles auswählen

var sort  : TListColumn;
 
procedure TMainForm.Button1Click(Sender: TObject);
begin
  sort.Index:=2;
  ListView1ColumnClick(self, sort);
end;

Wie kann ich ListView1ColumnClick aufrufen das er den ListView so sortiert als hätte ich auf eine der Spaltenüberschriften geklickt?

Gruß
Michael
Zuletzt geändert von catweasel am Mo 6. Aug 2012, 14:27, insgesamt 1-mal geändert.

catweasel
Beiträge: 230
Registriert: Di 17. Mär 2009, 10:51
OS, Lazarus, FPC: Win10 64Bit // Linux Mint 20.0 - (L 2.2.0 FPC 3.2.2)

Re: ListView1ColumnClick aufrufen

Beitrag von catweasel »

catweasel hat geschrieben:Ich versuche zum Test das Ereignis im Programmcode wie folgt aufzurufen, was aber zu einem Programmabsturz führt:

Code: Alles auswählen

var sort  : TListColumn;
 
procedure TMainForm.Button1Click(Sender: TObject);
begin
  sort.Index:=2;
  ListView1ColumnClick(self, sort);
end;
Wie kann ich ListView1ColumnClick aufrufen das er den ListView so sortiert als hätte ich auf eine der Spaltenüberschriften geklickt?
Mann, kaum abgeschickt finde ich die Lösung. So funktioniert´s z.B. mit Spalte Nr. 2:

Code: Alles auswählen

ListView1ColumnClick(ListView1, ListView1.Columns.Items[2]);
Gruß
Michael

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2822
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: ListView1ColumnClick aufrufen

Beitrag von m.fuchs »

catweasel hat geschrieben:Ich versuche zum Test das Ereignis im Programmcode wie folgt aufzurufen, was aber zu einem Programmabsturz führt:

Code: Alles auswählen

var sort  : TListColumn;
 
procedure TMainForm.Button1Click(Sender: TObject);
begin
  sort.Index:=2;
  ListView1ColumnClick(self, sort);
end;
Du versuchst einen Aufruf von ListView1ColumnClick mit einem TListColumn, die gar nicht zu deinem ListView gehört. Viel schlimmer noch, dieses TListColumn ist überhaupt nicht erzeugt worden. Deswegen kracht es auch, wenn du versuchst die Property Index zu beschreiben.

Lange Rede, kurzer Sinn:

Code: Alles auswählen

procedure TMainForm.Button1Click(Sender: TObject);
begin
  ListView1ColumnClick(self, ListView1.Column[2]);
end;
Das sollte dann funktionieren.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Antworten