powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Отказ от макроподстановок
25 сообщений из 37, страница 1 из 2
Отказ от макроподстановок
    #34859557
AMorkovka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Было сказано-пиши без макроподстановок.
Как заменить DO FORM &lcName..scx на оператор без макроподстановки ?
И то же со свойствами, например, формы: THISFORM.znach&lcNomer=1 ?
Если так:
with eval("THISFORM.znach"+lcNomer), то как продолжить
.<что?>=1
endwith ?

По поводу первого оператора глупый вопрос: лучше писать как написано, но с CONFIG.FPW, или DO FORM forms\&lcName..scx, но без CONFIG.FPW, точнее, строки PATH в нем ? Можно ли ждать конфузов в дальнейшем в том и другом случае ?
...
Рейтинг: 0 / 0
Отказ от макроподстановок
    #34859769
Код: plaintext
1.
llResult = !oApp.runForm("MyFirstForm", "MyForm")


Method oApp.runForm
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
lparameters tcVarName, tcClassName
local loForm
loForm = createObject(tcClassName) 
if vartype(loForm)="O"
	public (tcVarname)			   && Создаем глобальную переменную
	store loForm to (tcVarname)
	loForm.Show()
	return .t.
else
	= messagebox("Ошибка загрузки oForm")
	return .f.
endif

если есть желание поговорить об ООП в фокспро, то продолжим
...
Рейтинг: 0 / 0
Отказ от макроподстановок
    #34859976
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вы пропустили ключевую фразу "если это возможно".

Далеко не всегда можно отказаться от макроподстановки. Но если есть альтернатива, то лучше их не использовать. Пример, приведенный Александром, макроподстановку все-таки использует. Только другим способом. Через выражение имени. Т.е. груглые скобки.

Однако во многих случаях существует альтернатива макроподстановки. Только не в рамках отдельно взятой команды, а в рамках идеологии построения приложения.

Возьмем первый пример:

Код: plaintext
DO FORM &lcName..scx 

Ключевой вопрос: как именно Вы сформировали значение переменной lcName? Откуда оно взялось?

Ну, вероятно, у Вас был некий код вида

Код: plaintext
1.
2.
3.
4.
5.
IF (условие)
	lcName = "Form1"
ELSE
	lcName = "Form2"
ENDIF

Тогда возникает вопрос: а зачем Вы записали имя формы в переменную? Почему нельзя было написать сразу:

Код: plaintext
1.
2.
3.
4.
5.
IF (условие)
	DO FORM Form1.scx 
ELSE
	DO FORM Form2.scx 
ENDIF

Ну, или передать некий идентификатор формы, который потом "расшифровать" через тот же IF или CASE.

Если же Вы пишите некий класс обертку для вызова форм, то можно использовать то, что привел Александр. Выражение имени

Код: plaintext
DO FORM (m.lcName+".scx") 

Пути доступа в самой команде лучше не использовать. Лучше делать настройку путей доступа в файле конфигурации или напрямую через команду SET PATH.

Проблема здесь в том, где именно, в каком порядке, ищет файл FoxPro.

1. Внутри скомпилированного файла EXE
2. Если не нашли, то по пути, явно указанному в команде
3. Если не нашли, то в текущей директории
4. Если не нашли, то по путям, указанным в SET PATH

Т.е., если файл включен внутрь EXE, то без разницы, указан у него путь доступа или нет. Все равно в первую очередь будет осуществляться поиск внутри файла EXE.

А вот если файл не включен внутрь EXE, то возможен конфликт, если у клиента есть папка с тем же путем доступа.

AMorkovkaИ то же со свойствами, например, формы: THISFORM.znach&lcNomer=1 ?
Если возникает необходимость обращаться к свойствам по номерам, то создают свойство типа массив. Признаком того, что свойство является массивом является указание размерности такого свойства. Например:

Код: plaintext
ThisForm.AddProperty("aArray[1,1]")

Работать с таким свойством можно как с обычным массивом. Также можно изменять его размерность

