Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Задача на сообразительность


Автор: Alex 13.9.2005, 14:25
Не запуская Delphi скажите, что будет на экране после выполнения кода:
Код

procedure TfrmMain.Button1Click(Sender: TObject);
begin
  SaveDialog1.FileName:= '1/test.txt';
  SaveDialog1.Execute;
end;


PS:
Диалог имеет настройки по умолчанию.

Автор: Quadr0 13.9.2005, 14:41
...

Автор: Alex 13.9.2005, 15:02
smile Еще какие будут мнения?

Автор: Rrader 13.9.2005, 15:09
Ошибка должна быть, если файл не будет существовать. smile
Добавлено @ 15:10
А он и так не существует, путь неверный. smile
Добавлено @ 15:11
Аж в Delphi страшно смотреть правду... smile

Автор: ~FoX~ 13.9.2005, 15:42
Ничего не будет - строка не соответствует OPENFILENAME структуре, функция GetSaveFileName вернет какой то там еррор и SaveDialog1.Execute не выполниться.
Только я прикола не понял... smile

Автор: Quadr0 13.9.2005, 16:31
...

Автор: ~FoX~ 13.9.2005, 16:47
Quadr0
Точно не помню но по вроде в структуру передается lpstrfile в которой разделитель может быть только '\' или '.' и еще какойто если MultySelect есть. Могу ошибаться конечно. Вобщем если путь указан не верно, то вызывается CommDlgExtendedError и это, типа опа приплыли - никаких вам диалогов. smile
За подробностями в МСДН, мне лениво искать сегодня.

Автор: Akella 13.9.2005, 17:04
исключительная ситуация, что-то типа Cannot create file

Автор: Alex 13.9.2005, 20:36
Ладно, дело было так. Ваш покорный слуга решил сегодня в 10 утра проверить ключевые моменты работы программы, которую сегодня заказчику показывать нужно было. Одним из таких моментов является экспорт отчетных документов в разные форматы, Проверяю, мне показывают форму настройки экспорта и по ее закрытию должен показываться пресловутый SaveDialog, но этого почему-то не происходит. Генератор отчета и его функции экспорта я использую FastReport 3, чертыхаясь, лезу в исходники (благо есть), ставлю точки останова и начинаю офигевать. Доходит до метода SaveDialog1.Execute, идет на его выполнение и тут же не показывая диалога вываливается с отрицательным результатом. 4 часа длятся пляски с бубном и ощущение, что крыша сейчас уедет, т.к. понять сие действие просто не реально. Пробуются все теории, которые только могли придти ко мне в голову и голову Петровичу. Результат ноль. В три часа путем уже невероятных шаманских действий замечаю, что единственную настройку SaveDialog, которую делают разработчики FR это передача названия файла по умолчанию, смотрю, что же там хранится. По совершенно глупейшей ошибке в путь попадает "/". Каким образом FR загружал шаблон отчета в пути, которого был "/" я не понял досих пор, но то, что SaveDialog даже не ругается на такой путь, а просто грохается это кошмар, он даже в GetLastError возвращает 0. Бардак в общем smile

Автор: p0s0l 13.9.2005, 21:33
Мда... Бывает же smile

Цитата(Alex @ 13.9.2005, 20:36)
Каким образом FR загружал шаблон отчета в пути, которого был "/" я не понял досих пор
Хмм... Странно, но CreateFile спокойно съедает такие пути, можно работать с таким именем... В MSDN же поэтому поводу ничего не нашел, только что имя файла не должно содержать слэш...

Цитата(Alex @ 13.9.2005, 20:36)
он даже в GetLastError возвращает 0
А CommDlgExtendedError возвращает FNERR_INVALIDFILENAME...

Автор: Alex 13.9.2005, 21:48
Цитата(p0s0l @ 13.9.2005, 22:33)
А CommDlgExtendedError возвращает FNERR_INVALIDFILENAME

Буду знатьт. Спасибо
Добавлено @ 21:53
Цитата(p0s0l @ 13.9.2005, 22:33)
Хмм... Странно, но CreateFile спокойно съедает такие пути, можно работать с таким именем... В MSDN же поэтому поводу ничего не нашел, только что имя файла не должно содержать слэш...

Самое странное, что я в FR по ошибке подавал "E:\Prog_on_Delphi\Work\Svet\Rep/Склад Товарная накладная.fr3", а правильный путь должен был быть "E:\Prog_on_Delphi\Work\Svet\Rep\Склад Товарная накладная.fr3" и как он открывал этот файл для меня загадка

Автор: Snowy 13.9.2005, 23:03
А винда какая было?
XP свободно съедает как досявые, так и линуксовые пути.
Прямой слэш имеет явно линуксовое происхождение.
9х явно такой путь не съедят, а XP без проблем.

Автор: Alex 13.9.2005, 23:08
Винда ХР SP2 и все обновления, которые доступны на сегодняшний день

Автор: Snowy 13.9.2005, 23:29
Значит нужно в исходняках SaveDialog'a порыться - где-то он неверно строку парсит.
По идее коресь в FR, но это обычная ситуация для времен кросплатформенности.

Автор: Alex 13.9.2005, 23:53
А что там особенно ковыряться? SaveDialog они дергают стандартный, а если смотреть его исходники, то там идет самая обыкновенная заполнения массива данных и передача этого массива на вход Win Api функции вызова диалога, а в ней уже и отваливаемся.

А FR, тоже ничего криминального не делает и не парсит:
Код

function TfrxReport.LoadFromFile(const FileName: String;
  ExceptionIfNotFound: Boolean = False): Boolean;
var
  f: TFileStream;
begin
  Clear;
  FFileName := '';
  Result := FileExists(FileName);
  if Result or ExceptionIfNotFound then
  begin
    f := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);
    try
      LoadFromStream(f);
      FFileName := FileName;
    finally
      f.Free;
    end;
  end;
end;

Добавлено @ 23:57
На самом деле даже вот такой код:
Код

if FileExists('E:\Prog_on_Delphi\Work\Svet\Rep/Склад Товарная накладная.fr3') then
    ShowMessage('');

возвратит истину. Получается, что FindFirstFile, на котором построена FileExists находит файл и спокойно может с ним работать.

Автор: Alex 14.9.2005, 00:03
В принцыпе если так внимательно на все посмотреть, то единственным узким местом, на которое нарвались разработчики FR оказалась функция ExtractFileName, которая просто не готова к таким путям в отличии от всех системных функций

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)