问题描述
我遇到了一个问题,即在我的应用程序中的 TListBox
中的项目选择不正确,表单中有一个 HorzScrollBox
.表单上有两个(或更多)TListBox
.它们彼此远离放置,因此它们的绝对左坐标差大于当前设备屏幕宽度的宽度.错误出现在以下用户操作序列中.
I have met an issue of unproper selection of items in TListBox
in my application with a HorzScrollBox
in the form. The form has two (or more) TListBox
on it. They are placed away from each other so that their absolute left coordinates difference is more than the width of the current device screen width. The error appears in the following sequence of user actions.
- 从左侧选择一个项目
TListBox
- HorzScrollBox 向右滚动,第二个
TListBox
对用户可见,而左边的 - 不可见. - HorzScrollBox 向左滚动.
- 从左侧
TListBox
中选择了一个新项目.
- An item is selected from the left
TListBox
- The HorzScrollBox is scrolled to the right and the second
TListBox
becomes visible to user and the left one - invisible. - The HorzScrollBox is scrolled back to the left.
- An new item is selected from the left
TListBox
.
我们得到以下图片:新项目被选中,但即使我们上下滚动框,选择仍然绘制在先前选择的项目的位置上.
We get the following picture:The new item is selected but the selection stays painted over the position of the previously selected item even if we scroll the box up and down.
可以通过非常简单的方式重现该错误.
It is possible to reproduce the bug in a very simple way.
- 创建一个新的 Grid MetropolisUI 应用程序.
- 将左侧标准
TListBox
替换为新的(会更快). - 将表单的宽度设置为大于屏幕宽度
- 将第二个新的
TListBox
放在HorzScrollBox
内,这样左右TListboxes
不会同时出现,并且选择只有在HorzScrollBox
滚动后才能使用项目. - 从任何来源(例如两个
TPrototypeBindSource
)填充它们并将创建的LinkFieldControlToField
的ListItemStyle
属性设置为MetropolisUI.
Create a new Grid MetropolisUI Application.
Replace the left standard
TListBox
with a new one (it will be faster).Set the width of the form larger then your screen width
Place the second new
TListBox
inside theHorzScrollBox
in such a way so that left and rightTListboxes
will not be seen simultaneously and selection of items is possible only after scrolling of theHorzScrollBox
.Populate them from any sources (ex. two
TPrototypeBindSource
) and set theListItemStyle
properties of createdLinkFieldControlToField
toMetropolisUI
.
完成.当您运行应用程序时,您会遇到问题.仅当您滚动
HorzScrollBox
时才会出现该错误,因此当您选择第一个中的项目时看不到第二个 ListBox
.否则,项目会被正确选择(即使您滚动 HorzScrollBox
).这是表单的资源(除了样式的二进制文件,它需要存在才能重现错误).
Done. When you run the application you get the issue. The bug appears only when you scroll the
HorzScrollBox
so that you do not see the second ListBox
when you select an item in the first one. Otherwise the items are selected properly (even if you scroll the HorzScrollBox
).Here is the resource of the form (except the binary of the style, it needs to be present to reproduce the bug).
object GridViewForm: TGridViewForm
Left = 0
Top = 0
Caption = 'Grid Form'
ClientHeight = 946
ClientWidth = 2600
StyleBook = StyleBook2
FormFactor.Width = 1280
FormFactor.Height = 1024
FormFactor.Devices = [dkDesktop]
FormFamily = 'Main'
FullScreen = True
OnMouseUp = FormMouseUp
Touch.InteractiveGestures = [igPan]
OnGesture = FormGesture
DesignerMobile = False
DesignerWidth = 0
DesignerHeight = 0
DesignerDeviceName = ''
DesignerOrientation = 0
DesignerOSVersion = ''
object MainLayout: TLayout
Align = alContents
Height = 921.000000000000000000
Margins.Top = 25.000000000000000000
Width = 2600.000000000000000000
object HorzScrollBox1: THorzScrollBox
Align = alClient
Height = 921.000000000000000000
TabOrder = 0
Width = 2600.000000000000000000
object GroupLayout1: TLayout
Align = alLeft
Anchors = [akLeft, akTop]
Height = 905.000000000000000000
Margins.Left = 110.000000000000000000
Position.X = 110.000000000000000000
Width = 540.000000000000000000
object ListBox4: TListBox
Align = alClient
Height = 905.000000000000000000
StyleLookup = 'collectionlistbox'
TabOrder = 0
Width = 540.000000000000000000
DefaultItemStyles.ItemStyle = ''
DefaultItemStyles.GroupHeaderStyle = ''
DefaultItemStyles.GroupFooterStyle = ''
end
end
object GroupLayout2: TLayout
Align = alLeft
Anchors = [akLeft, akTop]
Height = 905.000000000000000000
Margins.Left = 40.000000000000000000
Position.X = 690.000000000000000000
Width = 1225.000000000000000000
end
object Layout1: TLayout
Align = alLeft
Anchors = [akLeft, akTop]
Height = 905.000000000000000000
Margins.Left = 40.000000000000000000
Margins.Right = 100.000000000000000000
Position.X = 1955.000000000000000000
Width = 660.000000000000000000
object Label1: TLabel
Align = alTop
AutoSize = True
Height = 40.000000000000000000
Margins.Left = 10.000000000000000000
Margins.Bottom = 5.000000000000000000
Position.X = 10.000000000000000000
StyleLookup = 'pagesubheaderlabel'
Text = 'Group Title: 4'
Width = 165.000000000000000000
WordWrap = False
end
object ListBox1: TListBox
Align = alClient
Height = 855.000000000000000000
StyleLookup = 'collectionlistbox'
TabOrder = 1
Width = 660.000000000000000000
DefaultItemStyles.ItemStyle = ''
DefaultItemStyles.GroupHeaderStyle = ''
DefaultItemStyles.GroupFooterStyle = ''
end
end
end
end
object StyleBook2: TStyleBook
Left = 632
Top = 544
ResourcesBin = {...}
end
object PrototypeBindSource1: TPrototypeBindSource
AutoActivate = True
AutoPost = False
FieldDefs = <
item
Name = 'ContactBitmapL1'
FieldType = ftBitmap
Generator = 'ContactBitmapsL'
ReadOnly = False
end
item
Name = 'ContactName1'
Generator = 'ContactNames'
ReadOnly = False
end
item
Name = 'IntField1'
FieldType = ftInteger
Generator = 'Integers'
ReadOnly = False
end>
ScopeMappings = <>
Left = 1288
Top = 456
end
object BindingsList1: TBindingsList
Methods = <>
OutputConverters = <>
Left = 20
Top = 5
object LinkFillControlToField1: TLinkFillControlToField
Category = 'Quick Bindings'
Control = ListBox4
Track = True
FillDataSource = PrototypeBindSource1
FillDisplayFieldName = 'ContactName1'
AutoFill = True
BufferCount = -1
AutoBufferCount = False
ListItemStyle = 'MetropolisUI'
FillExpressions = <
item
SourceMemberName = 'ContactBitmapL1'
ControlMemberName = 'Icon'
end
item
SourceMemberName = 'IntField1'
ControlMemberName = 'SubTitle'
end>
FillHeaderExpressions = <>
FillBreakGroups = <>
end
object LinkFillControlToField2: TLinkFillControlToField
Category = 'Quick Bindings'
Control = ListBox1
Track = True
FillDataSource = PrototypeBindSource2
FillDisplayFieldName = 'ContactName1'
AutoFill = True
BufferCount = -1
AutoBufferCount = False
ListItemStyle = 'MetropolisUI'
FillExpressions = <
item
SourceMemberName = 'FloatField1'
ControlMemberName = 'SubTitle'
end
item
SourceMemberName = 'ContactBitmap1'
ControlMemberName = 'Icon'
end>
FillHeaderExpressions = <>
FillBreakGroups = <>
end
end
object PrototypeBindSource2: TPrototypeBindSource
AutoActivate = True
AutoPost = False
FieldDefs = <
item
Name = 'ContactBitmap1'
FieldType = ftBitmap
Generator = 'ContactBitmaps'
ReadOnly = False
end
item
Name = 'ContactName1'
Generator = 'ContactNames'
ReadOnly = False
end
item
Name = 'FloatField1'
FieldType = ftSingle
Generator = 'Floats'
ReadOnly = False
end>
ScopeMappings = <>
Left = 1232
Top = 448
end
end
有人对如何应对有任何建议吗?
Does anyone have any suggestions how to cope with it?
推荐答案
我通过设置
ListBox1.CanFocus := false;
找到了答案.在某些情况下(实际上)错误会再次出现.
I found an answer by setting
ListBox1.CanFocus := false;
. In certain cases (rearly) the bug reoccurs.
这篇关于FMX TListbox 中的项目选择不正确(Grid Metropolis UI)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!