2015-07-30 1 views
1

J'ai rencontré un problème de sélection impropre d'éléments dans TListBox dans mon application avec un HorzScrollBox dans le formulaire. Le formulaire a deux (ou plus) TListBox dessus. Ils sont placés à l'écart l'un de l'autre de sorte que leur différence de coordonnées absolues à gauche soit supérieure à la largeur de la largeur d'écran actuelle du dispositif. L'erreur apparaît dans la séquence suivante d'actions de l'utilisateur.Sélection incorrecte d'éléments dans une FMistbox FMX (Grid Metropolis UI)

  1. Un élément est choisi dans le TListBox
  2. gauche Le HorzScrollBox défile vers la droite et la deuxième TListBox devient visible à l'utilisateur et celui à gauche - invisible.
  3. La HorzScrollBox défile vers la gauche.
  4. Un nouvel élément est sélectionné à partir de la gauche TListBox.

Nous obtenons l'image suivante: Le nouvel élément est sélectionné, mais la sélection des séjours repeintes la position de l'élément sélectionné précédemment, même si nous faisons défiler la boîte de haut en bas. enter image description here

Il est possible de reproduire le bug de manière très simple.

  1. Créer une nouvelle application Grid MetropolisUI.
  2. Remplacez le TListBox standard par un nouveau (il sera plus rapide).
  3. Définissez la largeur de la forme plus grande que la largeur de votre écran
  4. Placez le deuxième nouveau TListBox à l'intérieur du HorzScrollBox de telle façon à ce que gauche et à droite TListboxes ne seront pas vus en même temps et la sélection des articles est possible seulement après le défilement de le HorzScrollBox.
  5. Remplissez-les à partir de n'importe quelle source (par exemple deux TPrototypeBindSource) et définissez les propriétés ListItemStyle de LinkFieldControlToField sur MetropolisUI.

Terminé. Lorsque vous exécutez l'application, vous obtenez le problème. Le bogue n'apparaît que lorsque vous faites défiler le HorzScrollBox de sorte que vous ne voyez pas le second ListBox lorsque vous sélectionnez un élément dans le premier. Sinon, les éléments sont sélectionnés correctement (même si vous faites défiler le HorzScrollBox). Voici la ressource du formulaire (sauf le binaire du style, il doit être présent pour reproduire le bogue).

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 

Est-ce que quelqu'un a des suggestions comment faire face?

Répondre

0

J'ai trouvé une réponse en réglant ListBox1.CanFocus := false;. Dans certains cas (à l'arrière), le bug réapparaît.