作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想为 TFileListBox 创建一个新事件。我想知道用户何时选择不同的项目。
实现它的最佳方法是当用户按下鼠标按钮时调用该事件,如下所示:
procedure TMyFileList.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
VAR PrevItem: Integer;
begin
PrevItem:= ItemIndex; <---------- Problem here
inherited;
if (Count> 0)
AND ( PrevItem<> ItemIndex )
AND Assigned(FOnSelChaged)
then FOnSelChaged(Self, PrevItem);
end;
因此,假设第一个项目 (ItemIndex=0) 已被选择。当我按下鼠标按钮选择第二个项目时,我就进入了 MouseDown 过程。但这里的 ItemIndex 已经是 1 而不是 0。为什么?
最佳答案
TFileListBox
维护一个名为 FLastSel
的 protected 字段,这正是您所需要的。您的代码的另一个大问题是您假设只能通过鼠标更改选择。不要忘记键盘或程序修改。您正在寻找名为 Change
的虚拟方法。
所以,把它们放在一起,你可以像这样做你需要的事情:
TMyFileListBox = class(TFileListBox)
protected
procedure Change; override;
....
procedure TMyFileListBox.Change;
begin
if (Count>0) and (FLastSel<>ItemIndex) and Assigned(FOnSelChanged) then
FOnSelChanged(Self, FLastSel, ItemIndex);
inherited;
end;
在调用继承的 Change
方法之前,我们必须使用 FLastSel
,因为这是将 FLastSel
更改为等于当前选择。
procedure TFileListBox.Change;
begin
FLastSel := ItemIndex;
.... continues
关于delphi - 如何实现 TFileListBox 的 OnSelectionChanged 事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9438098/
我在 Windows 7 上使用 Delphi 7,并且有一个应用程序使用 TFileListBox 组件循环访问目录中的文件并将它们复制到备份目录。 我遇到了一些奇怪的行为,即 TFileListB
我想为 TFileListBox 创建一个新事件。我想知道用户何时选择不同的项目。 实现它的最佳方法是当用户按下鼠标按钮时调用该事件,如下所示: procedure TMyFileList.Mouse
我是一名优秀的程序员,十分优秀!