Код: plaintext
1.
2.
Dimension ThisForm.aArray( 10 )
ThisForm.aArray[VAL(m.lcNomer)] =  1 

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

Т.е. проблема макроподстановок не в использованнии в коде, а в сложности написания и сопровождения такого кода.
...
Рейтинг: 0 / 0
Отказ от макроподстановок
    #34860258
AMorkovka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
К ВладимирМ. Да, у меня обертки, и первое решение по первому оператору хорошо. По второму у меня, например, в цикле:
FOR EACH cntrl IN thisform.Controls
lcName=SUBSTR(cntrl.Name,4)
thisform.frm_parent.m_&lcName=...
endfor,
не массив. Ну и подобные диспозиции. Наверное, без макро не обойтись. Спасибо за ответы.
...
Рейтинг: 0 / 0
Отказ от макроподстановок
    #34860277
прошелмимо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
деточка, не слушай дядю.
дядя - враг.

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

не пиши ду форм.
вначале прочитай и проанализируй,
если начнут возникать вопросы - задавай - обсудим

автор
Цель серии статей, посвященных Visual Foxpro 9 ... обучить разработчиков оптимальным и прогрессивным способам и приемам программирования в среде разработки Visual Foxpro 9.0.
Цель данной статьи объяснить некотором образом причины и необходимость использования новейшей версии Visual Foxpro, причины стремления к изменению способов и приемов разработки .... и использования новых инструментов, созданных с применением объектно-ориентированного программирования на Visual FoxPro.


автор
Visual FoxPro поддерживает как стандартное процедурное программирование, так и мощное и гибкое объектно-ориентированное программирование. Объектно-ориентированный разработка и объектно-ориентированное программирование являются более современными и прогрессивными по сравнению со стандартным процедурным программированием. Вместо того, чтобы думать о программе как о процессе последовательного выполнения строк кода, теперь надо думать о создании объектов. В Visual FoxPro можно создавать объекты и манипулировать ими как самостоятельными компонентами.
К преимуществам ООП можно отнести большую надежность кода, более легкое понимание разработчиками процессов, более простое сопровождение визуальных классов ( поиск ошибок и доработка). В результате этого:
- повышается производительность труда программистов и снижаются трудозатраты;
- повышается надежность программ.
ООП в Visual FoxPro предусматривает создание библиотек визуальных классов, на основании которой ведется разработка клиентской части ПО. Все участники процесса разработки ПО мыслят одними категориями. Термины класс и объект лежат в основе всех этапов. Трансляция понятий не нужна, потери отсутствуют.


автор
Объект (object)- это конкретная реализация, экземпляр класса. В программировании отношения объекта и класса можно сравнить с описанием переменной, где сама переменная(объект) является экземпляром какого-либо типа данных(класса).
Обычно, если объекты соответствуют конкретным сущностям реального мира, то классы являются некими абстракциями, выступающими в роли понятий. Понятие класса и что он в себя включает мы рассмотрим отдельно. А на данном этапе воспринимайте класс как шаблон объекта. Для формирования какого-либо реального объекта необходимо иметь шаблон, на основании которого и строится создаваемый объект. При рассмотрении основ ООП мы часто смешиваем понятие объекта и класса. Дело в том, что класс - это некоторое абстрактное понятие. Для проведения аналогий или приведения примеров оно не очень подходит. На много проще приводить примеры, основываясь на объектах из реального мира, а не на абстрактных понятиях. Поэтому, говоря, к примеру, про наследование мы прежде всего имеем ввиду наследование классов(шаблонов), а не объектов, хотя часто и применяем слово объект. Скажем так: объект - это физическая реализация класса(шаблона).



ну и т.д.
...
Рейтинг: 0 / 0
Отказ от макроподстановок
    #34860313
прошелмимо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 AMorkovka

макроподстановка - зло
и не в макроподстановке дело

