Page 1 of 3

Зачем нужен EF_CREATENEW?

Posted: Thu 24 Jul, 2008 16:35
by NightRoman
Согласно энциклопедии
FileName
Name of the file to edit. Unless EF_CREATENEW is set in the Flags parameter, must specify an existing file.
Flags
...
EF_CREATENEW
Opens a new (non-existing) file in the editor, similar to pressing Shift-F4 in FAR.
Это ОК. Но если я НЕ устанавливаю этот флаг, я не вижу никакой разницы – открывается редактор с несуществующим файлом, то же самое, как если бы я установил этот флаг. Возникает вопрос – зачем тогда этот флаг? (может я недоиспользую какую-то полезность, которую не понимаю).

Re: Зачем нужен EF_CREATENEW?

Posted: Thu 24 Jul, 2008 21:01
by dolzenko
да уж, из 293 (?) сурцов плагинов что у меня есть только двое до такого додумались :)

\Translate\src\trans.cpp
\FARCmds\OpenCmd.cpp

Re: Зачем нужен EF_CREATENEW?

Posted: Fri 25 Jul, 2008 09:14
by NightRoman
dolzenko_
В смысле, только в двух плагинах этот флаг используется? Или что-то другое ты имел в виду?

Хорошо бы разобраться и, если что, документацию уточнить. Но это мелочь, конечно.

Re: Зачем нужен EF_CREATENEW?

Posted: Fri 25 Jul, 2008 12:18
by dolzenko
NightRoman wrote:dolzenko_
В смысле, только в двух плагинах этот флаг используется? Или что-то другое ты имел в виду?
именно

Translate\src\trans.cpp
Info.Editor(TransFileName, GetMsg(MTranslate), 0, SizeY, -1, -1,
EF_DELETEONLYFILEONCLOSE | EF_CREATENEW | EF_DISABLEHISTORY, 0, 1);
FARCmds\OpenCmd.cpp
DWORD Flags=EF_NONMODAL|EF_CREATENEW|EF_ENABLE_F6|EF_IMMEDIATERETURN;
if ( outputtofile )
Flags |= EF_DISABLEHISTORY|EF_DELETEONCLOSE;
if ( validForView(TempFileNameErr, Opt.ViewZeroFiles) )
{
wsprintf(fullcmd, "%s%s", titleErr, cmd);
Info.Editor(TempFileNameErr,outputtofile?fullcmd:NULL,0,0,-1,-1,Flags,StartLine,StartChar);

Re: Зачем нужен EF_CREATENEW?

Posted: Thu 14 Aug, 2008 10:50
by NightRoman
Все-таки, в чем смысл флага? Документация FAR - туманная на эту тему, я интересуюсь для ясности в FAR.NET документации.

На багу де факто это не тянет, ибо никакого вреда от этого нет, но это все ж недочет и потеря времени "внимательных" читателей документации, которые, если они еще и "добросовестные" разработчики, могут проверять, что происходит при этом флаге ON\OFF.

Re: Зачем нужен EF_CREATENEW?

Posted: Thu 14 Aug, 2008 11:01
by t-rex
Валя?

Re: Зачем нужен EF_CREATENEW?

Posted: Thu 14 Aug, 2008 11:24
by Skirda
По большому счету EF_CREATENEW нужен в тех случаях, если FileName пустой, не задан.
Возможно, что в процессе разработки "ОНА ПОТЕРЯЛАСЯ".
Ок. Давайте разбираться. По цепочке :)

АПИ флаг EF_CREATENEW при вызове ShellEditor заменяется флагом внутренним FFILEEDIT_CANNEWFILE.
FFILEEDIT_CANNEWFILE проверяется только 1 раз в FileEditor::Init()

Code: Select all

  if(BlankFileName || Flags.Check(FFILEEDIT_CANNEWFILE))
    Flags.Set(FFILEEDIT_NEW);
Здесь - "если `пустое` имя или задан флаг `пустоты`, то выставим FFILEEDIT_NEW"
BlankFileName у нас получается... (там же)

Code: Select all

int BlankFileName=!StrCmp(Name,UMSG(MNewFileName));
хмм... а FileName в API::Editor нигде не проверяется на пустоту - пока только в этом вижу ошибку...
или вы про что? :crazy:

