Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.07.2010, 20:39   #11
Anfall
Форумчанин
 
Регистрация: 10.02.2009
Сообщений: 181
По умолчанию

eoln,
Проверил в новом проекте - все работает. В уже существующем почему-то не добавляются файлы (только один). Есть подозрения, что или программа не принимает их, или не отправляет. Какие могут быть конфликты? Уже все перепробовал(
Anfall вне форума Ответить с цитированием
Старый 22.07.2010, 20:52   #12
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

Цитата:
SendMessage(FindWindow('TForm1', 'Form1'), $004A{WM_COPYDATA}, 0, LParam(@CopyDataStruct));
Вместо 'TForm1' пишем свои данные, а именно класс из главного юнита, например,
Код:
type
  TForm1{это класс} = class(TForm) 
type
  TForm1 = class(TForm)
    ListBox2: TListBox;
    procedure FormCreate(Sender: TObject);
...
А также вместо 'Form1' свой заголовок окна (см. свойство Caption у главной формы)
eoln вне форума Ответить с цитированием
Старый 22.07.2010, 22:37   #13
Anfall
Форумчанин
 
Регистрация: 10.02.2009
Сообщений: 181
По умолчанию

Цитата:
Сообщение от eoln Посмотреть сообщение
Вместо 'TForm1' пишем свои данные, а именно класс из главного юнита, например,
Код:
type
  TForm1{это класс} = class(TForm) 
type
  TForm1 = class(TForm)
    ListBox2: TListBox;
    procedure FormCreate(Sender: TObject);
...
А также вместо 'Form1' свой заголовок окна (см. свойство Caption у главной формы)
Спасибо огромное. Наверное ошибка в caption главной формы. Я думал форм1 - это имя формы, а не заголовок.
Anfall вне форума Ответить с цитированием
Старый 05.09.2010, 19:20   #14
HellMercenariess
Форумчанин
 
Аватар для HellMercenariess
 
Регистрация: 27.07.2009
Сообщений: 547
По умолчанию

[QUOTE=eoln;579675]Пока писал, ov_lab уже опередил.
Например, такой способ. В файле проекта пишем
Код:
program Project1;

uses
  Forms, Windows,
  Unit1 in 'Unit1.pas' {Form1};

{$R *.res}

var
  CopyDataStruct : TCopyDataStruct;
  S: string;
begin
  CreateMutex(Nil, True, '999'); //запрещаем повторный запуск
  if GetLastError = ERROR_ALREADY_EXISTS then begin
Сюда
    S:=paramstr(1); //добавляем файлы из проводника
    CopyDataStruct.cbData := Length(S)+1;
    CopyDataStruct.lpData := PChar(S);
    //далее отсылаем предыдущей копии команду на добавление
    SendMessage(FindWindow('TForm1', 'Form1'), $004A{WM_COPYDATA}, 0, LParam(@CopyDataStruct));
    halt
  end;
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.
Странно, передаю на открытие много файлов, но условие срабатывает только один раз..
В секцию после условия, должно попадать столько же раз сколько и файлов передается-1* ?

*для первого запуска
"Виновник этого парада,он не дурак, ушел как надо!" Похороны панка.

Последний раз редактировалось HellMercenariess; 05.09.2010 в 19:23.
HellMercenariess вне форума Ответить с цитированием
Старый 05.09.2010, 20:10   #15
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

Для нескольких файлов нужен цикл для каждого параметра, либо всё сразу передать и потом распарсить в процедуре TForm1.wmcopydata.
Код:
program Project1;

uses
  Forms, Windows,
  Unit1 in 'Unit1.pas' {Form1};

{$R *.res}

var
  CopyDataStruct : TCopyDataStruct;
  S: string;
  i: integer;
begin
  CreateMutex(Nil, True, '999'); //запрещаем повторный запуск
  if GetLastError = ERROR_ALREADY_EXISTS then begin
    for i := 1 to paramcount do begin
      S:=paramstr(i); //добавляем файлы из проводника
      CopyDataStruct.cbData := Length(S)+1;
      CopyDataStruct.lpData := PChar(S);
      //далее отсылаем предыдущей копии команду на добавление
      SendMessage(FindWindow('TForm1', 'Form1'), $004A{WM_COPYDATA}, 0, LParam(@CopyDataStruct))
    end;
    halt
  end;
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.
В процедуре TForm1.FormCreate также нужен цикл
eoln вне форума Ответить с цитированием
Старый 06.09.2010, 03:28   #16
HellMercenariess
Форумчанин
 
Аватар для HellMercenariess
 
Регистрация: 27.07.2009
Сообщений: 547
По умолчанию

Цитата:
Сообщение от eoln Посмотреть сообщение
Для нескольких файлов нужен цикл для каждого параметра
Код:
program Project1;

uses
  Forms, Windows,
  Unit1 in 'Unit1.pas' {Form1};

{$R *.res}

var
  CopyDataStruct : TCopyDataStruct;
  S: string;
  i: integer;
begin
  CreateMutex(Nil, True, '999'); //запрещаем повторный запуск
  if GetLastError = ERROR_ALREADY_EXISTS then begin
    for i := 1 to paramcount do begin
      S:=paramstr(i); //добавляем файлы из проводника
      CopyDataStruct.cbData := Length(S)+1;
      CopyDataStruct.lpData := PChar(S);
      //далее отсылаем предыдущей копии команду на добавление
      SendMessage(FindWindow('TForm1', 'Form1'), $004A{WM_COPYDATA}, 0, LParam(@CopyDataStruct))
    end;
    halt
  end;
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.
Итак, имеемс две проблемы:
1 при посылке 7 файлов ParamCount=1
2 при первом запуске, в скобки после условия совсем не попадаем, хоть и передается не один файл
"Виновник этого парада,он не дурак, ушел как надо!" Похороны панка.
HellMercenariess вне форума Ответить с цитированием
Старый 06.09.2010, 17:00   #17
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

Не знаю в чём причина... возможно, не туда или не так отсылаешь сообщения али ещё чего. У меня нормально работает (см. аттач). Запуск через командную строку
Код:
project1.exe file1 file2 file3 "file 4"
файлы из нескольких слов заключаем в кавычки, если запуск идёт через батник и содержит русские буквы, то не забываем сохранять батник в DOS-кодировке.
Вложения
Тип файла: rar tmp4.rar (171.9 Кб, 31 просмотров)
eoln вне форума Ответить с цитированием
Старый 07.09.2010, 01:53   #18
HellMercenariess
Форумчанин
 
Аватар для HellMercenariess
 
Регистрация: 27.07.2009
Сообщений: 547
По умолчанию

Скачал вашу наброску, закинул файлы:

"Виновник этого парада,он не дурак, ушел как надо!" Похороны панка.
HellMercenariess вне форума Ответить с цитированием
Старый 07.09.2010, 19:35   #19
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

HellMercenariess, я же писал что запускать через командную строку.
ПУСК - выполнить - CMD, жмём ENTER, переходим в папку программы и там пишем (или же через командную строку командера)
Код:
project1.exe "файл 1" "файл 2" "файл 3"
А то что показано на картинке, так это вроде было сделано командой "ОТКРЫТЬ С ПОМОЩЬЮ" - в этом случае всегда откроется только один файл.
Если нужно, например, как в медиа плеере обработать несколько файлов, то надо зарегистрировать программу в реестре и писать dll для этого.
Либо просто привязать тип файлов к программе(открыть с помощью - выбор программы(выбираем нашу программу) - использовать её для всех файлов такого типа), при следующем открытии группы файлов всё работает. Также можно подправить некоторые строчки в реестре (например заменить плеер своей программой, чтоб не мучаться в настройках), ну возможно есть и другие варианты... выбирайте на вкус и цвет

Последний раз редактировалось eoln; 07.09.2010 в 19:38. Причина: арфаграфичиские ашипки
eoln вне форума Ответить с цитированием
Старый 08.09.2010, 10:24   #20
HellMercenariess
Форумчанин
 
Аватар для HellMercenariess
 
Регистрация: 27.07.2009
Сообщений: 547
По умолчанию

Цитата:
Сообщение от eoln Посмотреть сообщение
Если нужно, например, как в медиа плеере обработать несколько файлов, то надо зарегистрировать программу в реестре и писать dll для этого.
Наконец-то прояснилось в чем суть да дело!)
Где можно почитать мануал на эту тему ? Там немало всяких нюансов..

Цитата:
я же писал что запускать через командную строку.
ПУСК - выполнить - CMD, жмём ENTER, переходим в папку программы и там пишем (или же через командную строку командера)
подразумевается же делать проги для юзеров(возможно не очень прочуханых), а не для самого себя только

Цитата:
Также можно подправить некоторые строчки в реестре
Мучил реестр минут 40, финально пробовал подменять wmp.exe - дописывал в название .bak, так винда откуда-то опять рожает родимый файл..
"Виновник этого парада,он не дурак, ушел как надо!" Похороны панка.
HellMercenariess вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вложить в письмо несколько файлов Freerider1972 Microsoft Office Excel 0 06.05.2010 18:57
Несколько файлов в одном архиве boostman Общие вопросы Delphi 1 06.12.2009 11:22
Сохоанить, Сохранить как, Открыть несколько элементов в одном файле Polotenchik Общие вопросы Delphi 9 01.08.2009 13:37
Как обработать несколько файлов? never_mind Microsoft Office Excel 3 28.01.2009 11:57
Открыть просмотр скрытых файлов? KurtWagner Общие вопросы Delphi 3 24.01.2009 21:13