проблема у Вас в том, что Вы не понимаете, что такое
объект, как на него сослаться
необходимо вначале понять правила создания классов, наследования классов,
создания объектов,
правила объединнения каких-то сущностей, правила ограничения и т.д.
...
Рейтинг: 0 / 0
Отказ от макроподстановок
    #34860357
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
прошелмимомакроподстановка - зло
и не в макроподстановке дело


Эх, какая непоследовательность в действиях
...
Рейтинг: 0 / 0
Отказ от макроподстановок
    #34860371
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AMorkovkaПо второму у меня, например, в цикле:
Код: plaintext
1.
2.
3.
FOR EACH cntrl IN thisform.Controls
	lcName=SUBSTR(cntrl.Name, 4 )
	thisform.frm_parent.m_&lcName=...
endfor

не массив. Ну и подобные диспозиции. Наверное, без макро не обойтись. Спасибо за ответы.
Я же говорю, часто макроподстановка - это следствия идеологии построения приложения. Исправление "кривизны" идеологии, за счет программных "наворотов". Если свойство это не массив (что как раз и закладывается в идеологии), то без макроподстановки не обойтись.

Другое дело, как эту макроподстановку написать (оформить). Символ "&" уж слишком не заметен. Его легко пропустить. Поэтому, лучше использовать выражения имени или Evaluate(). В данном случае можно так:

Код: plaintext
1.
2.
3.
4.
FOR EACH cntrl IN thisform.Controls
	lcName = SUBSTR(cntrl.Name, 4 )
	STORE ... TO ("thisform.frm_parent.m_" + m.lcName)
endfor

Результат тот же, но код значительно "читабельнее". Да и промежуточную переменную lcName можно убрать. Написать SubStr() прямо в выражении имени.
...
Рейтинг: 0 / 0
Отказ от макроподстановок
    #34860385
прошелмимо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
отдай - убьются биндить события
...
Рейтинг: 0 / 0
Отказ от макроподстановок
    #34860386
AMorkovka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
К прошелмимо. Пожалуй, перепишу как Вы советуете в первом отклике.
Вот у меня есть иерархия классов форм в файле vcx. Их я делал по известной последовательности в дизайнере форм: Tools+Options+Forms+Form(шаблон). Теперь в дизайнере же создаю реальную форму на основании такой иерархии и присваиваю ей имя Rabota.scx. Затем работаю с ней по DO FORM. Ежели бы не создавать файл Rabota.scx, а пробовать СreateObject, то как быстро добавить в нужные точки формы нужные контролы с функционалом? Или же у Вас создается еще один уровень иерархии, который окончательно формирует нужный нам интерфейс и функционал, тождественный Rabota.scx? Так сказать окончетельное решение, которое можно использовать только для конкретного случая, и больше, увы, нигде.
...
Рейтинг: 0 / 0
Отказ от макроподстановок
    #34860415
прошелмимо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторЭх, какая непоследовательность в действиях

все последовательно с 94-го

автор то как быстро добавить в нужные точки формы нужные контролы с функционалом?

много слов - я не понял особо


конечно правильно пронаследовать
и наделить доп-мы св-ми и добавить доп-е объекты

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

с классами наиболее правильно и просто строится
арх-ра, нет проблем с подъемом объектов,
правильное созд-е классов-шаблонов
позволяет просто и логично масштабировать прилож-я
...
Рейтинг: 0 / 0
Отказ от макроподстановок
    #34860426
AMorkovka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
К ВладимирМ. Ну надо же, спасибо и за второе решение. Оно же и первое, не додумал.
...
Рейтинг: 0 / 0
Отказ от макроподстановок
    #34860437
прошелмимо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторИли же у Вас создается еще один уровень иерархии, который окончательно формирует нужный нам интерфейс

да, вот дочитал

да осуществляется наследование
и у наследника добавляюся какие-то св-ва и объекты
при этом осуществляется объединение
в различные группы по каким-то существенным признакам

при этом постоянно анализируется
то и куда в родителя или наследника,
производится постоянный анализ существенных и несущ-х признаков и различий

