Обсуждение статьи "Применение контейнеров для компоновки графического интерфейса: класс CGrid"

 

Опубликована статья Применение контейнеров для компоновки графического интерфейса: класс CGrid:

В данной статье описан альтернативный метод создания графического интерфейса на основе компоновки и контейнеров при помощи менеджера компоновки — класса CGrid. Класс CGrid представляет собой вспомогательный элемент управления, который действует как контейнер для других контейнеров и элементов управления с применением табличной компоновки.

Класс CGrid является менеджером компоновки, используемым в процессе дизайна графического интерфейса для диалоговых окон в MetaTrader. Он принадлежит к пользовательским классам-контейнерам, которые можно использовать в дизайне графического интерфейса, не полагаясь при этом на абсолютное расположение.

Настоятельно рекомендуем ознакомиться со статьей о классе CBox, прежде чем приступать к понятиям, которые рассматриваются в этой статье.

3. Класс CGrid

Класс CGrid создает контейнер для одного или нескольких элементов управления графического интерфейса и представляет их в табличном виде. Пример компоновки с использованием экземпляра класса CGrid продемонстрирован на следующей иллюстрации:

Компоновка CGrid

Рисунок 1. Табличная компоновка

Использование этого класса отличается удобством, особенно если элементы управления, которые необходимо добавить в таблицу, имеют идентичные размеры, это может быть, например, набор кнопок или полей ввода в клиентской области.

В примере выше изображена таблица размером 4x4 (4 столбца и 4 строки). Однако мы попытаемся создать класс, который сможет вместить в себя любое количество строк и столбцов в таблице.

Автор: Enrico Lambino

 

Отличная работа, как всегда, Энрико.

Я пытался, но не смог, разместить два поля CEdit одно за другим без какого-либо расстояния (фиксированное позиционирование) - но, похоже, класс только автоматически позиционирует по стилю макета.

Можно ли это сделать? Например, я хочу, чтобы имя поля и значение были такими:

Всего заказов: 3

, используя два CEdit'а, но размещая их один за другим?

Спасибо

 
Amir Yacoby:

Отличная работа, как всегда, Энрико.

Я пытался, но не смог, разместить два поля CEdit одно за другим без какого-либо расстояния (фиксированное позиционирование) - но, похоже, класс только автоматически позиционирует по стилю макета.

Можно ли это сделать? Например, я хочу, чтобы имя поля и значение были такими:

Всего заказов: 3

, используя два CEdit'а, но размещая их один за другим?

Спасибо

Пожалуйста.

Грид принимает только один компонент на ячейку. Если вы хотите разместить более одного элемента управления на одной ячейке, вам следует вложить их в CBox или CGrid.

Другим вариантом может быть расширение CGrid(tk) или CBox, чтобы вы могли напрямую указывать, какие элементы управления должны использовать фиксированное позиционирование, а какие - стили компоновки.

 

При компиляции "Grid Sample.mq5" возникает ошибка:

'm_client_area' - private member access error   GridSample.mqh  78      60
'm_client_area' - private member access error   GridSample.mqh  78      91

Ошибки

 
Karputov Vladimir:

При компиляции "Grid Sample.mq5" возникает ошибка:

Видимо, язык был обновлен. Раньше можно было так вызывать суперкласс. Но теперь, как я вижу, можно вызывать функции ClientAreaWidth и ClientAreaHeight для экземпляров CDialog и его наследников. Код:

m_main.Create(chart,name+"main",subwin,0,0,ClientAreaWidth(),ClientAreaHeight())

будет эквивалентным утверждением.