Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Перебор элементов на форме / 6 сообщений из 6, страница 1 из 1
25.04.2006, 22:53
    #33690224
Sea.s2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перебор элементов на форме
У кого-нибудь имеется алгоритм перебора control'oov на форме с всеможможными вложениями.

f.e PageFrame->Page->Класс Container->label.

Делаю что- то типа итого но кажется можно лучше да и работает с одним уровнем вложенности

Код: 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.
FOR EACH CNT IN ThisForm.Controls
  xCont = CNT
  DO CASE
    CASE INLIST(UPPER(xCont.BaseClass), "EDITBOX", "TEXTBOX", "LISTBOX", "COMBOBOX")
       ...
    CASE UPPER(xCont.BaseClass) = "SPINNER"
       ...
    CASE UPPER(xCont.BaseClass) = "CONTAINER"
      FOR EACH xCont3 IN xCont.Controls
        DO CASE
          CASE INLIST(UPPER(xCont3.BaseClass), "EDITBOX", "TEXTBOX", "LISTBOX", "COMBOBOX")
             ...      
          CASE UPPER(xCont3.BaseClass) = "SPINNER"
              ....
        ENDCASE
      NEXT
      
    CASE UPPER(xCont.BaseClass) = "PAGEFRAME"
      FOR EACH xcont2 IN CNT.PAGES
        FOR EACH xcont4 IN xcont2.CONTROLS
          DO CASE
            CASE INLIST(UPPER(xCont4.BaseClass), "EDITBOX", "TEXTBOX", "LISTBOX", "COMBOBOX")
                ...      
            CASE UPPER(xCont4.BaseClass) = "SPINNER"
                 ....      
            CASE UPPER(xCont4.BaseClass) = "CONTAINER"
              FOR EACH xCont5 IN xCont4.Controls
                DO CASE
                  CASE INLIST(UPPER(xCont5.BaseClass), "EDITBOX", "TEXTBOX", "LISTBOX", "COMBOBOX")
                       ......      
                  CASE UPPER(xCont5.BaseClass) = "SPINNER"
                       ......
                ENDCASE
              NEXT
          ENDCASE
        NEXT
      NEXT
  ENDCASE
NEXT

...
Рейтинг: 0 / 0
25.04.2006, 23:09
    #33690235
karly™
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перебор элементов на форме
Вот процедура. В качестве параметра принимает ссылку на форму. Использует рекурсию. Было написано в VFP7

Код: 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.
*** Процедура перебирает объекты

Procedure SortObjects
Lparameters poObject
Local loObject as Object

*** Обрабатываем сам объект...
DO DoWhatYouWant with poObject

*** Затем - все его объекты...
If PemStatus(poObject, "Objects",  5 ) = .T.

	For each loObject in poObject.Objects
		DO DoWhatYouWant with loObject	 

		If PemStatus(loObject, "Objects",  5  ) = .T.
			DO SortObjects with loObject
		EndIf
	EndFor

EndIf

Procedure WhatYouWant
lParameters poObject
... && Здесь делаешь с объектом все, что тебе заблагорассудится
...
Рейтинг: 0 / 0
26.04.2006, 11:06
    #33690893
Программизд 01
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перебор элементов на форме
А версия фокса какая ? Если есть BINDEVENT, то этот перебор нафик не нужен.
...
Рейтинг: 0 / 0
26.04.2006, 11:30
    #33691011
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перебор элементов на форме
Хорошо бы еще озвучить цель этого перебора. Зачем это нужно?

Например, если нужно выполнить "каскадом" некий метод, если он выполнен в головном объекте, то это можно сделать через метод Refresh(). Вызов этого метода в головном объекте автоматически вызовет такие же методы подчиненных объектов (кроме коллекции Pages в PageFrame).

Т.е. ThisForm.Refresh() заставит выполнять Refresh() всех объектов на форме.

А вообще-то, скачай решение

Resizer - автомат. изменение размеров объектов на форме.

Это решение как раз и опирается на рекурсивный перебор всех объектов формы.
...
Рейтинг: 0 / 0
27.04.2006, 19:13
    #33695754
Sea.s2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перебор элементов на форме
Вроде все получилось перебирает все элементы формы
Но вылезла довольно странная проблема при рекурсии мне если
WhatYouWant() вернет .F. и если это будет уже в >1 уровне вложенности то RETURN .F. из SortObjects() не вернет значение в точку вызова метода формы а перейдет на предыдущий уровень вложенности как прервать все уровни в SortObject и вернуть нужный результат

Версия foxa 7

Это делается для проверки у определенных элементов наличия свойства и проверка его значения
Код: 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.
************************************
FUNCTION SortObjects(toObject)
  LOCAL loObject AS OBJECT

  IF WhatYouWant(toObject) = .F.
    RETURN .F.
  ENDIF

  IF PEMSTATUS(toObject, "Objects",  5 ) = .T.
    FOR EACH loObject IN toObject.Objects
      IF WhatYouWant(loObject) = .F.
        RETURN .F.
      ENDIF
	  
       IF PEMSTATUS(loObject, "Objects",  5  ) = .T.
          SortObjects(loObject)
       ENDIF
    NEXT
  ENDIF
  
 RETURN lcRetVal
ENDFUNC
************************************
FUNCTION WhatYouWant(toObject)
...
RETURN ...
....
  RETURN .F.
ENDFUNC
...
Рейтинг: 0 / 0
28.04.2006, 11:44
    #33696869
Sea.s2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перебор элементов на форме
хмм вводить глобальную переменную счетчик вложений для циклического вызова return ?
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Перебор элементов на форме / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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