Вопрос по delphi

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by DooD, 18 Mar 2011.

  1. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    442
    Reputations:
    288
    Доброго времени суток.Вопрос в следующем:
    сделал ассоциацию с файлами и мне надо чтобы программа открывающая эти файлы запускалась с определенной папки,тоесть чтобы пути не менялись.По сути я сделал это,но когда открываю файл,пишет-"синтаксическая ошибка в имени файла,имени папки или метке тома"и затем программа запускается из директории откуда я открывал файл(посмотрел через getcurrentdir).непойму в чем дело.прошу помощи.
     
    #1 DooD, 18 Mar 2011
    Last edited: 18 Mar 2011
  2. Steam[777]

    Steam[777] Elder - Старейшина

    Joined:
    27 Sep 2010
    Messages:
    296
    Likes Received:
    43
    Reputations:
    25
    вот это весьма большие сомнения вызывает.
    Покажи, что ParamStr(0) пишет ( вместо getcurrentdir ) - сразу будет видно,откуда твой exe стартовал
     
  3. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    442
    Reputations:
    288
    сам экзэшник запускается из нужной папки,но получается что путь меняется на тот где я файл открываю.такое у меня было с сохранением и решал я это так memo1.Lines.SaveToFile((extractfilepath(paramstr(0)) +( '123'))) а тут не знаю как быть
     
  4. Steam[777]

    Steam[777] Elder - Старейшина

    Joined:
    27 Sep 2010
    Messages:
    296
    Likes Received:
    43
    Reputations:
    25
    Попробуй переформулировать вопрос,а то я и не знаю,что и ответить то...
     
  5. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    442
    Reputations:
    288
    ну смотри приведу пример на opendialog:
    например запустил я программу по пути C:\program files\123.exe
    через нее открываю файл по пути C:\1.txt и путь получается теперь C:\ а надо чтобы был C:\program files\
    тоесть надо толи файл копировать к экзэшнику то ли еще как то,вот я и незнаю что делать.могу привести сами процедуры если надо
     
  6. Jingo Bo

    Jingo Bo Member

    Joined:
    25 Oct 2009
    Messages:
    368
    Likes Received:
    51
    Reputations:
    7
    Что за бред с копированием? Windows правильно делает что меняет тебе текущую папку при открытии, что бы поставить прежнюю(папку твоей проги) воспользуйся вот этим кодом к примеру :
    Windows.SetCurrentDirectory(PAnsiChar(ExtractFilePath(Application.ExeName)));
     
    1 person likes this.
  7. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    442
    Reputations:
    288
    ок.попробую-отпишусь.

    Помогло.Спасибо за код.забыл я что то про ету апишку:)
     
    #7 DooD, 19 Mar 2011
    Last edited: 19 Mar 2011
  8. Steam[777]

    Steam[777] Elder - Старейшина

    Joined:
    27 Sep 2010
    Messages:
    296
    Likes Received:
    43
    Reputations:
    25
    При запуске программы GetCurrentDir будет указывать на каталог,в котором лежит exe.
    После использования OpenDialog, GetCurrentDir встанет на каталог, в котором был открыт файл.

    Если тебе нужна директория, содержащая .exe, используй ExtractFilePath(ParamStr(0)) - вернет адрес каталога,в котором лежит сам .exe, вне зависимости от того,какой файл(в каком каталоге) ты открыл через OpenDialog
     
  9. AlexTheC0d3r

    AlexTheC0d3r Elder - Старейшина

    Joined:
    25 Jul 2008
    Messages:
    388
    Likes Received:
    179
    Reputations:
    18
    чтобы работать с последней рабочей папкой, убери свой тон, если сам НЕХЕРА не разбираешься
     
  10. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    442
    Reputations:
    288
    все ребят не ссорьтесь, Jingo Bo помог.Тему можно закрывать.
     
  11. Jingo Bo

    Jingo Bo Member

    Joined:
    25 Oct 2009
    Messages:
    368
    Likes Received:
    51
    Reputations:
    7
    Во я лоханулся)
     
  12. AlexTheC0d3r

    AlexTheC0d3r Elder - Старейшина

    Joined:
    25 Jul 2008
    Messages:
    388
    Likes Received:
    179
    Reputations:
    18
    А по-твоему я получу относительный путь, если CurrentDir изменится? Ohhh.. Lol.
    лучше промолчи в следующий раз, а?
    И если уж по-твоему, то для того и придумали относительный путь, чтобы пользоваться им, когда нельзя использовать абсолютный.

    Охарактеризую твой предыдущий и до этого пост:
     
  13. AlexTheC0d3r

    AlexTheC0d3r Elder - Старейшина

    Joined:
    25 Jul 2008
    Messages:
    388
    Likes Received:
    179
    Reputations:
    18
    Ты спросил "Зачем?"
    Тебе не пришло в голову элементарное: затем!
    Да потому что изменилась рабочая папка (по-дефолту откуда у нас стартовала программа на ту, что мы указали при работе с диалогом.)

    Впредь понял, что лучше тебя игнорить, чем доказывать ЭЛЕМЕНТАРНЫЕ вещи, которые тебе не нравятся.
     
  14. AlexTheC0d3r

    AlexTheC0d3r Elder - Старейшина

    Joined:
    25 Jul 2008
    Messages:
    388
    Likes Received:
    179
    Reputations:
    18
    Потому что мы ожидали этого, т.к. работаем теперь с другой папкой.
     
  15. AlexTheC0d3r

    AlexTheC0d3r Elder - Старейшина

    Joined:
    25 Jul 2008
    Messages:
    388
    Likes Received:
    179
    Reputations:
    18
    Лол. Говнить? В чем говнокод?
    Говнокод как раз-таки в StringList.SaveToFile('result.txt').
    Сохранять туда, куда программа посчитает нужным (по-дефолту в текущую рабочую папку).
    Считая говнокодерами других, сам же им и являешься, или ты считаешь StringList.SaveToFile('result.txt') - идеально правильной конструкцией?


    ИМХО я везде использую конструкцию вида StringList.SaveToFile(GetCurrentDir + '\result.txt')
     
  16. arnis

    arnis Member

    Joined:
    30 Jan 2011
    Messages:
    280
    Likes Received:
    23
    Reputations:
    0
    Если хочеш чтобы сохраняло в папке с программой топиши так StringList.SaveToFile(extractFilePath(paramStr(0))+'result.txt');
     
  17. AlexTheC0d3r

    AlexTheC0d3r Elder - Старейшина

    Joined:
    25 Jul 2008
    Messages:
    388
    Likes Received:
    179
    Reputations:
    18
    Надеюсь это не мне.

    Разница в читаемости кода.
     
  18. AlexTheC0d3r

    AlexTheC0d3r Elder - Старейшина

    Joined:
    25 Jul 2008
    Messages:
    388
    Likes Received:
    179
    Reputations:
    18
    Потому что это баг.
    http://msdn.microsoft.com/en-us/library/community/history/system.windows.forms.openfiledialog.aspx?id=3

    А выхода висты, семерки - это было удобно.

    Ой ой ой.. Спасите меня.

    Code:
    StreamWriter write = new StreamWriter(@"C:\Program Files\alalal.txt");
                write.Write("a;a;;a;a");
                write.Close();
    17:47 - создала файл и записала
    17:48 - записала
    17:49 - записала
    17:50 - записала
    Мб это как-то связано с фазой луны? АААААА!!! точно, я ведь под учеткой администратора!!! Как же я сразу не додумался.

    И вот сейчас не надо включать, а ведь не все работают на компе под админом (страшно что-то стало иметь возможность записивать или копироват или что уж там, удалять(!) из папки Program Files!!!), а у тебя еще небось и UAC включен. Ой ой ой. Нельзя мне доверять корпоративные приложения для тупых быдлоюзеров.

    кодить на Delphi, и не верить его основам. Пиздец, горожане

    ParamStr(0) Всегда!!!!!!!!!! ВСЕГДАААААА!! Диск/путь/исполняемая программа. Да, я Ванга.
     
  19. Jingo Bo

    Jingo Bo Member

    Joined:
    25 Oct 2009
    Messages:
    368
    Likes Received:
    51
    Reputations:
    7
    В том что сказал бред)
    Сколько лет пишу - не знал о такой опции в TOpenDialog, всегда думал что так и должно быть.
    Я вообще использую тоже похожий код, когда нужно сохранить или загрузить файл, который использует для своих нужд программа(настройки и т.д.) потому что :
    - Тупил с тем OpenDialog/SaveDialog, теперь не буду.
    - Потому что программа может использовать плагины или сторонние библиотеки, которые могут во время работы изменить текущую директорию.
     
  20. HakaR

    HakaR Active Member

    Joined:
    23 Jul 2009
    Messages:
    301
    Likes Received:
    200
    Reputations:
    3
    ЛОЛШТО?

    Если ты имел ввиду GetModuleFileName(), то смотрим код функции ParamStr()
    PHP:
    function ParamStr(IndexInteger): string;
    ...
      if 
    Index 0 then
        SetString
    (ResultBufferGetModuleFileName(0BufferSizeOf(Buffer)))
    ...
    Sosnooley