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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.07.2010, 23:15   #1
Anfall
Форумчанин
 
Регистрация: 10.02.2009
Сообщений: 181
По умолчанию Открыть несколько файлов из проводника

Доброго времени суток всем.
Делаю программу. Из проводника надо открыть с помощью нее файлы.

Код:
procedure TForm1.FormCreate(Sender: TObject);
var
S: string; 
begin
  S:=paramstr(1); //добавляем файлы из проводника
  if fileexists(S) then
  listbox2.Items.Add(s);
Однако, если открываю сразу несколько файлов, то вместо того чтобы добавлять их в Listbox, открывается несколько копий моей программы.
Где ошибка? Как решить эту проблему?

Заранее благодарен!

Последний раз редактировалось Anfall; 22.07.2010 в 02:05.
Anfall вне форума Ответить с цитированием
Старый 22.07.2010, 00:41   #2
ZuBy
Участник клуба
 
Аватар для ZuBy
 
Регистрация: 29.09.2008
Сообщений: 1,234
По умолчанию

запрети второй запуск, на форуме полно примеров
ZuBy вне форума Ответить с цитированием
Старый 22.07.2010, 01:14   #3
Anfall
Форумчанин
 
Регистрация: 10.02.2009
Сообщений: 181
По умолчанию

Цитата:
Сообщение от ZuBy Посмотреть сообщение
запрети второй запуск, на форуме полно примеров
Запуск-то запретил. Но открывается только один файл(
Anfall вне форума Ответить с цитированием
Старый 22.07.2010, 01:37   #4
ZuBy
Участник клуба
 
Аватар для ZuBy
 
Регистрация: 29.09.2008
Сообщений: 1,234
По умолчанию

Цитата:
Сообщение от Anfall Посмотреть сообщение
Запуск-то запретил. Но открывается только один файл(
обработка должна идти до того как сработает защита (второй запуск)
ZuBy вне форума Ответить с цитированием
Старый 22.07.2010, 01:51   #5
Anfall
Форумчанин
 
Регистрация: 10.02.2009
Сообщений: 181
По умолчанию

Цитата:
Сообщение от ZuBy Посмотреть сообщение
обработка должна идти до того как сработает защита (второй запуск)
Спасибо) Попробую.

Хм. Все равно не работает. Один файл добавляет и все.
Использую:
Код:
if paramcount>0 then
begin
  S:=paramstr(1);
  if fileexists(S) then
  listbox2.Items.Add(s);
reopen;
end;

Последний раз редактировалось Anfall; 22.07.2010 в 01:58.
Anfall вне форума Ответить с цитированием
Старый 22.07.2010, 01:57   #6
ZuBy
Участник клуба
 
Аватар для ZuBy
 
Регистрация: 29.09.2008
Сообщений: 1,234
По умолчанию

Код:
var
  CheckEvent        : TEvent; // uses SyncObjs

    // пишется это в самом поекте, .dpr файле
    CheckEvent := TEvent.Create(nil, false, true, 'УНИКАЛЬНОЕ НАЗВАНИЕ');
    if CheckEvent.WaitFor(10) <> wrSignaled then Halt;
ZuBy вне форума Ответить с цитированием
Старый 22.07.2010, 02:04   #7
Anfall
Форумчанин
 
Регистрация: 10.02.2009
Сообщений: 181
По умолчанию

Цитата:
Сообщение от ZuBy Посмотреть сообщение
Код:
var
  CheckEvent        : TEvent; // uses SyncObjs

    // пишется это в самом поекте, .dpr файле
    CheckEvent := TEvent.Create(nil, false, true, 'УНИКАЛЬНОЕ НАЗВАНИЕ');
    if CheckEvent.WaitFor(10) <> wrSignaled then Halt;
Спасибо, но
Проверил -- аналогично(

Может где-то в другом ошибка у меня? Вот весь участок кода:
Код:
procedure TForm1.FormCreate(Sender: TObject);
var
S: string; 
begin

  S:=paramstr(1); //добавляем файлы из проводника
  if fileexists(S) then
  listbox2.Items.Add(s);

CreateMutex(Nil, True, '999'); //запрещаем повторный запуск
If GetLastError <> 0 Then
Begin
Halt;
End;
Anfall вне форума Ответить с цитированием
Старый 22.07.2010, 12:24   #8
ov_lab
Пользователь
 
Регистрация: 24.07.2009
Сообщений: 13
По умолчанию

Цитата:
Сообщение от Anfall Посмотреть сообщение
Спасибо, но
Проверил -- аналогично(

Может где-то в другом ошибка у меня?
Ошибка в том, что проводник для КАЖДОГО выделенного файла будет вызывать программу с параметром. Следовательно, алгоритм должен быть такой:
При запуске проверяем, первая ли это копия. Если да, создаем форму и помещаем ParamStr(1) в ListBox.
Если это вторая или последующие копии, то нужно каким-либо образом отыскать окно первой копии (например по уникальному классу окна) и передать ему ParamStr(1) например, через WM_COPYDATA или каким-то другим способом.
ov_lab вне форума Ответить с цитированием
Старый 22.07.2010, 12:40   #9
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

Пока писал, 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.
В юнит пишем
Код:
type
  TForm1 = class(TForm)
    ...
    ListBox2: TListBox;
    procedure FormCreate(Sender: TObject);
    procedure wmcopydata(var msg: twmcopydata); message wm_copydata;
    ...
  private
    { Private declarations }
  public
    { Public declarations }
  end;
...
procedure TForm1.wmcopydata(var msg: twmcopydata);
var
  s: string
begin
  if msg.copydatastruct <> nil then begin
    s := string(msg.copydatastruct^.lpdata);
    if fileexists(S) then
      ListBox2.Items.Add(s)
  end
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  S: string;
begin
  S:=paramstr(1); //добавляем файлы из проводника
  if fileexists(S) then
    listbox2.Items.Add(s);     
end;
eoln вне форума Ответить с цитированием
Старый 22.07.2010, 14:12   #10
Anfall
Форумчанин
 
Регистрация: 10.02.2009
Сообщений: 181
По умолчанию

Цитата:
Сообщение от eoln Посмотреть сообщение
Пока писал, 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.
В юнит пишем
Код:
type
  TForm1 = class(TForm)
    ...
    ListBox2: TListBox;
    procedure FormCreate(Sender: TObject);
    procedure wmcopydata(var msg: twmcopydata); message wm_copydata;
    ...
  private
    { Private declarations }
  public
    { Public declarations }
  end;
...
procedure TForm1.wmcopydata(var msg: twmcopydata);
var
  s: string
begin
  if msg.copydatastruct <> nil then begin
    s := string(msg.copydatastruct^.lpdata);
    if fileexists(S) then
      ListBox2.Items.Add(s)
  end
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  S: string;
begin
  S:=paramstr(1); //добавляем файлы из проводника
  if fileexists(S) then
    listbox2.Items.Add(s);     
end;
Спасибо огромное!
Anfall вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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