:: Visual Foxpro, Foxpro for DOS
нужно объяснение
axeum
Автор

Сообщений: 107
Дата регистрации: 07.07.2020
lcPath = ALLTRIM(GETFILE())
IF EMPTY(lcPath)
=MESSAGEBOX('Ошибка! Не выбран файл.',64,'Ошибка')
ELSE
IF !DIRECTORY('.\DOC\'+ALLTRIM(domkva.nls))
MKDIR '.\DOC\'+ALLTRIM(domkva.nls)
endif
Thisform.txtNameF.value = JUSTFNAME(lcPath)
COPY FILE (lcPath) to ('.\DOC\'+ALLTRIM(domkva.nls))
replace dk_pc.nmf WITH JUSTFNAME(lcPath)
endif
Добрый день, проблема была в том что если в lcpath был файл с пробелом в названии то вылезала ошибка, как то случайно я пришел к тому что lcpath в () работает а с & нет, а можете объяснить или показать где можно посмотреть почему так получилось?



Исправлено 2 раз(а). Последнее : axeum, 04.10.21 06:28
Ratings: 0 negative/0 positive
Re: нужно объяснение
Taran

Сообщений: 13623
Откуда: Красноярск
Дата регистрации: 16.01.2008
Таковы особенности макро.
В любом случае если что-либо можно сделать отличным от макро способом, то так и надо делать.
Ratings: 0 negative/1 positive
Re: нужно объяснение
PaulWist

Сообщений: 14601
Дата регистрации: 01.04.2004
FAQ FoxPro. Как работать с путями доступа и именами файлов, содержащих пробелы


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)




Исправлено 1 раз(а). Последнее : Joys, 04.10.21 08:54
Ratings: 0 negative/2 positive
Re: нужно объяснение
axeum
Автор

Сообщений: 107
Дата регистрации: 07.07.2020
Taran
Таковы особенности макро.
В любом случае если что-либо можно сделать отличным от макро способом, то так и надо делать.
а рзаве макро это плохо?
Ratings: 0 negative/0 positive
Re: нужно объяснение
ssa

Сообщений: 12999
Откуда: Москва
Дата регистрации: 23.03.2005
axeum
а рзаве макро это плохо?
Никогда и не было особенно хорошим.
Макроподстановка


------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/0 positive
Re: нужно объяснение
axeum
Автор

Сообщений: 107
Дата регистрации: 07.07.2020
если я правильно понял то результат будет одинаковым?
x=getfile()
'"' + x + '"'
[+x+]



Исправлено 1 раз(а). Последнее : axeum, 04.10.21 10:06
Ratings: 0 negative/0 positive
Re: нужно объяснение
akvvohinc

Сообщений: 4203
Откуда: Москва
Дата регистрации: 11.11.2008
axeum
а можете объяснить или показать где можно посмотреть почему так получилось?
Это не сложно.

Если вы пишете макро - &lcPath, то после подстановки получается:
COPY FILE имя файла с пробелами TO файл2
Очевидно, что в таком виде синтаксис команды нарушен - после COPY FILE должно идти имя файла, в данном случае таким именем считается "имя", то есть всё, что идёт до первого пробела.
Далее должна идти опция TO, а идет непонятно что.

Если вы пишете (lcPath), то с синтаксисом всё Ok:
COPY FILE (lcPath) TO файл2
Фокс видит, что имя файла задано выражением.

А чтобы и с макро Фокс видел выражение, требуется заключить такое имя файла в кавычки, то есть задать его строковой константой:
COPY FILE "&lcpath" TO файл2
что после подстановки превратится в:
COPY FILE "имя файла с пробелами" TO файл2

Естественно, можно и заранее добавить кавычки к переменной lcpath
lcpath = ["]+lcpath+["]
Тогда кавычки в команде добавлять не нужно:
COPY FILE &lcpath TO файл2
Ratings: 0 negative/0 positive
Re: нужно объяснение
akvvohinc

Сообщений: 4203
Откуда: Москва
Дата регистрации: 11.11.2008
Цитата:
Таковы особенности макро.
Макро здесь вообще ни при чём - при чём то, что получается в результате макроподстановки.



Исправлено 1 раз(а). Последнее : akvvohinc, 04.10.21 11:58
Ratings: 0 negative/0 positive
Re: нужно объяснение
akvvohinc

Сообщений: 4203
Откуда: Москва
Дата регистрации: 11.11.2008
axeum
если я правильно понял то результат будет одинаковым?

А если я правильно понял написанное, то - нет.
Ratings: 0 negative/0 positive
Re: нужно объяснение
Sawradym

Сообщений: 2244
Откуда: Винница
Дата регистрации: 15.05.2007
COPY FILE "&lcpath" TO файл2 - Здесь нет макроподстановки, а есть строка "&lcpath" в качестве имени файла.
Ratings: 0 negative/0 positive
Re: нужно объяснение
axeum
Автор

Сообщений: 107
Дата регистрации: 07.07.2020
akvvohinc
axeum
если я правильно понял то результат будет одинаковым?

А если я правильно понял написанное, то - нет.

x=getfile()
'"' +x+ '"' и ["] +x+ ["]
пока писал о другом задумался



Исправлено 2 раз(а). Последнее : axeum, 04.10.21 12:58
Ratings: 0 negative/0 positive
Re: нужно объяснение
axeum
Автор

Сообщений: 107
Дата регистрации: 07.07.2020
всем спасибо за помощь
Ratings: 0 negative/0 positive
Re: нужно объяснение
akvvohinc

Сообщений: 4203
Откуда: Москва
Дата регистрации: 11.11.2008
Sawradym
COPY FILE "&lcpath" TO файл2 - Здесь нет макроподстановки, а есть строка "&lcpath" в качестве имени файла.

Не совсем так - макроподстановка есть.
Компилятор оформляет (компилирует) эту команду как макроподстановку.

А при выполнении происходит следующее:
1. Если переменная макроподстановки существует, то подстановка выполняется "нормальным образом" (в том числе будет выдано сообщение об ошибке, если она будет).
2. Иначе Фокс попробует трактовать &lcpath как имя файла и выполнит команду, если такой файл существует.
Ratings: 0 negative/0 positive
Re: нужно объяснение
akvvohinc

Сообщений: 4203
Откуда: Москва
Дата регистрации: 11.11.2008
axeum
akvvohinc
axeum
если я правильно понял то результат будет одинаковым?

А если я правильно понял написанное, то - нет.

x=getfile()
'"' +x+ '"' и ["] +x+ ["]
пока писал о другом задумался

Способов "приклеить" кавычки к строке достаточно, например:
x = "file name"
? CHR(34) + x + 0h22 == '"' +x+ ["] && .T.



Исправлено 1 раз(а). Последнее : akvvohinc, 04.10.21 13:32
Ratings: 0 negative/0 positive
Re: нужно объяснение
Taran

Сообщений: 13623
Откуда: Красноярск
Дата регистрации: 16.01.2008
akvvohinc
Цитата:
Таковы особенности макро.
Макро здесь вообще ни при чём - при чём то, что получается в результате макроподстановки.

Шедеврально как всегда. В луже пук.
В чем ты хочешь со мной поспорить?
...
И далее в теме портянка про кавычки для использования в макро. Хочется похвастать знанием трёх методов добавления кавычек?
Сплошной засер мозгов вместо прямого использования функций.
А макро лишь когда совсем никак.
Но, учитывая уровень ТС (не в обиду), это не скоро.



Исправлено 1 раз(а). Последнее : Taran, 04.10.21 18:45
Ratings: 0 negative/0 positive
Re: нужно объяснение
Sawradym

Сообщений: 2244
Откуда: Винница
Дата регистрации: 15.05.2007
akvvohinc
Sawradym
COPY FILE "&lcpath" TO файл2 - Здесь нет макроподстановки, а есть строка "&lcpath" в качестве имени файла.

Не совсем так - макроподстановка есть.
Компилятор оформляет (компилирует) эту команду как макроподстановку.

А при выполнении происходит следующее:
1. Если переменная макроподстановки существует, то подстановка выполняется "нормальным образом" (в том числе будет выдано сообщение об ошибке, если она будет).
2. Иначе Фокс попробует трактовать &lcpath как имя файла и выполнит команду, если такой файл существует.

Да, тьі прав, я не прав. Оказьівается опасная штука єтот "&".
Ratings: 0 negative/0 positive
Re: нужно объяснение
akvvohinc

Сообщений: 4203
Откуда: Москва
Дата регистрации: 11.11.2008
Taran
В чем ты хочешь со мной поспорить?

Да ни о чём.
Я лишь написал, что макро к ошибке ТС не имеет никакого отношения.
Кроме того, макро не имеет никаких особенностей - обычная замена одних символов другими.

А доказывать, что барабашка существует должен тот, кто её придумал.
Ratings: 0 negative/0 positive
Re: нужно объяснение
akvvohinc

Сообщений: 4203
Откуда: Москва
Дата регистрации: 11.11.2008
Sawradym
Оказьівается опасная штука єтот "&".

На мой взгляд, "опасно" другое - в Фоксе есть такие конструкции - например, "имя файла", "имя алиаса", которые можно задавать не только с помощью выражения, а, скажем так, "напрямую" (не знаю, как правильно это называется, подскажите!).

Что я имею в виду:
Например, "имя файла" или "имя алиаса" - это строка.

Даже в Хелпе написано:
SELECT nWorkArea | cTableAlias
Но ни фига подобного - Фокс не требует, чтобы имя алиаса было строкой - он одинаково поймёт обе конструкции, если алиас customer существует:
SELECT customer
SELECT "customer"

В "нормальных" (на мой взгляд) языках допустимым будет только второй вариант.

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

Поэтому я не совсем согласен с объяснением Владимира, зачем-то делающего упор на наличие/отсутствие "кавычек" в FAQ FoxPro. Как работать с путями доступа и именами файлов, содержащих пробелы :
Цитата:
Вот здесь уже все в полном порядке. Параметр - это то, что ограничено кавычками.
Хотя, разумеется, использование дополнительных кавычек не слишком удобно.

Такое объяснение больше похоже на "шаманство" - напиши кавычки, и всё будет Ok.
Я бы сделал основной упор на то, что кавычки (и не только они) превращают "имя файла" в строковое выражение, коим и является "имя файла".
А то, что в некоторых случаях Фокс понимает "имя файла" и без наличия такого выражения - ну, что ж, простим ему этот недостаток.



Исправлено 2 раз(а). Последнее : akvvohinc, 04.10.21 21:08
Ratings: 0 negative/0 positive
Re: нужно объяснение
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
В любом случае это особенность работы макро - с выражением имени (то что в скобках) не возникает неоднозначностей - там всё чётко - одно выражение имени это один параметр. А в макро это может быть всё что угодно, включая кучу параметров, опций команды и собственно саму команду. К сожалению не везде возможно обойтись без макро. В командах копирования для указания имён файлов - можно. А значит и нужно. И не париться с кавычками


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: нужно объяснение
akvvohinc

Сообщений: 4203
Откуда: Москва
Дата регистрации: 11.11.2008
Цитата:
В любом случае это особенность работы макро.
Это всё равно, что сказать -
"Ошибка в команде:
COPY FILE имя файла1 TO имя файла2
вызвана особенностью работы макро".

С какой стати неверное значение переменной макроподстановки является особенностью самого макро?

Или кто-то ожидает, что такой командой можно загнать имя файла в переменную?
lcPath = GETFILE()
filename = &lcPath

Если нет, то очевидно, что макро здесь ни при чём.
Просто в макропеременной должно быть значение, которое после подстановки приводит к получению правильной команды.

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



Исправлено 1 раз(а). Последнее : akvvohinc, 04.10.21 23:59
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 34 (Гостей: 34)

© 2000-2024 Fox Club 
Яндекс.Метрика