![]() |
"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:
Besser wäre es so:
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;
Delphi-Quellcode:
Fragen:
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; 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. |
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? |
AW: "Bug" in TCustomListBox.ClearSelection
Zitat:
Ja, bei mir wird das im Setter nicht geprüft. Bei mir (Delphi XE2) sieht der Setter so aus:
Delphi-Quellcode:
Aber wenn das in neueren Versionen geprüft wird, erübrigt sich ja die Frage nach einem Bug-Report.
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; |
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