Delphi-PRAXiS

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/)
-   -   "Bug" in TCustomListBox.ClearSelection (https://www.delphipraxis.net/216524-bug-tcustomlistbox-clearselection.html)

Amateurprofi 12. Jan 2025 20:54

"Bug" in TCustomListBox.ClearSelection
 
Die Prozedur "TCustomListBox.ClearSelection" ist m.E. fehlerhaft, oder zumindest unschön formuliert.
Wenn MultiSelect True ist wird für alle Einträge Selected = False gesetzt, auch wenn Selected bereits False ist.
Das Setzen von Selected scheint ein Repaint auch dann auszulösen, wenn Selected nicht verändert wird, d.h. bei jedem "Selected:=False" wird die ListBox neu gezeichnet.
Das ist kein Problem, wenn die ListBox nur wenige Einträge enthält, ist aber lästig, wenn viele Einträge vorhanden sind.

Delphi-Quellcode:
procedure TCustomListBox.ClearSelection;
var
  I: Integer;
begin
  if MultiSelect then
    for I := 0 to Items.Count - 1 do
      Selected[I] := False
  else
    ItemIndex := -1;
end;
Besser wäre es so:

Delphi-Quellcode:
PROCEDURE TCustomListBox.ClearSelection;
var I:Integer;
begin
  if MultiSelect then
    for I:=0 to Items.Count-1 do
      if Selected[I] then Selected[I]:=False
  else
    ItemIndex:=-1;
end;
Fragen:
Ist das bei neueren Delphi-Versionen immer noch so?
Wenn nicht, sollte ich einen Bug-Report erstellen?
Eigentlich ist es ja kein Bug, denn die Prozedur macht ja, was sie machen soll.

Redeemer 12. Jan 2025 21:24

AW: "Bug" in TCustomListBox.ClearSelection
 
Die Methode (in D12) sieht immer noch so aus, aber der Setter prüft:
Delphi-Quellcode:
if (Index = -1) or (Value <> Selected[Index]) then

Ich vermute, dass sie davon ausgingen, dass das geprüft wird (machen fast alle Setter in der VCL), und deshalb die Methode so gemacht haben (was allerdings von der Performance nicht so geil ist, da ständig den Setter erst für aufzurufen).

Hat der Setter diese Prüfung in deiner Delphi-Version nicht?

Amateurprofi 13. Jan 2025 02:01

AW: "Bug" in TCustomListBox.ClearSelection
 
Zitat:

Zitat von Redeemer (Beitrag 1545099)
Die Methode (in D12) sieht immer noch so aus, aber der Setter prüft:
Delphi-Quellcode:
if (Index = -1) or (Value <> Selected[Index]) then

Ich vermute, dass sie davon ausgingen, dass das geprüft wird (machen fast alle Setter in der VCL), und deshalb die Methode so gemacht haben (was allerdings von der Performance nicht so geil ist, da ständig den Setter erst für aufzurufen).

Hat der Setter diese Prüfung in deiner Delphi-Version nicht?

Danke, Redeemer.
Ja, bei mir wird das im Setter nicht geprüft.
Bei mir (Delphi XE2) sieht der Setter so aus:
Delphi-Quellcode:
procedure TCustomListBox.SetSelected(Index: Integer; Value: Boolean);
begin
  if FMultiSelect then
  begin
    if SendMessage(Handle, LB_SETSEL, WPARAM(Value), Index) = LB_ERR then
      raise EListError.CreateResFmt({$IFNDEF CLR}@{$ENDIF}SListIndexError, [Index]);
  end
  else
    if Value then
    begin
      if SendMessage(Handle, LB_SETCURSEL, Index, 0) = LB_ERR then
        raise EListError.CreateResFmt({$IFNDEF CLR}@{$ENDIF}SListIndexError, [Index])
    end
    else
      SendMessage(Handle, LB_SETCURSEL, WPARAM(-1), 0);
end;
Aber wenn das in neueren Versionen geprüft wird, erübrigt sich ja die Frage nach einem Bug-Report.


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:54 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-2025 by Thomas Breitkreuz