:: Архив конференции по VFP до 2005 года
Как объявить свойство для грида в VCX
Бураков Сергей
Автор

Сообщений: 280
Откуда: Calgary
Дата регистрации: 07.02.2005
В .PRG все делалось просто, присваивал значения при объявлении класса.
А как быть при визуальном программировании?
Ratings: 0 negative/0 positive
Re: Как объявить свойство для грида в VCX
AleksM

Сообщений: 17881
Дата регистрации: 11.11.2003
Вызови класс на редактирование, поменяй что надо и сохрани.
Или ты о другом?




------------------
Лучше переесть, чем недоспать.
Не спеши, а то успеешь.
Ratings: 0 negative/0 positive
Re: Как объявить свойство для грида в VCX
Бураков Сергей
Автор

Сообщений: 280
Откуда: Calgary
Дата регистрации: 07.02.2005
А где вводить свойства, если в окне FORMS->NEW PROPERTIES, то вводятся свойства формы, а не грида?
Ratings: 0 negative/0 positive
Re: Как объявить свойство для грида в VCX
AleksM

Сообщений: 17881
Дата регистрации: 11.11.2003
Э, батенька так не годиться. На основе грида, создай свой класс (закладка Classes) и вот его уже вставляй в форму. А нужно что к собственному классу прибавить/убавить/изменить, опять же меняешь все на закладке Classes.




------------------
Лучше переесть, чем недоспать.
Не спеши, а то успеешь.
Ratings: 0 negative/0 positive
Re: Как объявить свойство для грида в VCX
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Hi, Сергей!

Дело в том, что можно задавать новые свойства и методы только для КЛАССА -
соответственно ни в prg, ни в vcx ты не сможешь описывая класс формы
добавить свойство или метод её члену (гриду в частности). Соответственно
надо завести класс грида, как и советует AleksM и уж там заводить свойства и
методы.
А вот присвоить какие-то значения свойствам (уже имеющимся конечно!)
member-объектов (или переопределить их методы/обработчики событий) - можно
на уровне класса-контейнера. Причём для prg уровень вложения ограничивается
1-цей (т.е. скажем из связки Форма-грид-колонка-текстбокс можно лишь для
первых двух уровней задать свойства/методы, для колонки уже нельзя -
максимум - это в Init класса присваивать значения свойствам, но это конечно
сильно ограниченно) А вот для vcx уровень вложения теоретически никак не
ограничен (ну можно конечно сказать что ограничен глубиной вложенности
вызовов процедур, но и то не факт) - т.е. можно в одном классе задать и
свойства для грида, и для колонок и для текстбоксов в них... Это вызывает
порой трудности - т.к. не все понимают, что невозможно сделать простой
трансформации vcx в prg - как раз по этой причине - то что в vcx 1 класс в
prg может вылиться в целую кучу классов.




------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Как объявить свойство для грида в VCX
Rustam

Сообщений: 235
Откуда: Иркутск
Дата регистрации: 14.10.2000
Если создать свой класс потомок не очень хочется, можете пользоваться методом AddProperty
Желательно добавить новое свойство в методе Init Gridа, хотя это необъязательно.
Удачи




------------------
Ratings: 0 negative/0 positive
Re: Как объявить свойство для грида в VCX
Бураков Сергей
Автор

Сообщений: 280
Откуда: Calgary
Дата регистрации: 07.02.2005
Спасибо, ребята. Как-то сбивает с толку то, что в VCX можно, в отличие от PRG , не создавая нового класса, описывать обработку событий, поэтому казалось, что и свойства так же просто можно добавлять. Как только доберусь до работы, сразу же проверю, как работает Addproperty в Init.
Ratings: 0 negative/0 positive
Re: Как объявить свойство для грида в VCX
Aijik

Сообщений: 2145
Откуда: Ростов-на-Дону
Дата регистрации: 08.01.2002
Igor Korolyov


Цитата:
Дело в том, что можно задавать новые свойства и методы только для КЛАССА -
соответственно ни в prg, ни в vcx ты не сможешь описывая класс формы
добавить свойство или метод её члену (гриду в частности).

