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


Автор: gambit 18.12.2006, 19:54
Может вопрос тупой но мне интересно.
Когда перетаскиваем файл с исходником на компилятор, то запускается этот компилятор и компилирует именно тот исходник который на тнего перетащили.
Я написал прогу, перетаскиваю на нее файл и она просто запускается. т.е. чистая без того файла.

Автор: Sartorius 18.12.2006, 19:58
ииии smile  Он просто в командной строке передается

Автор: gambit 18.12.2006, 20:12
Что иииии. Как реализовать то.

Автор: Sartorius 18.12.2006, 20:34
gambit, я ж те написал 
Цитата

Он просто в командной строке передается 

Автор: Snowy 18.12.2006, 20:36
filename := ParamStr(1);

Автор: Alexeis 18.12.2006, 20:59
Цитата(Snowy @  18.12.2006,  20:36 Найти цитируемый пост)
filename := ParamStr(1);

Неа не так.
Вот так smile
Код

for i := 1 to ParamCount 
do
  filename := filename + ParamStr(i) + ' ';


p.s. Если путь к файлу содержит пробелы, то тогда строка разбивается на несколько фрагментов.

Автор: bems 18.12.2006, 21:06
Цитата(alexeis1 @  18.12.2006,  20:59 Найти цитируемый пост)
Если путь к файлу содержит пробелы, то тогда строка разбивается на несколько фрагментов. 
не правило. но отчего зависит не знаю

Автор: Sartorius 18.12.2006, 21:07
bems, иногда в кавычки заключается. Тада не разбивается

Автор: Alexeis 18.12.2006, 21:19
Цитата(bems @  18.12.2006,  21:06 Найти цитируемый пост)
не правило

Может и не правило, но мой вариант всегда прокатывает, а первый не всегда. Я сам наступил на эти грабли, так что говорю по своему опыту  smile

Добавлено @ 21:23 
Не знаю как вы туда кавычки добавляете... это же система сама передает. Вот только что еще раз протесил. Все пути содержащие пробел делятся по пробелам.

Автор: Nicholas_S 18.12.2006, 21:45
alexeis1, если передать в качестве параметра строку "c:\my dir\file name.txt", то пробелы не будут служить разделителями, поэтому можно использовать ParamStr(1).

Автор: VICTAR 18.12.2006, 22:05
alexeis1, а если в командной строке несколько файлов, то какая же мешанина получится в filename?!

Автор: Snowy 18.12.2006, 22:11
Если нужна вся коммандная строка целиком, то не нужно ничего склеивать:
Код
  filename := GetCommandLine;
Но это не требуется - все параметры должны резаться.
Если файлов несколько, то
Код
var
  i:  integer;
begin
  for i := 1 to ParamCount do
    MyProc(ParamStr(i));
end;
и в MyProc нужно уже брать имя файла и делать с ним что нужно.

Автор: Alexeis 18.12.2006, 22:14
Цитата(VICTAR @  18.12.2006,  22:05 Найти цитируемый пост)
alexeis1, а если в командной строке несколько файлов, то какая же мешанина получится в filename?! 

Не уверен, скорее всего запустятся несколько экземпеляров приложения.

Цитата(Nicholas_S @  18.12.2006,  21:45 Найти цитируемый пост)
если передать в качестве параметра строку "c:\my dir\file name.txt", то пробелы не будут служить разделителями, поэтому можно использовать ParamStr(1). 

Ситуация несколько иная :
Цитата(gambit @  18.12.2006,  19:54 Найти цитируемый пост)
Я написал прогу, перетаскиваю на нее файл и она просто запускается. т.е. чистая без того файла. 


Автор: VICTAR 18.12.2006, 22:24
И все-таки, правильно делать так, как говорит Snowy, хотя иногда(очень редко) это не срабатывает... 

Автор: bems 18.12.2006, 23:59
Цитата(alexeis1 @  18.12.2006,  21:19 Найти цитируемый пост)
 это же система сама передает. Вот только что еще раз протесил. Все пути содержащие пробел делятся по пробелам. 
система вообще передает строку целиком. Отсюда и разные разделители у разных программ

Автор: Snowy 19.12.2006, 02:02
Цитата(VICTAR @  18.12.2006,  22:24 Найти цитируемый пост)
отя иногда(очень редко) это не срабатывает... 
Если это не сработает, значит коммандная строка составлена неправильно.
Но в данном случае это исключено smile

Автор: VICTAR 19.12.2006, 07:15
Хотя, если, программа открывает определенный тип файла(закрепленный за ней), то при регистрации своего расширения можно заключить параметр %1 в кавычки. Тогда уж точно не будет никаких проблем с пробелами.

Автор: Snowy 19.12.2006, 09:37
Не нужно ничего заключать.
Винда сама всё правильно сделает.
Лишние кавычки только напортачут.

