|
|
|
Из form1.scx в form2.scx
|
|||
|---|---|---|---|
|
#18+
Люди добри. Подскажите. Есть у меня форма form1.scx и форма form2.scx Мне нужно путем нажатия кнопки в 1 форме изменить некоторые свойтва объектов во второй форме. Как такое возможно сделать? ("Объединение" форм под один formset не представляется возможным) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.07.2003, 16:59:53 |
|
||
|
Из form1.scx в form2.scx
|
|||
|---|---|---|---|
|
#18+
Запусти формы: form1, form2 Запусти отладчик, в окне Watch введи _screen и найди коллекцию Forms, ну там вроде ясно. К форме можно получить доступ через _screen.forms(i).<....> только нужно сначала найти i через FOR EACH.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.07.2003, 17:14:49 |
|
||
|
Из form1.scx в form2.scx
|
|||
|---|---|---|---|
|
#18+
Начну издалека. В FoxPro существует такое понятие, как область видимости переменной памяти. Явно, эта область задается командами PUBLIC, LOCAL, PRIVATE. Если какая-либо переменная памяти не была объявлена явно, через одну из этих команд, то ее область видимости по умолчанию устанавливается PRIVATE. PUBLIC - объявленная таким образом переменная "видна" (т.е. к ней можно обратится) из любого места программы. LOCAL - объявленная таким образом переменная "видна" (т.е. к ней можно обратится) только в той процедуре (функции, событии, методе), где она собственно и была объявлена PRIVATE - объявленная таким образом переменная "видна" (т.е. к ней можно обратится) как из той процедуры, где она была объявлена, так и из тех процедур, которые были вызваны из данной. При вызове формы через команду DO FORM MyForm.scx происходит следующее: -) Создается объект-форма, которая автоматически добавляется в системную коллекцию _SCREEN.Forms и ей присваивается в этой коллекции индекс 1. Все ранее существовавшие в этой коллекции формы автоматически увеличивают свой индекс в этой коллекции на 1 -) Создается переменная памяти с именем, совпадающем с именем файла SCX в которую записывается ссылка на только что созданную форму. Если необходимо присвоить вновь созданной переменной другое имя, то используют опцию NAME Код: plaintext т.е. в данном случае ссылка на форму будет записана в переменную памяти с именем poForm. Как указывалось ранее, вновь созданная переменная имеет область видимости PRIVATE, т.е. она будет уничтожена сразу по завершению процедуры (события, метода), где данная команда была дана. Чтобы этого избежать следует явно задать область видимости переменной: Код: plaintext 1. Последняя опция LINKED говорит о том, что форму необходимо будет автоматически уничтожить, если будет уничтожена переменная goForm. Если этой опции нет, то уничтожение переменной goForm не приведет к уничтожению формы. Следует иметь в виду, что форма не может быть удалена, пока существует хотя бы одна ссылка на нее или пока не завершен какое-либо ее событие или метод. Это значит, что если Вы создадите глобальную переменную, содержащую ссылку на форму, то форму невозможно будет удалить, пока не будет удалена эта переменная. Если переменная памяти не была объявлена как глобальная. Или ссылка на форму не была сохранена каким-либо другим способом, то ссылку на форму можно получить путем перебора коллекции _SCREEN.Forms проверяя какое-либо свойство формы: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. Для удобства, можно оформить эту процедуру, как отдельную функцию, возвращающую ссылку на форму или индекс формы в коллекции _SCREEN.Forms К сведению: Основываясь на том факте, что индекс новой формы в коллекции формы всегда равен 1, а ранее созданные формы увеличивают свой индекс на 1, при работе с модальными формами сразу можно сказать, что индекс родительской формы (из которой был произведен вызов модальной) будет равен 2, т.е. к ней можно обратится Код: plaintext но повторюсь, такая ссылка работает только при определенных условиях и как универсальный способ работы - не подходит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.07.2003, 18:38:36 |
|
||
|
Из form1.scx в form2.scx
|
|||
|---|---|---|---|
|
#18+
Спасибо. Все понял. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.07.2003, 10:10:41 |
|
||
|
Из form1.scx в form2.scx
|
|||
|---|---|---|---|
|
#18+
Хотя нет.... Если, например, в MyForm.scx используется FormSet (формы: Form_Out, Form_In etc.), то каким образом они будут записываться в коллекцию _Screen и как я могу к ним обращаться используя _Screen.Form(i) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.07.2003, 11:22:57 |
|
||
|
Из form1.scx в form2.scx
|
|||
|---|---|---|---|
|
#18+
А самому попробовать? Непосредственно FormSet в коллекцию _SCREEN.Forms вообще не попадает, поскольку это не есть форма. В коллекцию _SCREEN.Forms попадают только составляющие его формы. Т.е. если ты сделаешь для примера FormSet из 2 форм, то при запуске этого FormSet в коллекции _SCREEN.Forms окажутся только эти 2 формы. От всех прочих форм такие формы отличаются тем, что у них есть свойство Parent отличное от NULL в котором и "сидит" ссылка на FormSet. Еще следует иметь в виду, что положение форм в коллекции _SCREEN.Forms может быть изменено некоторыми методами (например ZOrder()) Если же делать сылку не через коллекцию форм, а через переменную, то обращение будет иметь вид: DO FORM MyFormSet.scx ?MyFormSet.Form1.Caption ?MyFormSet.Form2.Caption А по большому счету, при обращении к формам внутри FormSet в подобных ссылках вообще нет необходимости, поскольку в FoxPro предусмотрена специальная относительная ссылка " ThisFormSet ". Т.е. находясь в каком-либо методе или событии внутри FormSet к любой его форме можно обратится так: ?ThisFormSet.Form1.Caption Здесь Form1 - это значение свойства Name соответсвующей формы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.07.2003, 11:35:14 |
|
||
|
Из form1.scx в form2.scx
|
|||
|---|---|---|---|
|
#18+
ОК. Благодарю за подробное объяснение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.07.2003, 12:51:27 |
|
||
|
Из form1.scx в form2.scx
|
|||
|---|---|---|---|
|
#18+
ВладимирМ, Следует иметь в виду, что форма не может быть удалена, пока существует хотя бы одна ссылка на нее ] Ссылка на форму2 у меня хранится в свойстве формы1, как проверить после закрытия формы2, была ли она удалена(используется release), форма1 остается открытой. Перебираю _screen, вроде только форма1 есть. Или я что-то не так понял ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2005, 16:09:43 |
|
||
|
Из form1.scx в form2.scx
|
|||
|---|---|---|---|
|
#18+
Hi Novichok1! Ссылка на САМУ ФОРМУ уничтожается автоматически (точнее превращается в ..NULL.) если форму закрыть например через Form.Release() Вот ссылка на какой-то внутренний контрол формы, сохранённая где-то снаружи - действительно не даст форме закрыться. Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2005, 18:41:47 |
|
||
|
Из form1.scx в form2.scx
|
|||
|---|---|---|---|
|
#18+
А не проще ли вместо перебора перебора коллекции _SCREEN.Forms использовать _Vfp.Forms? Например, чтобы узнать заголовок формы с именем myform: Код: plaintext Или так Код: plaintext 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2005, 11:09:27 |
|
||
|
Из form1.scx в form2.scx
|
|||
|---|---|---|---|
|
#18+
Только сейчас обратил внимание на дату вопроса :) 28 июл 03 На тот момент в текущей версии FoxPro могло не существовать системной переменной _Vfp. Но все равно, по-моему сейчас и в vfp 8.0 многие используют перебор по _screen.forms, хотя пользовать _vfp.forms намного удобнее ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2005, 11:16:12 |
|
||
|
Из form1.scx в form2.scx
|
|||
|---|---|---|---|
|
#18+
Hi .Ray.! Работая через перечисление всех форм можно привязываться не к свойству Name формы, а к другим её свойствам - и тем самым не иметь проблем с запуском одной и той-же формы несколько раз. _VFP.Forms("имя") - предполагает что ищем мы именно по Name - и крайне желательно обеспечивать уникальность этого свойства между ВСЕМИ запущенными экземплярами форм в каждый момент времени... Что же касается вообще вопроса ссылок - так IMHO гораздо лучше не полагаться на какие-то "внешние" механизмы поиска/обращения, а просто передавать ссылки между формами - надо чтоб "дочка" могла ссылаться на родителя - пускай тот при вызове/создании передаст ей параметром ThisForm - она запомнит и сможет потом ссылаться без проблем. Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.11.2005, 02:27:44 |
|
||
|
|

start [/forum/topic.php?fid=41&msg=32219748&tid=1593106]: |
0ms |
get settings: |
8ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
172ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
27ms |
get tp. blocked users: |
1ms |
| others: | 227ms |
| total: | 462ms |

| 0 / 0 |