Для PRG сможет
Для VCX в дизайн-тайме члену тоже можно добавить свойсва и методы, но только программно (ASELOBJ/AddProperty/WriteMethod), и такие свойства и методы даже сохраняются в структуре SCX/VCX если посмотреть поля Properties и Methods (хотя конечно же, для структуры SCX/VCX этого мало, для всех "индивидуальных" свойств/методов там дожна еще присутствовать запись в декларирующем поле Reserved3). Однако, впоследствии в рантайме ни один из этих "хакерозачатых" свойств и методов не работает, к тому же фокс постоянно пытается стереть такие свойства из структуры при следующем открытии формы/класса на редактирование. Для PRG же, напротив, нижеследующая конструкция явялется абсолютно рабочей:

oForm = CREATEOBJECT("MyForm")
oForm.Show(1)
DEFINE CLASS MyForm AS Form
Height = 300
ADD OBJECT MyGrid AS Grid WITH ;
ColumnCount =2, ;
BrandNewProperty = "ля-ля-ля" && !
ADD OBJECT MyCmd AS CommandButton WITH ;
Top = 250,;
Height = 30,;
Caption = "Click me!"
PROCEDURE MyGrid.BrandNewMethod && !
MessageBox(This.BrandNewProperty)
ENDPROC
PROCEDURE MyCmd.Click
ThisForm.MyGrid.BrandNewMethod()
ENDDEFINE

Понятия не имею с т.з. классического ООП багофича это или нет, но факт остается фактом...



