powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Вызов формы из библиотечного класса
8 сообщений из 8, страница 1 из 1
Вызов формы из библиотечного класса
    #36862216
ТСергей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Имеется проблема, которая пока не решается. Вот суть:

Есть собственный класс, сделанынй на основке контейнера, в котором собраны один грид и несколько кнопок, не считая прочего, что здесь не существенно. В гриде в качестве источника данных указан алиас и указано имя курсора (разумеется, такой курсор создаётся заранее). На основе данного класса созданы объекты в разных формах, в нужных местах. Кнопки в этом классе логически привязаны к гриду, в том смысле, что содержат процедуры добавления записей в курсор, отображаемый в гриде, проверки записей, удаления, обновления и нескольких ещё процедур, которые все используются для изменения данных в разных полях курсора.

Проблема в том, что из процедур, прописанных для этих кнопок, должны вызываться различные формы, которые включены в проект. В процедурах стоит их вызов примерно в таком виде:

Код: plaintext
do form SelectData with param1, param2, param3

Повторяю, что вызываемая форма включена в проект, вместе с теми формами, в которых испольуются объекты на основе описанного класса, и компилируются в один исполняемый файл. Но тем не менее, эта форма из готового MyProg.APP не вызывается. При этом выдаётся сообщение об ошибке типа:

"File 'd:\vfp_prg\MyProg\selectdata.scx' does not exist."

Разумеется, по этому пути этой формы (такого файла) не существует. Это естественно, ведь над проектом работают много человек, больше полусотни. Все формы, которые включены в проект, располагаются в папках на сетевом диске, для каждого сотрудника-разработчика своя папка. Но ведь когда форма включается в проект, она видна всем другим формам просто по имени, и не надо нигде указывать полных путей к какой-то форме при вызове её из других. делать эту форму как класс тоже нет никакого резона, она имеется готовая, используется для очень узкой конкретной задачи.

Вопрос - как заставить всё-таки вызвать такую форму из библиотечного объекта, который тоже включен в проект ?
...
Рейтинг: 0 / 0
Вызов формы из библиотечного класса
    #36862281
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чудес не бывает - форма не попадает в APP. Если в папку с APP положить selectdata.scx и selectdata.sct ошибка исчезает?
Форма либо совсем не включена в проект, либо включена как "Exclude" (в проекте перед именем формы зачеркнутый кружок нарисован).
...
Рейтинг: 0 / 0
Вызов формы из библиотечного класса
    #36862357
ТСергей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T,

Форма, которую необходимо вызывать, разумеется, включена в проект, об этом было отчётливо сказано. Изо всех других мест она прекрасно вызвается без всяких проблем. Потому как в документации на VFP также сказано, что включенные в проект формы доступны из всех мест вызовов.

Она не вызывается только и именно из объекта, созданного на какой-то другой форме на базе библиотечного класса, который, разумеется, также в этот же проект включен (на вкладке проекта Classes). тут проблема в том, видимо, что библиотечный класс видит только те формы, более общо - объекты, которые лежат в корневой папке проекта. Но проект очень большой (более 670 форм, более 200 тысяч строк исходного кода в PRG файлах), валить всё в корень - по меньшей мере негуманно.

Да и кроме того, как тоже уже говорилось, над проектом работаю больше 50 разработчиков, у каждого - своя папка. Многие формы этих разработчиков включаются в другие проекты (все папки расшарены для этого). Так что проблема, как пока представляется, в ограниченной способности библиотечных функций (а по сути любой библиотечный класс это функция, только она может быть визуальной, а может и не быть) видеть другие объекты в составе проекта. Мы перепробовали всё - результат один.

Разумеется, можно вернуться к старому варианту - когда на каждой форме, где это необходимо создаются свой набортнужных кнополк и свой грид, просто путём копирования их с формы на форму. Но при этом, как понятно, пропорционально растёт размер проекта и исполняемого приложения. Сейчас он и так уже более 11 мегабайт размером, поэтому встала проблема уменьшения размера. Это в первую очередь и можно сделать библиотированием часто встречающихся форм в виде классов.

Но вот встала другая проблема, которую пока не знаем как разрешить.
...
Рейтинг: 0 / 0
Вызов формы из библиотечного класса
    #36862574
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мистика какая-то, файл APP это не что иное как все формы, классы, prg и т.п. сваленное в одну папку, внутри APP нет папок.
Если все действительно так как ты описал - должно работать без проблем.

Попробуй повторить эту проблему в отдельном проекте и сюда его выложить.

С другими формами подобная проблема возникает?

Еще ты не ответил: Если в папку с APP положить selectdata.scx и selectdata.sct ошибка исчезает?

PS Не надо бояться размеров проекта, они тут не при чем, не такой уж он и большой. У меня есть подобное использование вызова форм из классов, причем все так же по разным папкам разложено: отдельно классы отдельно формы. Все компилируется и нормально работает.
...
Рейтинг: 0 / 0
Вызов формы из библиотечного класса
    #36862635
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я не понял из описания проблемы: класс и форма находятся в разных APP или в одном? Т.е. не пытаетесь ли Вы из "недр" одного APP обратится к объекту, находящемуся в другом APP?
...
Рейтинг: 0 / 0
Вызов формы из библиотечного класса
    #36867456
