Почему элементы управления не охватывают несколько столбцов или строк в приложении Android FireMonkey?

У меня есть приложение FireMonkey с GridPanelLayout, выровненным по клиенту. У него есть 6 столбцов и 16 строк. Элементы управления включают глифы, правки и кнопки. TEdits охватывают несколько столбцов, а TButtons охватывают как несколько столбцов, так и строки. В настоящее время все элементы управления выровнены с клиентом.

Когда я компилирую и запускаю на Windows, все выглядит и работает как ожидалось. Однако на устройствах Android (я пробовал два, Android 6.0.1 и Amazon FireOS) ни один из элементов управления не охватывает более одного столбца или строки. У каждого из них всего одна клетка. Вместо охвата 6 столбцов TEdits занимает всего 1 столбец; вместо того, чтобы охватывать 2 столбца и 2 строки, кнопки TB также охватывают 1 столбец и 1 строку.

Почему элементы управления не занимают несколько столбцов или строк на Android?

1 ответ

Решение

И VCL, и FireMonkey не могут сохранить ControlCollection из TGridPanel / TGridPanelLayout правильно, когда фрейм / форма получает подклассы или фрейм помещается в другой фрейм / форму.

Эта ошибка относится как к VCL, так и к FMX. Это было сообщено старому КК еще в 2011 году, но никогда не было исправлено (примеры: # 92298, # 123225).

Пример: бросить TGridPanelLayout с TButton в этом на TFrame:

object GridPanelLayout1: TGridPanelLayout
    (...)   
    ControlCollection = <
      item
        Column = 0
        ColumnSpan = 2
        Control = Button1
        Row = 0
        RowSpan = 2
      end>
    object Button1: TButton
      Align = Client
      Size.Width = 421.000000000000000000
      Size.Height = 257.000000000000000000
      Size.PlatformDefault = False
      TabOrder = 0
      Text = 'Button1'
    end
end 

При последующем создании подкласса фрейма в среде IDE сохраняется много избыточных свойств для компонентов, унаследованных от базового класса. Обычно после первого нажатия F9 ColumnSpan а также RowSpan свойства удаляются без причины. На подклассе это выглядит примерно так:

inherited GridPanelLayout1: TGridPanelLayout
    (...)
    ControlCollection = <
        item
            Column = 0
            Control = Button1
            Row = 0
        end>
    inherited Button1: TButton
        Size.Width = 210.500000000000000000
        Size.Height = 128.500000000000000000
    end
end

Обратите внимание, как изменилось свойство Size. Так же ControlCollection элементы переопределены, но ColumnSpan а также RowSpan свойства отсутствуют полностью. Это причина.

Эта ошибка относится к вам, потому что в FMX специализированные представления для конкретных платформ реализованы как подклассы основного представления.

Система контроля версий помогает обнаруживать, когда избыточные свойства проникают в файлы DFM. В приведенном выше примере законно полностью удалить inherited GridPanelLayout1 блокировать, когда ваш подкласс не меняет его. Более того, я советую вам создать свой проект без открытого окна дизайнера форм, так как это часто приводит к повреждению файла DFM и повторному добавлению избыточных свойств при каждой возможности.

Другие вопросы по тегам