кто и кому что должен сообщить,
кто и о чем должен ведать ... и т.д. ...
...
Рейтинг: 0 / 0
Отказ от макроподстановок
    #34860451
прошелмимо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторТак сказать окончетельное решение, которое можно использовать только для конкретного случая, и больше, увы, нигде.

Вы ошибаетесь

была форма счет-фактура

с 1.01 что-то изм-ся...

наследуем, добавляем изм-ем у наследника ...

получаем возм-ть в ПО
иметь и старую форму и новую ...
с минимальными затратами

при этом максимально понимаем,
что если у старой формы что-то изменить, то испр-я автом-ки
пронаследуются у наследника,
что можем каим-то образом не допустить (все в наших руках)
...
Рейтинг: 0 / 0
Отказ от макроподстановок
    #34860465
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AMorkovkaК прошелмимо. Пожалуй, перепишу как Вы советуете в первом отклике.
Вот у меня есть иерархия классов форм в файле vcx. Их я делал по известной последовательности в дизайнере форм: Tools+Options+Forms+Form(шаблон). Теперь в дизайнере же создаю реальную форму на основании такой иерархии и присваиваю ей имя Rabota.scx. Затем работаю с ней по DO FORM. Ежели бы не создавать файл Rabota.scx, а пробовать СreateObject, то как быстро добавить в нужные точки формы нужные контролы с функционалом? Или же у Вас создается еще один уровень иерархии, который окончательно формирует нужный нам интерфейс и функционал, тождественный Rabota.scx? Так сказать окончетельное решение, которое можно использовать только для конкретного случая, и больше, увы, нигде.
Поскольку от Александра добиться внятного ответа сложно, то опишу общую логику действий в таких случаях.

1) Да. Вы вынуждены будете создать еще один уровень иерархии. Именно что "окончательное решение, которое можно использовать только для конкретного случая, и больше, увы, нигде"

2) Вы вынуждены будете озаботиться программной привязкой данных к объектам этого "окончательного решения". По самой своей сути, класс (VCX) не допускает привязку объектов к данным. Точнее, физически это сделать можно, но тогда это уже не вполне класс, поскольку он теряет "универсальность". Впрочем, если это "окончательное решение", то это уже не принципиально.

3) Изменяется сама технология работы. Т.е. придется много чего и много где "подмазать и подклеить". Например, чтобы вернуть значение из модальной формы надо будет по особому оформить вызов такой формы.


PS: Если Вы собираетесь перписать приложение без SCX, то, может быть, имеет смысл и свойства формы оформить как массивы? Эта переделка будет сущей мелочью, по сравнению с переписыванием все на VCX.
...
Рейтинг: 0 / 0
Отказ от макроподстановок
    #34860483
прошелмимо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
от ВладимирМ можно добиться только процедурное программирование.

если Вы желаете развиваться
и разрабатывать масштабные приложения,
с минимальными трудозатратами сопровождать
свои разработки, то Вы должны обратить внимание на
возможности ООП в фокспро.
...
Рейтинг: 0 / 0
Отказ от макроподстановок
    #34860508
прошелмимо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторПо самой своей сути, класс (VCX) не допускает привязку объектов к данным

это почему это ?
из личных убеждений?


Вы не понимаете, что такое абстракция и не желаете понять - в этом проблема.
И для чего это нужно Вы не желаете понимать.

можно написать
Код: plaintext
1.
.ControlSourse = tt.pp

а можно
Код: plaintext
1.
2.
бубен.датаСущность = бубноваяБубна
бубен.источник = отБубновойБубны.Бубен

такая вот ерунда ...
...
Рейтинг: 0 / 0
Отказ от макроподстановок
    #34860535
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
прошелмимоот ВладимирМ можно добиться только процедурное программирование.

если Вы желаете развиваться
и разрабатывать масштабные приложения,
с минимальными трудозатратами сопровождать
свои разработки, то Вы должны обратить внимание на
возможности ООП в фокспро.
Александр, Вы, как обычно, не последовательны и не логичны.