ТСергей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T, отдельный проектик - это отдельное время, которого очень мало.

Опишу поподробнее ситуацию. Есть один большой проект, назовём его условно "PROJECT", с этим именем имеется сетевая расшаренная папка. В его разработке принимают участие много программистов-разработчиков. Для каждого программиста в корневой папке проекта создана папка с именем (условным) "Creator_1", "Creator_2", и так далее, по числу участников. В каждой папке программиста имеется две подпапки - "PRG" и "FORM", понятно, для чего.

Проект собирается путём включения в него всех файлов с программами и формами из всех подпапок всех разработчиков, и компилируется в EXE-файл, который уже и используется пользователями. После компиляции в EXE-файл все обычные формы видят любую другую обычную форму.

Проект стал достаточно большим, а это сетевое приложение (замечание ВладимируМ - мы работаем через сеть, причём у нас более двадцати небольших отделений и по городу, и в других городах, то есть, мы строим VPN через обычные Интернет-соединения, поэтому большой размер исполняемого файла - это большое время загрузкии соттветственно, трафик, за который приходится платить. Тут бы Вам заранее, не зная конкретики, не следовало бы говорить об отсутствии проблем с большим размером файлов), и потому большой размер - определённая проблема. Стали сокращать его размер. Самый эффективный путь - не включать нужные формы, которые используются во многих местах, в эти места в явном виде, а создать на их иснове библиотечные класс, сложить их в библиотеку VCX, и в нужных местах просто создавать объект на основе этого класса.

Вот тут-то и проявилась эта проблема. То есть, если вызываемая форма лежит в корне папки проекта, то после компиляции она из библиотечной формы (из экземпляра библиотечной формы) нормально вызывается. Но это как раз недопустимо. Все формы разложены по папкам своих разработчиков (по своим подпапкам, типа подпапка "Creator_1\Form\", в которой лежит форма Selectdata.scx/sct). При вызове из экземпляра библиотечного класса вызов не прокатывает, говорит об отсутствии в корне проекта нужного файла.

Пробовали так. В корень, где лежит EXE-шник (это, естественно, другая папка, на другом сервере) клали файлы нужной формы - вызывается. Но, это ведь не решение проблемы, уж это-то очевидно. Клали перед компиляцией требуемую форму в корень папки проекта - тоже всё хорошо. Но я уже говорил, всего форм туева куча, структуризация проекта - это очевидное требование. Вы сможете нормально работать с папкой, в которой в одну кучу свалено более 4000 файлов, которые все должны включаться в проект ? Вот то-то...

Пока обошли проблему вот как. В библиотечном классе сделали вызов нужной формы следующим образом:

Код: plaintext
do form Creator_1\Form\Selectdata with param1, param2, param3

И в EXE-шнике после компиляции всё стало работать требуемым образом. То есть, мы понимаем так, что просто-напросто библиотечный класс в упор не видит вложенных форм (кстати, это касается и вложенных программ PRG. Вот не видит, и всё ! Требует явного указания пути к ним.

Вот в этом-то и проблема - как заставить его видеть вложенные формы, исходно лежащие в подпапках внутри папки проекта, аналогично всем прочим.
...
Рейтинг: 0 / 0
Вызов формы из библиотечного класса
    #36867713
Фотография Telum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пропиши путь set path to "project\creator1\form" и не делай мозг себе.
...
Рейтинг: 0 / 0
Вызов формы из библиотечного класса
    #36867775
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТСергейDima T, отдельный проектик - это отдельное время, которого очень мало.
И зря. Писать сюда целый трактат как не работает - есть время, а поискать самому причину проблемы - нет.
В подавляющем большинстве случаев попытка повторить проблему в отдельном простом проекте приводит к пониманию сути проблемы и ее самостоятельному решению.

Повторю еще раз вышесказанное: внутрь EXE (или APP) попадают все файлы, которые присутствуют в собираемом проекте.
Никаких ограничений на количество включаемых файлов у фокса нет:
http://msdn.microsoft.com/en-us/library/3kfd3hw9(VS.80).aspxMaximum # of lines in source program files - Limited by available memory
Maximum size of compiled program modules - Limited by available memory
...
4 A program module is one procedure. A program or application can contain an unlimited number of program modules.
Согласно этому - у тебя все должно работать.
Теоретически может не работать по следующим причинам:
1. В твоей куче подпапок две формы SelectData, маловероятно что это помешает, думаю возьмется первая попавшаяся.
2. Битый файл проекта (PROJECT.PJX и .PJT) в котором EXE собирается. Мне кажется это наиболее вероятным.
Попробуй удалить эту форму из проекта и добавить обратно. Еще не помешает сделать в меню Project - Clean Up Project
Для чистоты эксперимента вообще убить проект и новый создать, только все подпапки в PATH надо будет прописать чтобы фокс все в проект добавил.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Вызов формы из библиотечного класса
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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