Delphi-PRAXiS
Seite 1 von 2  1 2      

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 TListView: Deselektieren verhindern? (https://www.delphipraxis.net/102601-tlistview-deselektieren-verhindern.html)

PeterPanino 31. Okt 2007 20:05


TListView: Deselektieren verhindern?
 
Wie kann man bei einem TListView (ViewStyle: vsReport) verhindern, dass bei einem Klick auf die weiße Fläche unterhalb der Einträge das aktuell selektierte Item deselektiert und somit die Eigenschaft ItemIndex auf -1 gesetzt wird?

(Dies hat nichts mit der Eigenschaft HideSelection zu tun, die lediglich beim Verlust des Fokus des ListView die Selektion des selektierten Eintrages in grauer Farbe weiterhin anzeigt).

Deep-Sea 1. Nov 2007 07:16

Re: TListView: Deselektieren verhindern?
 
Zitat:

Zitat von PeterPanino
Wie kann man bei einem TListView (ViewStyle: vsReport) verhindern, dass bei einem Klick auf die weiße Fläche unterhalb der Einträge das aktuell selektierte Item deselektiert und somit die Eigenschaft ItemIndex auf -1 gesetzt wird?

(Dies hat nichts mit der Eigenschaft HideSelection zu tun, die lediglich beim Verlust des Fokus des ListView die Selektion des selektierten Eintrages in grauer Farbe weiterhin anzeigt).

Schau dir mal die TListView-Ereignisse "OnChanging", "OnChange" und "OnSelectItem" an :wink:

Nebenbei: Warum willst'e das? ^^

marabu 1. Nov 2007 11:56

Re: TListView: Deselektieren verhindern?
 
Hallo Peter,

schau mal:

Delphi-Quellcode:
procedure TDemoForm.ListViewClick(Sender: TObject);
var
  item: TListItem;
  pt: TPoint;
begin
  with Sender as TListView do
  begin
    pt := ScreenToClient(Mouse.CursorPos);
    item := GetItemAt(pt.X, pt.Y);
    if Assigned(item)
      then ShowMessage(item.Caption)
      else ItemIndex := ItemFocused.Index;
  end;
end;
Grüße vom marabu

PeterPanino 1. Nov 2007 12:47

Re: TListView: Deselektieren verhindern?
 
Mit diesem Code habe ich herausgefunden, dass bei der Selektion eines Items (wenn vorher ein anderes Item selektiert war), dieses Ereignis OnChanging 3 mal aufgerufen wird:

Delphi-Quellcode:
procedure TForm1.ListViewChanging(Sender: TObject; Item: TListItem;
  Change: TItemChange; var AllowChange: Boolean);
begin
  if (Change = ctState) then
    Windows.Beep(Random(100) + 150, 300);
end;
Aber ich habe noch nicht herausgefunden, wie man verhindern kann, dass ListView.ItemIndex auf -1 gesetzt wird.

Deep-Sea 1. Nov 2007 12:53

Re: TListView: Deselektieren verhindern?
 
Zitat:

Zitat von PeterPanino
Mit diesem Code habe ich herausgefunden, dass bei der Selektion eines Items (wenn vorher ein anderes Item selektiert war), dieses Ereignis OnChanging 3 mal aufgerufen wird:

Delphi-Quellcode:
procedure TForm1.ListViewChanging(Sender: TObject; Item: TListItem;
  Change: TItemChange; var AllowChange: Boolean);
begin
  if (Change = ctState) then
    Windows.Beep(Random(100) + 150, 300);
end;

Vlt. wäre "OutputDebugString" da praktischer *gg*


Zitat:

Zitat von PeterPanino
Aber ich habe noch nicht herausgefunden, wie man verhindern kann, dass ListView.ItemIndex auf -1 gesetzt wird.

Die Funktion von marabu sollte dir doch helfen können, oder?

PeterPanino 1. Nov 2007 13:07

Re: TListView: Deselektieren verhindern?
 
Zitat:

Zitat von marabu
Hallo Peter,

schau mal:

Delphi-Quellcode:
procedure TDemoForm.ListViewClick(Sender: TObject);
var
  item: TListItem;
  pt: TPoint;
begin
  with Sender as TListView do
  begin
    pt := ScreenToClient(Mouse.CursorPos);
    item := GetItemAt(pt.X, pt.Y);
    if Assigned(item)
      then ShowMessage(item.Caption)
      else ItemIndex := ItemFocused.Index;
  end;
end;
Grüße vom marabu

Genial! Ich habe den Code nun erweitert:

Delphi-Quellcode:
procedure TForm1.ListViewClick(Sender: TObject);
var
  item: TListItem;
  pt: TPoint;
begin
  with Sender as TListView do
  begin
    pt := ScreenToClient(Mouse.CursorPos);
    item := GetItemAt(pt.X, pt.Y);
    if (not Assigned(item)) and Assigned(ItemFocused) then
    begin
      ItemIndex := ItemFocused.Index;
    end;
  end;
  if ListView.ItemIndex = -1 then
    Windows.Beep(Random(100) + 150, 300);
end;

PeterPanino 1. Nov 2007 13:46

Re: TListView: Deselektieren verhindern?
 
Es gibt doch noch ein Problem: Aus verschiedenen Gründen bin ich darauf angewiesen, meine Verarbeitungen im Ereignis OnSelectItem durchzuführen (wobei ItemIndex nicht -1 sein soll). Da nun aber OnSelectItem VOR OnClick ausgeführt wird, ist ItemIndex beim Klick auf eine freie Fläche immer noch auf -1 und wird erst nachher im Ereignis OnClick korrigiert.

Wenn ich nun aber versuche, einen ähnlichen Mechanismus in OnSelectItem einzubauen, so funktioniert das leider nicht:

Delphi-Quellcode:
procedure TForm1.ListViewSelectItem(Sender: TObject; Item: TListItem;
  Selected: Boolean);
begin
  with ListView do
  begin
    if Assigned(ItemFocused) and (ItemIndex = -1) then
    begin
      ItemIndex := ItemFocused.Index;
    end;
  end;
  if ListView.ItemIndex = -1 then
    Windows.Beep(Random(100) + 150, 300);
end;

Deep-Sea 1. Nov 2007 13:50

Re: TListView: Deselektieren verhindern?
 
Zitat:

Zitat von PeterPanino
Es gibt doch noch ein Problem: Aus verschiedenen Gründen bin ich darauf angewiesen, meine Verarbeitungen im Ereignis OnSelectItem durchzuführen (wobei ItemIndex nicht -1 sein soll). Da nun aber OnSelectItem VOR OnClick ausgeführt wird, ist ItemIndex beim Klick auf eine freie Fläche immer noch auf -1 und wird erst nachher im Ereignis OnClick korrigiert.

Wenn ich nun aber versuche, einen ähnlichen Mechanismus in OnSelectItem einzubauen, so funktioniert das leider nicht:

Natürlich nicht, OnSelectItem wird vor dem deselektieren des Items aufgerufen, somit ist ItemFocused nicht nil. Danach wird es nur aufgerufen, wenn ein anderes Item selektiert wurde.

Wieso muss die Verarbeitung im OnSelectItem sein?

PeterPanino 1. Nov 2007 14:01

Re: TListView: Deselektieren verhindern?
 
Zitat:

Zitat von Deep-Sea
Wieso muss die Verarbeitung im OnSelectItem sein?

Das ist etwas kompliziert. Unter anderem deswegen, weil die Items auch mit anderen Methoden ausgewählt werden, z.B. mit bestimmten Tasten und anderen Funktionen. Es wäre sehr kompliziert, das alles auf OnClick umzustellen.

Deep-Sea 1. Nov 2007 14:07

Re: TListView: Deselektieren verhindern?
 
Ich weiß nicht, ob es funktioniert, aber versuch's doch einfach mal:
Sende dir im OnSelectItem mit PostMessage eine Nachricht. In der Empfangsroutine für die Nachricht kannst du dann hoffentlich auf ItemFocused prüfen...


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:31 Uhr.
Seite 1 von 2  1 2      

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-2025 by Thomas Breitkreuz