1. Где Вы видите противоречие использования SCX как "окончательного решения" иерархии VCX и "возможностей ООП в фокспро"?

2. Где Вы видите противоречия в том, что я описал в данной теме с Вашими словами? Ну, или хотя бы возражения?
...
Рейтинг: 0 / 0
Отказ от макроподстановок
    #34860559
AMorkovka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
К счастью, проект еще не на той стадии, когда было бы трудно его подработать. Спасибо за ответы. Рассмотрел в указанном направлении очертания новых многообещающих горизонтов.
...
Рейтинг: 0 / 0
Отказ от макроподстановок
    #34860574
прошелмимо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нет возражений - не путайся под ногами

дай возможность людей обратить в свою "веру" -
меньше шишек набьют
и выжмут все прогрессивное, что есть в лисе

а не будут с дуформ топтаться
...
Рейтинг: 0 / 0
Отказ от макроподстановок
    #34860578
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
прошелмимо авторПо самой своей сути, класс (VCX) не допускает привязку объектов к данным

это почему это ?
из личных убеждений?


Вы не понимаете, что такое абстракция и не желаете понять - в этом проблема.
И для чего это нужно Вы не желаете понимать.

можно написать
Код: plaintext
1.
.ControlSourse = tt.pp

а можно
Код: plaintext
1.
2.
бубен.датаСущность = бубноваяБубна
бубен.источник = отБубновойБубны.Бубен

такая вот ерунда ...
Ну, хоть что-то...

Предположим, я разрабатываю форму, которая должна работать с таблицей MyTable. Разумеется, я буду делать форму на основе класса. Но что следует оставить на уровне класса, а что вынести в собственно форму?

Здесь под термином "форма" я понимаю "окончательное решение". То, что уже не будет пораждать наследников. Не важно, как это физически оформлено, как VCX или как SCX.

Следует ли переносить в класс привязку к данным? Нет! Поскольку в этом случае я не смогу использовать этот класс для работы с другой таблицей источником. Т.е. чтобы создать другую "форму". Надо будет как-то заменять одну таблицу-источник на другую. Какой смысл тогда в классе?

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

Разумеется, есть ситуации, когда класс-наследник использует те же таблицы, что и класс-родитель. Но, это очень особенные ситуации. Это скорее исключение, чем правило.
...
Рейтинг: 0 / 0
Отказ от макроподстановок
    #34860582
прошелмимо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
класс колонок покажи народу на фоксклабе -
убьются шаманить на пустом месте ...

шаманы шаманистские
...
Рейтинг: 0 / 0
Отказ от макроподстановок
    #34860584
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
прошелмимонет возражений - не путайся под ногами

дай возможность людей обратить в свою "веру" -
меньше шишек набьют
и выжмут все прогрессивное, что есть в лисе

а не будут с дуформ топтаться
Аргументы и доказательства будут? Или по прежнему один треп, хамство и безапеляционные заявления?
...
Рейтинг: 0 / 0
Отказ от макроподстановок
    #34860596
прошелмимо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
у класса может сущ-ть
астракция на источник
и вот свойства этой абстракции возможно изм-ть у этого наследника ..,
что позволяет упростить разр-ку и сопровождение

самый простой пример абстракции, который я приводил
Код: plaintext
1.
[id,Номер, 50 ][text,Наименование, 200 ,.t.]

а у класса уже есть интерфейс и методы, который
по опред-му (заранее созданному) (стандартному) и редко изменяемому
алгоритму, что-то делает ...
...
Рейтинг: 0 / 0
Отказ от макроподстановок
    #34860605
прошелмимо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор Или по прежнему один треп, хамство и безапеляционные заявления

док-во приложено выше

отдайте людям или сами покажите как это сделать

и нечего здесь трепаться - на фоксклабе трепитесь
...
Рейтинг: 0 / 0
25 сообщений из 37, страница 1 из 2
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Отказ от макроподстановок
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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