Grid

Как в дизайнере вставить объект в столбец Grid

Вопрос

Как в дизайнере формы я могу вставить нужный мне объект (ComboBox, CheckBox, Image, CommandButton, свой класс и т.п.) в столбец Grid?

Ответ

  • Добавляете на форму объект Grid
  • Устанавливаете у него свойство ColumnCount больше нуля
  • Правой клавишей мыши щелкаете на Grid и выбираете пункт Edit. В старших версиях FoxPro в этот режим можно перейти, нажав и удерживая клавишу Ctrl щелкнув по Grid левой клавишей мыши
  • В ToolBar с именем Form Controls щелкните левой клавишей мыши по нужному объекту
  • Левой клавишей мыши щелкаете на нужном столбце в любом месте под заголовком

Все, нужный объект вставлен. Убедится в это можно в окне Poperties. В раскрывающемся списке в соответствующем столбце Grid кроме объекта Text1 появиться и имя вставленного Вами объекта с добавлением окончания 1.

Чтобы именно вставленный объект отображался в столбце, необходимо убедится, что свойство CurrentControl этого столбца содержит имя вставленного объекта.

А чтобы вставленный Вами объект отображался не только в текущей строке Grid, но и во всех остальных строках необходимо для того же столбца сделать дополнительную настройку

Sparse = .F.

Можно также использовать другой метод вставки

  • Добавляете на форму объект Grid
  • Устанавливаете у него свойство ColumnCount больше нуля
  • Добавьте экземпляр любого нужного Вам класса, который Вы хотите вставить в столбец Grid непосредственно на форму вне Grid
  • Выделите добавленный объект (щелкнув по нему левой клавишей мыши) и скопируйте его в буфер обмена (комбинация клавиш Ctrl+C или пункт системного меню Edit, подпункт Copy)
  • Правой клавишей мыши щелкаете на Grid и выбираете пункт Edit. В старших версиях FoxPro в этот режим можно перейти, нажав и удерживая клавишу Ctrl щелкнув по Grid левой клавишей мыши
  • Левой клавишей мыши щелкаете на нужном столбце в любом месте под заголовком
  • Сделайте вставку из буфера обмена (комбинация клавиш Ctrl+V или пункт системного меню Edit, подпункт Paste)

Можно удалить уже не нужный объект Text1 из столбца Grid следующим образом:

  • В окне Properties в раскрывающемся списке выберите объект, который хотите удалить
  • Один раз щелкните левой клавишей мыши по любому месту формы. Лучше щелкнуть по заголовку формы, хотя это не принципиально.
  • Нажмите клавишу Delete на клавиатуре
Пропадают настройки Grid, события столбцов, заголовков, ячеек

Проблема
В дизайнере формы были сделаны настройки Grid, написана собственная обработка события Header.Click() или Column.Text1.Click(). Однако при выполнении программы все эти настройки пропадают.

Причина
Это происходит после переоткрытия источника данных для Grid. Того, что указано в качестве Grid.RecordSource. Т.е. эта таблица была закрыта и открыта заново. Как правило, это является следствием использования команды PACK, но могут быть и более сложные варианты.

Решение
Прежде всего, следует заметить, что использование команды PACK в активной форме - это порочная практика. Физическое удаление записей следует вынести в отдельную служебную процедуру, периодически запускаемую администратором.

Тем не менее, если подобная задача все-таки необходима, то перед переоткрытием (или заменой) источника данных для Grid его следует сбросить.

* Сброс источника данных Grid
ThisForm.Grid1.RecordSource = ""
* Выполнение переоткрытия таблицы, модификация данных, выбор другой таблицы
...
* Восстановление источника данных Grid
ThisForm.Grid1.RecordSource = "Table"
ThisForm.Grid1.Column1.ControlSource = "Table.Field1"
ThisForm.Grid1.Column2.ControlSource = "Table.Field2"
ThisForm.Grid1.Column3.ControlSource = "Table.Field3"

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

VFP грид, часть I

