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

Разработка Far.
User avatar
NightRoman
Posts: 6184
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 32 times
Been thanked: 62 times
Contact:

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

Post 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.
Это ОК. Но если я НЕ устанавливаю этот флаг, я не вижу никакой разницы – открывается редактор с несуществующим файлом, то же самое, как если бы я установил этот флаг. Возникает вопрос – зачем тогда этот флаг? (может я недоиспользую какую-то полезность, которую не понимаю).
dolzenko
Posts: 452
Joined: Wed 19 Apr, 2006 14:42
Location: Ростов-на-Дону

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

Post by dolzenko »

да уж, из 293 (?) сурцов плагинов что у меня есть только двое до такого додумались :)

\Translate\src\trans.cpp
\FARCmds\OpenCmd.cpp
User avatar
NightRoman
Posts: 6184
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 32 times
Been thanked: 62 times
Contact:

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

Post by NightRoman »

dolzenko_
В смысле, только в двух плагинах этот флаг используется? Или что-то другое ты имел в виду?

Хорошо бы разобраться и, если что, документацию уточнить. Но это мелочь, конечно.
dolzenko
Posts: 452
Joined: Wed 19 Apr, 2006 14:42
Location: Ростов-на-Дону

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

Post 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);
User avatar
NightRoman
Posts: 6184
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 32 times
Been thanked: 62 times
Contact:

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

Post by NightRoman »

Все-таки, в чем смысл флага? Документация FAR - туманная на эту тему, я интересуюсь для ясности в FAR.NET документации.

На багу де факто это не тянет, ибо никакого вреда от этого нет, но это все ж недочет и потеря времени "внимательных" читателей документации, которые, если они еще и "добросовестные" разработчики, могут проверять, что происходит при этом флаге ON\OFF.
User avatar
t-rex
Страшный и ужасный
Posts: 4910
Joined: Tue 15 Mar, 2005 16:17
Location: Tel-Aviv
Has thanked: 1 time
Been thanked: 8 times
Contact:

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

Post by t-rex »

Валя?
User avatar
Skirda
Posts: 3475
Joined: Wed 16 Mar, 2005 11:01
Been thanked: 8 times

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

Post 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:
We are the Borg. You will be assimilated.
So Say We All!
User avatar
NightRoman
Posts: 6184
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 32 times
Been thanked: 62 times
Contact:

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

Post 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()
User avatar
Skirda
Posts: 3475
Joined: Wed 16 Mar, 2005 11:01
Been thanked: 8 times

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

Post by Skirda »

NightRoman, проверь вот эту сборку
We are the Borg. You will be assimilated.
So Say We All!
User avatar
NightRoman
Posts: 6184
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 32 times
Been thanked: 62 times
Contact:

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

Post by NightRoman »

Проверяю, а что именно?
При пустом имени файла ошибки нет, Фар подставит ?New File?
При непустом откроет существующий или нет файл с указанным именем.
Флаг EF_CREATENEW пофигу.
Так должно быть?
User avatar
NightRoman
Posts: 6184
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 32 times
Been thanked: 62 times
Contact:

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

Post by NightRoman »

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

Другой вопрос попутно. Как бы "в заданной папке" открыть новый файл?
Варианты:
folder\?New File?
folder
не проходят:
- инвалидное имя
- нельзя редактировать папку
User avatar
Skirda
Posts: 3475
Joined: Wed 16 Mar, 2005 11:01
Been thanked: 8 times

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

Post by Skirda »

так, я уже совсем запутался... :evil:
можешь сформулировать внятно - что ты хочешь?

попутно... где-то здесь, на форуме, я предлагал расширить количество флагов, чтобы Info.Editor по своему поведению был немного похож на Це-функцию fopen.
возможно тогда вот это:
не проходят:
- инвалидное имя
- нельзя редактировать папку
...пройдет.
We are the Borg. You will be assimilated.
So Say We All!
User avatar
NightRoman
Posts: 6184
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 32 times
Been thanked: 62 times
Contact:

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

Post by NightRoman »

Разбираемся, чего и как хочется

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

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

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

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

Так внятно?
User avatar
HaRT
Moderator
Posts: 10806
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 220 times
Been thanked: 357 times

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

Post by HaRT »

Skirda
Прошу при изменениях также иметь в виду #231.
Фар есть инструмент, а не нянька. © 2009 DrKnS
User avatar
Skirda
Posts: 3475
Joined: Wed 16 Mar, 2005 11:01
Been thanked: 8 times

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

Post by Skirda »

NightRoman, заноси на мантис, со ссылкой на 231
We are the Borg. You will be assimilated.
So Say We All!
Post Reply

Return to “Development”