powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Перебор элементов на форме
6 сообщений из 6, страница 1 из 1
Перебор элементов на форме
    #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
Перебор элементов на форме
    #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
Перебор элементов на форме
    #33690893
Фотография Программизд 01
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А версия фокса какая ? Если есть BINDEVENT, то этот перебор нафик не нужен.
...
Рейтинг: 0 / 0
Перебор элементов на форме
    #33691011
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хорошо бы еще озвучить цель этого перебора. Зачем это нужно?

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

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

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

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

Это решение как раз и опирается на рекурсивный перебор всех объектов формы.
...
Рейтинг: 0 / 0
Перебор элементов на форме
    #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
Перебор элементов на форме
    #33696869
Sea.s2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
хмм вводить глобальную переменную счетчик вложений для циклического вызова return ?
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Перебор элементов на форме
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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