Почему настройки ячейки видны только в активной ячейке
Вопрос
Я сделал настройки ячейки Grid (объекта Text1 в столбце): формат, выравнивание, отображение NULL и т.п. Однако эти настройки действуют только на текущую (активную) ячейку Grid. Как мне распространить действие этих настроек на все ячейки того же столбца?

Я вставили в Grid вместо стандартного объекта Text1 какой-либо свой объект (например, ComboBox или свой TextBox). Однако мой объект виден только в текущей (активной) ячейке Grid. Как мне заставить отобразиться мой объект во всех ячейках того же столбца?


Ответ

Необходимо сделать для соответствующего столбца настройку
ThisForm.Grid1.Column1.Sparce = .F.
Как выделить всю активную строку Grid
Вопрос
При перемещении по Grid выделяется только активная ячейка. Как выделить цветом все ячейки активной строки Grid ?


Ответ

Для версии до Visual FoxPro 7 включительно.
  1. Необходимо создать дополнительное свойство формы ThisForm.nRecno. Можно сделать собственный класс Grid и создать этой свойство у собственно класса. И присвоить этому свойству числовое значение, например nRecno=1

    Новое свойство можно добавить через пункт меню Form (для класса Class), подпункт New Property или Edit Property/Method.

  2. В событии Grid.Init пишем следующий код
IF RECNO(This.RecordSource)#0 
    THIS.SetAll("DynamicBackColor",;
        "IIF(RECNO(This.RecordSource)=ThisForm.nRecno,RGB(255,255,0),RGB(255,255,255))",;
        "COLUMN") 
ENDIF

Если свойство nRecno создано непосредственно в классе Grid, то, разумеется, следует вместо ThisForm.nRecno писать This.nRecno

3. В событии Grid.AfterRowColChange пишем следующий код

LPARAMETERS nColIndex
ThisForm.nRecno = RECNO(This.RecordSource) 
This.Refresh()
***Если свойство nRecno создано непосредственно в классе Grid, то, разумеется, следует вместо ThisForm.nRecno писать This.nRecno
Все. Запускайте и пользуйтесь.

Замечание

Если в качестве источника данных для Grid используется НЕ алиас, т.е. Grid.RecordSourceType<>1 - Alias, то необходимо ввести еще одно свойство, которое будет содержать имя алиаса из которого следует считывать значение Recno(). Или же просто явно прописывать имя алиаса непосредственно в коде.



Для версии от Visual FoxPro 8 и выше.

Начиная с версии Visual FoxPro 8 ничего из приведенного выше писать не надо. Достаточно воспользоваться новыми свойствами Grid.

ThisForm.Grid.HighlightStyle = 2

Если полученный цвет Вас не устраивает, то используйте свойства

ThisForm.Grid.HighlightBackColor - цвет фона
ThisForm.Grid.HighlightForeColor - цвет шрифта

В принципе, того же эффекта можно добиться, используя другое свойство

ThisForm.Grid.AllowCellSelection = .F.

Однако следует понимать, что если свойство HighlightStyle отвечает только за способ (стиль) выделения цветом, то свойство AllowCellSelection отвечает также и за возможность выбора отдельной ячейки.

Замечание

Если какая-либо колонка Grid имеет свойство Sparce = .F., то на нее не распространяется выделение цветом всей строки. В этом случае придется использовать старый способ для версий до Visual FoxPro 7 включительно, описанный выше.
Можно ли указать массив в качестве источника для Grid

Вопрос
Можно ли в качестве источника данных для Grid указать массив?


Ответ

Нет. Напрямую это невозможно. Источником данных для Grid может быть только и исключительно таблица (курсор и View - это временные таблицы)

Однако можно, используя команду CREATE CURSOR, создать временную таблицу и при помощи одной из команд
APPEND FROM ARRAY ...
***или
INSERT INTO ... FROM ARRAY ...

Наполнить эту временную таблицу данными из массива. Затем указать эту временную таблицу в качестве источника для Grid.
//////////////// ///////////////
Авторизация
*
*
Генерация пароля