Гость
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / EditGroup / 10 сообщений из 10, страница 1 из 1
30.07.2003, 12:30
    #32222092
lnu
lnu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EditGroup
Как написать класс типа CommandGroup, но чтобы вместо кнопок при изменении нового свойства EditCount появлялись Эдиты?

Припустим создали новый класс (BaseClass='Container'), добавили свойство EditCount....
Что дальше?
...
Рейтинг: 0 / 0
30.07.2003, 13:11
    #32222211
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EditGroup
Ну лично я в таких случаях делаю класс на основе PageFrame со свойством Tabs=.F. (т.е. без визуального отображения закладок)

Т.е. действия примерно такие:

-) Создаешь класс на основе PageFrame из 2 страниц и устанавливаешь ему свойство Tabs=.F. (для лучшего визуального эффекта еще можно скрыть Border (толщина 0, тип - невидимый ))
-) На первой странице этого PageFrame кладешь набор кнопок
-) На второй - набор EditBox

Программное перключение между страницами PageFrame осуществляется изменением свойства ActvePage, т.е.

This.ActivePage=1 - открыть первую страницу
This.ActivePage=2 - открыть вторую страницу

Т.е. можно использовать значение стандартного свойства ActivePage как признак того, что именно открыто или нужно открыть. Хотя никто не мешает ввести для этой цели дополнительное свойство (можно с событием ASSIGN для немедленной реакции в случае изменения.)
...
Рейтинг: 0 / 0
30.07.2003, 13:15
    #32222219
Анатолий Широков
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EditGroup
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
**************************************************
* -- Class:        editboxgroup
 
* -- ParentClass:  container
 
* -- BaseClass:    container
 
*
DEFINE CLASS editboxgroup AS container


	Width =  200 
	Height =  200 
	itemcount =  0 
	Name =  "editboxgroup" 


	PROCEDURE Resize
		local lnItem, lcName, loControl, lnItemWidth, lnItemHeight

		with this

			if empty(.ItemCount)
				return
			endif

			lnItemWidth = .Width
			lnItemHeight = .Height/.ItemCount

			for lnItem =  1  to .ItemCount
				lcName =  "edt"  + alltrim(str(m.lnItem)) 
				loControl = evaluate( "this." +lcName)
				loControl.Move( 0 , (m.lnItem -  1 )*m.lnItemHeight, m.lnItemWidth, m.lnItemHeight)
			endfor

		endwith
	ENDPROC


	PROCEDURE Init
		local lnItem, lcName

		with this
			for lnItem =  1  to .ItemCount
				lcName =  "edt"  + alltrim(str(m.lnItem)) 
			    .AddObject(m.lcName,  "editbox" )
				store .t. to ( "this." +lcName+ ".Visible" )
			endfor
		endwith

		this.Resize()
	ENDPROC


ENDDEFINE
*
* -- EndDefine: editboxgroup
 
**************************************************
...
Рейтинг: 0 / 0
30.07.2003, 13:34
    #32222259
lnu
lnu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EditGroup
А с ClassDesigner как это сделать?

Мне нужен класс (из файла *.vcx) который работает также как и CommandGroup, т.е. чтобы была возможность в FormDesigner'е в окне Properties в проектном времени изменить свойство EditCount, например на 5, и в форме появилось 5 эдитов.
...
Рейтинг: 0 / 0
30.07.2003, 13:52
    #32222286
Анатолий Широков
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EditGroup
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
* editboxgroup builder
lnCount = aselobj(laArray)
for lnControl =  1  to lnCount
	if type('laArray[m.lnControl].ItemCount') = 'N'
		with laArray[m.lnControl]
			lnItemCount = .ItemCount
			lnItemHeight = .Height / m.lnItemCount
			lnItemWidth = .Width
			for lnItem =  1  to m.lnItemCount
				lcName =  "edt" +alltrim(str(m.lnItem))
				.AddObject(m.lcName,  "editbox" )
				loItem = evaluate( "." +m.lcName)
				loItem.Move( 0 , (m.lnItem -  1 )*m.lnItemHeight, m.lnItemWidth, m.lnItemHeight)
			endfor
		endwith
	endif
endfor


посади этот код на какую-нибудь клавишу, например

Код: plaintext
on key label F12 do editboxgroupbuilder


зайди в дизайнер, выдели свой контейнер (код который я привел для ручного создания в методе Init убери) и нажми f12 - любуйся результатами своего труда:)
...
Рейтинг: 0 / 0
30.07.2003, 14:02
    #32222312
Анатолий Широков
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EditGroup
да, идентификацию нужного контрола можно ужесточить:
Код: plaintext
1.
<	if type('laArray[m.lnControl].ItemCount') = 'N'
>	if laArray[m.lnControl].BaseClass =  "Container"  .and. type('laArray[m.lnControl].ItemCount') = 'N' 
...
Рейтинг: 0 / 0
30.07.2003, 15:35
    #32222504
lnu
lnu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EditGroup
Мы, наверное, друг друга не поняли...

Вот мой вопрос:
Мне нужен класс (из файла *.vcx) который работает также как и CommandGroup, т.е. чтобы была возможность в FormDesigner'е в окне Properties в проектном времени изменить свойство EditCount, например на 5, и в форме появилось 5 эдитов.

Я делал так:
1. Создал класс на основе Container.
Открылся ClassDesigner.
2. В этом дизайнере из меню Class нажал NewProperty, имя новому свойству дал EditCount, поставил флажки Access Method и Assign Method.
Фокс создал два метода EditCount_access и EditCount_assign
3. В методе EditCount_assign я написал:

LPARAMETERS vNewVal

FOR i = fCounts+1 TO vNewVal
Num=ALLTRIM(STR(i))
this.AddObject('ED'+Num,'EditBox')
this.ED&Num..height=20
this.ED&Num..Left=10
this.ED&Num..Top=(this.ED&Num..Height+10)*i
this.ED&Num..Visible=.T.
ENDFOR
fCounts=vNewVal
THIS.listscount = m.vNewVal

В Init

PUBLIC fCounts
fCounts=0

В рантайме все работает ( Click какой то кнопки: Thisform.EditGroup1.EditCount=5. Результат: в Container'е 5 эдитов).
В проэктномном времени:
Выделяю свой Container, в окне Properties в строке EditCount пишу цыфру 5.
Результат: ничего не изменилось...(А в CommandGroup - меняется).
...
Рейтинг: 0 / 0
30.07.2003, 15:40
    #32222519
.
.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EditGroup
behavior by design
...
Рейтинг: 0 / 0
30.07.2003, 15:50
    #32222554
Анатолий Широков
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EditGroup
Я прекрасно тебя понял, но, к сожалению, vfp не предоставляет такой возможности. Так что, либо используй обходной путь связанный c использованием построителя, либо пишы activex.
...
Рейтинг: 0 / 0
30.07.2003, 16:22
    #32222626
Aijik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EditGroup
Вообще-то MS заикнулось о том, что Design-time события (а это как раз то, чего Вы хотите) будут введены в VFP9 (правда говорилось при этом о Report Designer'е только почему-то). Как утверждали некоторые товарищи на конфе впавшего в кому Фоксклуба, в VB такая фича давно есть, а фокса вот всё никак не разродится :(
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / EditGroup / 10 сообщений из 10, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]