AGB  ·  Datenschutz  ·  Impressum  







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

TListView: Deselektieren verhindern?

Ein Thema von PeterPanino · begonnen am 31. Okt 2007 · letzter Beitrag vom 1. Nov 2007
Antwort Antwort
Seite 1 von 2  1 2      
PeterPanino

Registriert seit: 4. Sep 2004
1.465 Beiträge
 
Delphi 10.4 Sydney
 
#1

TListView: Deselektieren verhindern?

  Alt 31. Okt 2007, 21:05
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).
  Mit Zitat antworten Zitat
Benutzerbild von Deep-Sea
Deep-Sea

Registriert seit: 17. Jan 2007
907 Beiträge
 
Delphi XE2 Professional
 
#2

Re: TListView: Deselektieren verhindern?

  Alt 1. Nov 2007, 08:16
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

Nebenbei: Warum willst'e das? ^^
Chris
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#3

Re: TListView: Deselektieren verhindern?

  Alt 1. Nov 2007, 12:56
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
  Mit Zitat antworten Zitat
PeterPanino

Registriert seit: 4. Sep 2004
1.465 Beiträge
 
Delphi 10.4 Sydney
 
#4

Re: TListView: Deselektieren verhindern?

  Alt 1. Nov 2007, 13:47
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.
  Mit Zitat antworten Zitat
Benutzerbild von Deep-Sea
Deep-Sea

Registriert seit: 17. Jan 2007
907 Beiträge
 
Delphi XE2 Professional
 
#5

Re: TListView: Deselektieren verhindern?

  Alt 1. Nov 2007, 13:53
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 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?
Chris
  Mit Zitat antworten Zitat
PeterPanino

Registriert seit: 4. Sep 2004
1.465 Beiträge
 
Delphi 10.4 Sydney
 
#6

Re: TListView: Deselektieren verhindern?

  Alt 1. Nov 2007, 14:07
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;
  Mit Zitat antworten Zitat
PeterPanino

Registriert seit: 4. Sep 2004
1.465 Beiträge
 
Delphi 10.4 Sydney
 
#7

Re: TListView: Deselektieren verhindern?

  Alt 1. Nov 2007, 14:46
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;
  Mit Zitat antworten Zitat
Benutzerbild von Deep-Sea
Deep-Sea

Registriert seit: 17. Jan 2007
907 Beiträge
 
Delphi XE2 Professional
 
#8

Re: TListView: Deselektieren verhindern?

  Alt 1. Nov 2007, 14:50
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?
Chris
  Mit Zitat antworten Zitat
PeterPanino

Registriert seit: 4. Sep 2004
1.465 Beiträge
 
Delphi 10.4 Sydney
 
#9

Re: TListView: Deselektieren verhindern?

  Alt 1. Nov 2007, 15:01
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.
  Mit Zitat antworten Zitat
Benutzerbild von Deep-Sea
Deep-Sea

Registriert seit: 17. Jan 2007
907 Beiträge
 
Delphi XE2 Professional
 
#10

Re: TListView: Deselektieren verhindern?

  Alt 1. Nov 2007, 15:07
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...
Chris
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 19:27 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