ЗЫ. Насчёт нескольких файлов - это мы нагородили.
Файл всегда один - в ParamStr(1), ну или не одного smile
Если бросят несколько файлов, то запустится несколько экземпляров программы - по одному на каждый файл.

Автор: gambit 19.12.2006, 09:48
А приятно когда вопрос так обсуждают.

Автор: VICTAR 19.12.2006, 11:19
Не хочу никого обидеть, и все-таки:
Цитата

Не нужно ничего заключать.
Винда сама всё правильно сделает.
Лишние кавычки только напортачут.

Один раз мне помогли только кавычки, прога упорно не хотела открывать файл, и дело оказалось как раз в пробеле в пути к файлу.
Цитата

ЗЫ. Насчёт нескольких файлов - это мы нагородили.
Файл всегда один - в ParamStr(1), ну или не одного 
Если бросят несколько файлов, то запустится несколько экземпляров программы - по одному на каждый файл. 

Должен запуститься один экземпляр программы и все параметры передадутся в него 
соответсвенно в ParamStr(i). Это легко проверить, например загружая имя каждого файла в Memo.

Автор: Snowy 19.12.2006, 11:50
Цитата(VICTAR @  19.12.2006,  11:19 Найти цитируемый пост)
Один раз мне помогли только кавычки, прога упорно не хотела открывать файл, и дело оказалось как раз в пробеле в пути к файлу.
Сейчас проверил - нормально всё передаётся.

Цитата(VICTAR @  19.12.2006,  11:19 Найти цитируемый пост)
Должен запуститься один экземпляр программы и все параметры передадутся в него соответсвенно в ParamStr(i).
Это если бросить на ярлык.
А, если по ассоциации, то только один.

Добавлено @ 11:52 
Код для проверки:
Код

procedure TForm1.FormCreate(Sender: TObject);
var i: integer;
begin
  with Memo1.Lines do begin
    Add('Params: ' + IntToStr(ParamCount));
    for i := 1 to ParamCount do Add(ParamStr(i));
  end;
end;
Бросаем на форму TMemo. Создаём у формы OnCreate.
Компилим.
Ярлык на ехе бросаем на стол.
Переносим несколько файлов из Program Files или Моих Документов (или т.п.).

Автор: VICTAR 19.12.2006, 11:56
Да, извиняюсь, погорячился. Я как раз и имел ввиду перетащить, а не открыть...

Автор: Alexeis 19.12.2006, 12:55
Не понял, разве есть разница между тем чтобы кидать файлы на ярлык или на саму программу? Или речь идет о запуске при помощи меню правой кнопки т.е. через ассоциации. 

Автор: Snowy 19.12.2006, 13:12
Цитата(alexeis1 @  19.12.2006,  12:55 Найти цитируемый пост)
Не понял, разве есть разница между тем чтобы кидать файлы на ярлык или на саму программу?
Конечно есть.
В первом случае программа запускается и пути к файлам передаются ей в коммандной строке.
Во втором случае программа должна реализовывать механизм Drag&Drop для принятия файлов.

Цитата(alexeis1 @  19.12.2006,  12:55 Найти цитируемый пост)
Или речь идет о запуске при помощи меню правой кнопки т.е. через ассоциации. 
А ассоциации - третий способ smile
Здесь вопрос о перетаскивании на ярлык программы.
То есть самый простой из данных способов (по реализации разумеется).

Автор: Alexeis 19.12.2006, 13:19
Блин неправильно сказал.  Я имел ввиду другое есть ли разница перетащить файлы на экзешник или на ярлык к экзешнику. Вроде должно быть все равно.

Автор: Snowy 19.12.2006, 13:22
Разумеется. В данном случае разницы нет.
Просто обычно на рабочий стол бросают ярлыки smile

Автор: Alexeis 19.12.2006, 13:39
Прикольно! 2000 винда запихивает весь путь в один параметр, а вот домашняя хрюшаСП2 разбивает путь к файлу по пробелам, в результате чего один файл может состоять из 3-х и более параметров!

Автор: Snowy 19.12.2006, 13:52
У меня хомякSP2 - передаёт корректно.

Автор: Alexeis 19.12.2006, 14:12
Цитата(Snowy @  19.12.2006,  13:52 Найти цитируемый пост)
У меня хомякSP2 - передаёт корректно. 

Блин! Опять глюк делфей  smile 

Автор: bems 19.12.2006, 14:26
Цитата(alexeis1 @  19.12.2006,  14:12 Найти цитируемый пост)
Блин! Опять глюк делфей
это почему?

Автор: gambit 19.12.2006, 15:40
Не знаю как у вас а у меня в ParamStr(1) все как надо.

Добавлено @ 15:44 
А когда кидаю 2 файла. открывается одна копия проги. Все супер спасибо всем.

Автор: Alexeis 19.12.2006, 15:52
Цитата(bems @  19.12.2006,  14:26 Найти цитируемый пост)
это почему?

А может и винды... Но все равно могли бы и учесть.

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