Цитата:
Причём для prg уровень вложения ограничивается
1-цей (т.е. скажем из связки Форма-грид-колонка-текстбокс можно лишь для
первых двух уровней задать свойства/методы, для колонки уже нельзя -
Ты не прав. В общем случае ничем он не ограничивается. Вот пример из четырех вложенных друг в друга контейнеров, в последнем из которых сидит текстбокс. Для чистоты эксперимента форма унаследована целиком и именно в наследнице для свойства текстбокса прописывается портянка из вложений

oForm = CREATEOBJECT("MyForm1")
oForm.Show(1)
DEFINE CLASS MyForm1 AS MyForm
MyCnt1.MyCnt2.MyCnt3.MyCnt4.MyText.BackColor = 255 && работает
ENDDEFINE
DEFINE CLASS MyForm AS Form
ADD OBJECT MyCnt1 AS CntClass1
ENDDEFINE
DEFINE CLASS CntClass1 AS Container
ADD OBJECT MyCnt2 AS CntClass2
ENDDEFINE
DEFINE CLASS CntClass2 AS Container
ADD OBJECT MyCnt3 AS CntClass3
ENDDEFINE
DEFINE CLASS CntClass3 AS Container
ADD OBJECT MyCnt4 AS CntClass4
ENDDEFINE
DEFINE CLASS CntClass4 AS Container
ADD OBJECT MyText AS Textbox
ENDDEFINE

Тот же пример "из жизни гридов", который привел ты, касается только одного из частных случаев, а именно когда потроха колонки не описаны явно (т.е. когда фокс сам домысливает, а что же там должно быть). При этом, заметь, для мембера 3-го уровня (колонка) всё еще можно прописать свойства (ты же утверждаешь обратное), а вот дальше (текстбокс/хедер) уже облом:

CREATE CURSOR Test (Sys2015 C(10))
FOR i=1 TO 10
INSERT INTO Test VALUES (SYS(2015))
ENDFOR
LOCATE
oForm = CREATEOBJECT("MyForm1")
oForm.Show(1)
DEFINE CLASS MyForm1 AS MyForm
MyGrid.Column1.BackColor = 255 && работает
*!* MyGrid.Column1.Text1.BackColor = 16711680 && "Text1" не найден
*!* MyGrid.Column1.Header1.BackColor = 65280 && "Header1" не найден
ENDDEFINE
DEFINE CLASS MyForm AS Form
ADD OBJECT MyGrid AS Grid WITH ;
ColumnCount =2
ENDDEFINE


Если же начать описывать объекты явно, то проблемы с пропертями вложенных объектов у Column испаряются. Пример ниже: текстбокс явно описан в классе колонки, и поэтому ошибка с присвоением ему цвета из прошлого примера исчезла. Хедер же так и остался не описанным явно, поэтому на нем мы имеем ту же ошибку ("Header1 не найден"). Ошибка исчезнет только когда хедер также будет описан явно:

CREATE CURSOR Test (Sys2015 C(10))
FOR i=1 TO 10
INSERT INTO Test VALUES (SYS(2015))
ENDFOR
LOCATE
oForm = CREATEOBJECT("MyForm1")
oForm.Show(1)
DEFINE CLASS MyForm1 AS MyForm
MyGrid.Column1.BackColor = 255 && работает
MyGrid.Column1.Text1.BackColor = 16711680 && работает
*!* MyGrid.Column1.Header1.BackColor = 65280 && не работает, хедер явно не описан
ENDDEFINE
DEFINE CLASS MyForm AS Form
ADD OBJECT MyGrid AS MyGrid
ENDDEFINE
DEFINE CLASS MyGrid AS Grid
ADD OBJECT Column1 AS MyColumn
ENDDEFINE
DEFINE CLASS MyColumn AS Column
ADD OBJECT Text1 AS Textbox
ENDDEFINE
Ratings: 0 negative/0 positive
Re: Как объявить свойство для грида в VCX
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Hi, Aijik!

Ну насчёт описания НОВЫХ свойств для member-object в prg ты совершенно прав,
это я упустил из вида. Для всего-же прочего...
Цитата:
Вот пример из четырех вложенных друг в друга контейнеров, в последнем
из которых сидит текстбокс.
Посчитай сколько там классов? И описывается ли в ОДНОМ классе иерархия
вложенности >2 уровней... нет, ибо ПОКА фокс такого не поддерживает (хотя я
например не вижу никаких "идеологических" причин сдерживающих такое
дополнение синтаксиса ADD OBJECT).
Насчёт "задания свойств" через уровень - да оно работает, но как видишь не
совсем стабильно. Почему - тоже интуитивно понятно - очерёдность создания
member-объектов и очерёдность "присвоения свойств описанных в DEFINE CLASS"
видать входят в конфликт друг с другом - как раз в случае НЕЯВНО создаваемых
member-объектов - вот колонка успела создаться - может потому что
ColumnCount=2 отработал раньше чем MyGrid.Column1.BackColor = 255 может по
какой-то иной причине... Кстати интересно посмотреть на поведение при
ColumnCount = -1 - тогда грид тоже автоматом создаёт кучу объектов, но
видимо в несколько другой момент времени Аналогично наверное будет и с
методами member-объектов.
Но что самое печальное - я нигде не нашёл даже слабого описания того что и
как происходит "внутрях" фокса в процессе инстанциации объектов - когда
"можно" обращаться к подобным свойствам/объектам, а когда нет, когда можно
написать PROCEDURE Container1.Grid1.Column1.Header1.MyMethod ... а когда
нет.
Так что думаю не проиграет тот, кто ограничится самым простым,
документированным и прозрачно-понятным способом использования ООП в фоксе -
пускай это и приведёт к увеличению на порядок числа "простых" классов (я
почему-то думаю что создаваемый при работе vcx/scx конгломерат вложенных
member-объектов для ОДНОГО класса не сильно проще/меньше/лучше чем твои 5
КЛАССОВ в примере на вложенность).




------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Как объявить свойство для грида в VCX
Aijik

Сообщений: 2145
Откуда: Ростов-на-Дону
Дата регистрации: 08.01.2002
Мне тут подумалось, что в принципе присутствие записей текстбокса и хедера в дефолтном гриде все же оправдано. Базовый класс Column - по-умолчанию всё же пустой класс, без единого объекта, и автоматически подсовываемые фоксом textbox1 и header1 (последний так вообще удалить нельзя) все же формально добавляемые (хоть и не явно, хоть и автоматически) объекты, а потому в принципе их присуствие в структуре SCX/VCX дефолтного грида всё же объяснимо. Но в любом случае, общего смысла это не меняет, самый главный трабл не в этом, а в более серьёзном нарушении структуры - отсутствии записи для колонки
Ratings: 0 negative/0 positive


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

On-line: 8 (Гостей: 8)

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