Re: Зачем нужен EF_CREATENEW?

Posted: Thu 14 Aug, 2008 11:47
by NightRoman
Ну примерно про это. Вот примеры на PowerShell, который через FAR.NET устанавливает или не устанавливает этот флаг

Code: Select all

# Пустое имя файла, любой флаг IsNew
# В любом случае получаем Exception calling "Open" with "0" argument(s): "Cannot open the file ''"
$e = $Far.CreateEditor()
$e.IsNew = ... # любое значение - $true или $false
$e.Open()

Code: Select all

# Непустое имя файла, любой флаг IsNew
# В любом случае открывается существующий или несуществующий файл (любое сочетание с флагом)
$e = $Far.CreateEditor()
$e.IsNew = ... # любое значение - $true или $false
$e.FileName = 'существующий или несуществующий файл'
$e.Open()

Re: Зачем нужен EF_CREATENEW?

Posted: Thu 14 Aug, 2008 14:03
by Skirda
NightRoman, проверь вот эту сборку

Re: Зачем нужен EF_CREATENEW?

Posted: Thu 14 Aug, 2008 14:24
by NightRoman
Проверяю, а что именно?
При пустом имени файла ошибки нет, Фар подставит ?New File?
При непустом откроет существующий или нет файл с указанным именем.
Флаг EF_CREATENEW пофигу.
Так должно быть?

Re: Зачем нужен EF_CREATENEW?

Posted: Thu 14 Aug, 2008 14:37
by NightRoman
Да, в такой схеме и работает. Так и задумано? Если да, то это хорошо, помню было неудобно порой имя нового файла программно придумывать (надо ж еще проверить, что такого нет, если и впрямь именно новый хотим). А флаг EF_CREATENEW тогда будет задокументирован, как неиспользуемый? Такой вариант мне нравится (и вроде это не breaking изменение, к тому же).

Другой вопрос попутно. Как бы "в заданной папке" открыть новый файл?
Варианты:
folder\?New File?
folder
не проходят:
- инвалидное имя
- нельзя редактировать папку

Re: Зачем нужен EF_CREATENEW?

Posted: Thu 14 Aug, 2008 15:11
by Skirda
так, я уже совсем запутался... :evil:
можешь сформулировать внятно - что ты хочешь?

попутно... где-то здесь, на форуме, я предлагал расширить количество флагов, чтобы Info.Editor по своему поведению был немного похож на Це-функцию fopen.
возможно тогда вот это:
не проходят:
- инвалидное имя
- нельзя редактировать папку
...пройдет.

Re: Зачем нужен EF_CREATENEW?

Posted: Thu 14 Aug, 2008 15:42
by NightRoman
Разбираемся, чего и как хочется

*) разобраться зачем нужен флаг EF_CREATENEW и задокументироать это. Сейчас он ни на что не влияет. Если это нормально, так и документируем – флаг в настоящее время не используется.

*) иметь возможность открыть в редакторе новый файл, не задавая никакого имени (или пустое имя). Как это работает сейчас – никак, Фар выдает ошибку. Это неудобно, надо придумывать имя, а это не так просто по уму, ибо надо еще проверить, что такого файла, действительно нет.

Ты в экспериментальной версии это доработал, при пустом имени на время сеанса до сохранения Фар генерит псевдо имя ?? Файл подразумевается в текущей папке. Все ОК, но идем далее, аппетит приходит во время еды.

*) иметь возможность открыть в редакторе новый файл, не задавая имени, НО указав путь, в какой папке этот файл должен быть. Как это работает сейчас – никак, как это работает в тестовой версии – тоже никак. Логично (?) было бы просто указать путь папки и Фар пусть сообразит, что от него требуется «папка\?псевдоимя?». Но этого нет – Фар говорит «нельзя редактировать папку».

Так внятно?

Re: Зачем нужен EF_CREATENEW?

Posted: Thu 14 Aug, 2008 16:12
by HaRT
Skirda
Прошу при изменениях также иметь в виду #231.

Re: Зачем нужен EF_CREATENEW?

Posted: Thu 14 Aug, 2008 16:53
by Skirda
NightRoman, заноси на мантис, со ссылкой на 231