:: Visual Foxpro, Foxpro for DOS
Определение собственного класса грида - ошибка определения
stok_from_perm

Сообщений: 2
Дата регистрации: 02.06.2023
Всем доброго времени суток!

Возникла проблема. С VFP работаю давно, но раньше такого вопроса не возникало, сейчас же была поставлена некая задача, в рамках которой потребовалось определить собственный класс грида. Не визуальный класс, который создаётся без всяких проблем, сохраняется как .VCX/VCT, добавляется в проект и там используется в нужных местах, это всем известно и это работает.

А вот именно собственное определение. Начало такое:

**************************************************
*-- Class:        sgrid (d:\vfp_prg\addon\fields\sgrid.vcx)

DEFINE CLASS Sgrd AS grid
ColumnCount = 1
DeleteMark = .F.
HeaderHeight = 25
Height = 200
ReadOnly = .T.
RecordMark = .F.
RowHeight = 21
Width = 320
Name = "sgrd"
Column1.ReadOnly = .T.
Column1.Name = "Column1"

ADD OBJECT sgrd.column1.header1 AS header WITH Caption = "Header1", Name = "Header1"
ADD OBJECT Sgrd.column1.text1 AS textbox WITH BorderStyle = 0, Margin = 0, ForeColor = RGB(0,0,0), BackColor = RGB(255,255,255), Name = "Text1"

PROCEDURE Init
...
ну и так далее, все нужные процедуры и прочее.
Определение этого класса в числе прочих включается в текст программы, в которой создаётся форма, на ней определяются другие объекты (командой ADD OBJECT), и объект Sgrd, определённый этим классом. Эта программа находится, естественно, в переменной Proc_Main_Form. Далее, вызывается стандартная VFP команда:

ExecScript(Proc_Main_Form)
И вот при исполнении возникают следующие ошибки:

ADD OBJECT sgrd.column1.header1 AS header WITH Caption = "Header1", Name = "Header1"
Error in line 358: Syntax error.
ADD OBJECT Sgrd.column1.text1 AS textbox WITH BorderStyle = 0, Margin = 0, ForeColor = RGB(0,0,0), BackColor = RGB(255,255,255), Name = "Text1"
Error in line 359: Syntax error.

Т.е., стандартные VFPшные определения записаны неправильно !

В чём может быть дело?



Исправлено 3 раз(а). Последнее : stok_from_perm, 02.06.23 14:15
Ratings: 0 negative/0 positive
Re: Определение собственного класса грида - ошибка определения
PaulWist

Сообщений: 14618
Дата регистрации: 01.04.2004
Посмотри пример forum.foxclub.ru


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive
Re: Определение собственного класса грида - ошибка определения
stok_from_perm

Сообщений: 2
Дата регистрации: 02.06.2023
Спасибо, посмотрел.
То есть, не следует добавлять элементы грида командами ADD OBJECT sgrd.column1.header1 ... и ADD OBJECT Sgrd.column1.text1 ..., а определить количество колонок и их свойства в методе INIT.
В самом деле, сработало.

Правда, вопрос всё равно остался - типовое определение всё ж таки не работает. Я ведь этот текст взял не с потолка, а воспользовался генерацией текста в браузере классов - кнопкой "View Class Code", она там именно такое выдаёт.
Или генерация текста объекта в VFP, а данном случае, получается не корректна!

В любом случае, за подсказку спасибо !
Ratings: 0 negative/0 positive
Re: Определение собственного класса грида - ошибка определения
PaulWist

Сообщений: 14618
Дата регистрации: 01.04.2004
Да, кодом визарда пользоваться напрямую не стоит.


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive
Re: Определение собственного класса грида - ошибка определения
akvvohinc
Автор

Сообщений: 4219
Откуда: Москва
Дата регистрации: 11.11.2008
stok_from_perm
В чём может быть дело?
Здесь несколько моментов:
1) Код, создаваемый визардом, в принципе не для того, чтобы его просто брать и вставлять в программу (его скорее можно назвать "псевдо-кодом");
2) Вы, думая, что визард создает рабочий код, не ознакомились с опцией (clause) ADD OBJECT в должной степени.

Например, вас не удивило, что в коде нет команды для создания колонки, но приведён "код" создания Хедера и Текстбокса.
В действительности же уже после выполнения команды ColumnCount = 1 грид будет иметь объект Column1 с Header1 и Text1 (по умолчанию).

Ну, а ошибка синтаксиса - она и есть ошибка синтаксиса - посмотрите в Help и примерах, что может быть задано в качестве ObjectName в опции ADD OBJECT, и вы поймёте, что писать Sgrd.column1.text1 здесь нельзя.
Но даже если вы напишете там некую переменную или свойство, содержащую "Sgrd.column1.text1", то это лишь избавит вас от Syntax Error при компиляции, но вы получите ошибку при выполнении.

В общем, (для простоты) можете считать что после ADD OBJECT можно задать просто имя нового (дочернего) объекта, который будет создан в родительском объекте (его имя уже известно - задано в DEFINE CLASS и не может быть указано в опции ADD OBJECT).
При желании имя нового объекта можно заключить в кавычки.

А если его имя находится в какой-то переменной или свойстве, то их имена надо дополнительно заключить в круглые скобки:
objectname = [MyNewObject]
ADD OBJECT (this.objectname) AS ... && будет создан объект с именем MyNewObject

Опция ADD OBJECT не может создать Хедер колонки напрямую классе грида (Хедер не может иметь родителем Грид)
Но вы можете создавать колонки в гриде на основе как базового класса Column, так и своего собственного - при этом объекты, подчиненные создаваемой колонке, будут созданы автоматически (при базовом Column автоматически создадутся и объекты Header1 и Text1).
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 27 leonid  (Гостей: 26)

© 2000-2024 Fox Club 
Яндекс.Метрика