Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 5 486

/ вопрос решён /

Здравствуйте эксперты!
Столкнуля с такой проблемой: при открытии нескольких файлов через мою программу открывается несколько копий моей программы, что посоветуете?

Примечание #1 (7 июля 2011, 14:43):
В данном случае при открытие файла в листбокс заносится полное имя файла.
Но получается что все открытые файлы по одному заносятся в разные лситбоксы из разных копий програмы

ierihon1 Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задал: ierihon1 (статус: 1-ый класс)
Вопрос отправлен: 7 июля 2011, 14:40
Состояние вопроса: решён, ответов: 2.

Ответ #1. Отвечает эксперт: Вадим К

Здравствуйте, ierihon1!
идем по этой ссылке и читаем о использовании WM_COPYDATA

Ответ отправил: Вадим К (статус: Академик)
Время отправки: 7 июля 2011, 14:53
Оценка за ответ: 5

Ответ #2. Отвечает эксперт: min@y™

Эта задача состоит из нескольких частей:


  1. Регистрация расширения файла в реестре, чтобы по клику на такой файл запускалась именно твоя прога.
  2. Недопущение запуска второй копии программы.
  3. Активация (разворот, вывод на передний план) окна 1-й копии программы.
  4. Передача 1-й копии программы имени файла от 2-й копии для открытия после завершения.

1-й пункт - я тут выкладывал модуль в функциями для этого. Воспользуйся.

2-й пункт настолько уже заезжен и пережёван, что в интернете примеры валяются на каждом углу. Могу дать свой пример, если нужно.

3-й пункт делается так: от второй копии программы для первой копии посылается специальное сообщение, а его обработчик в первой копии активизирует главное окно приложения примерно так:
procedure TSourceEditorMainForm.AppEventsMessage(var Msg: tagMSG;
  var Handled: Boolean);
begin
  // Активирование первой копии приложения по сообщению от второй копии
  if Msg.message = ActivateMessage
    then begin
           Application.Restore();
           Application.BringToFront();
         end;
end;
Так как это сообщение является межпрограммным, прога должна отличать такие сообщения от чужих. Поэтому ему надо присвоить уникальный идентификатор:
ActivateMessage:= RegisterWindowMessage(OneInstActivateMessage);

4-й пункт с лёгкостью делается с помощью посылки имени файла через сообщение WM_COPYDATA. У меня это выглядит так:
// Передача командной строки в первую копию программы
procedure SendCommandLine;
var
  PrevMainFormHandle: THandle; // Хэндл формы предыд. копии программы
  FileName: string;
  Len: Integer;
  Data: TCopyDataStruct; // Структура для передачи
  Buffer: array[0..MAX_PATH - 1] of Char; // Буфер для передачи
begin
  FileName:= ParamStr(1);
  Len:= Length(FileName);
 
  if not FileExists(FileName) or (Len > MAX_PATH)
    then Exit;
 
  PrevMainFormHandle:= FindWindow('TSourceEditorMainForm', nil);
 
  if PrevMainFormHandle = 0
    then Exit;
 
  //Buffer:= FileName;
  FillChar(Buffer, SizeOf(Buffer), #0);
  Move(FileNAme[1], Buffer[0], Len);
  Data.dwData:= 0;
  Data.cbData:= SizeOf(Buffer);
  Data.lpData:= @Buffer;
  SendMessage(PrevMainFormHandle, WM_COPYDATA, 0, Integer(@Data));
end;
 
// Обработчик сообщения WM_COPYDATA для принятия
// командной строки из второй копии программы
procedure TSourceEditorMainForm.WmCopyData(var Msg: TWMCopyData);
var
  AFileName: string;
  Buffer: PChar;
  UserCancelled: Boolean;
begin
 
  Buffer:= PChar(Msg.CopyDataStruct.lpData);
  AFileName:= string(Buffer);
 
  // Открытие проекта или файла
  if AnsiLowerCase(ExtractFileExt(AFileName)) = ProjectFileExt
    then ProjectTreeView.OpenProject(AFileName)
    else ProjectTreeView.OpenFile(AFileName, UserCancelled);
end;

Полностью dpr-файл программы лежит тут.

Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 7 июля 2011, 15:17
Оценка за ответ: 5


Мини-форум вопроса

Всего сообщений: 12; последнее сообщение — 7 июля 2011, 15:40; участников в обсуждении: 3.
Вадим К

Вадим К (статус: Академик), 7 июля 2011, 14:50 [#1]:

по запросу "недопустить запрос второй копии программы delphi" гуглится очень много, пробовали?
Галочка "подтверждения прочтения" - вселенское зло.
ierihon1

ierihon1 (статус: 1-ый класс), 7 июля 2011, 14:51 [#2]:

да пробовал но там только запрет на создание второй копии.. это не совсем то.. если просто запретить то прога больше одного файл не примет.
Вадим К

Вадим К (статус: Академик), 7 июля 2011, 14:55 [#3]:

Статья там правда о билдере, но это не меняет сути.
Галочка "подтверждения прочтения" - вселенское зло.
ierihon1

ierihon1 (статус: 1-ый класс), 7 июля 2011, 14:56 [#4]:

что то я не совсем понял... Можете пояснить? только на делфи)
Вадим К

Вадим К (статус: Академик), 7 июля 2011, 14:57 [#5]:

я тоже не понимаю, что Вы не понимаете:).
Галочка "подтверждения прочтения" - вселенское зло.
ierihon1

ierihon1 (статус: 1-ый класс), 7 июля 2011, 14:59 [#6]:

во первых не понял как использовать WM_COPYDATA в делфи и не понял с какими параметрами нужно передать данные в в программу из копии)
Вадим К

Вадим К (статус: Академик), 7 июля 2011, 15:02 [#7]:

Цитата (ierihon1):

во первых не понял как использовать WM_COPYDATA
это такое сообщение, через которое можно послать указатель в другое приложение и он будет действительным:) единственное (на сколько мне известно)

Цитата (ierihon1):

и не понял с какими параметрами нужно передать данные в в программу из копии)

а передать нужно всего то один параметр - файл, который нужно открыть.
Посмотрите ещё на этот пример http://www.delphisources.ru/pages/faq/base/wm_cd_link.html
Галочка "подтверждения прочтения" - вселенское зло.
ierihon1

ierihon1 (статус: 1-ый класс), 7 июля 2011, 15:08 [#8]:

Ну попробую воплотить этот пример в жизнь и кажется начинает доходить)
ierihon1

ierihon1 (статус: 1-ый класс), 7 июля 2011, 15:23 [#9]:

Как отправить информацию в программу я разобрался осталось отследить запуск копии)
min@y™

min@y™ (статус: Доктор наук), 7 июля 2011, 15:26 [#10]:

Кстати, к такой проге не мешало бы добваить ещё и обработчик сообщения WM_DROPFILES для комплекта.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
ierihon1

ierihon1 (статус: 1-ый класс), 7 июля 2011, 15:27 [#11]:

Уже есть) Но с ним проблем нет)
ierihon1

ierihon1 (статус: 1-ый класс), 7 июля 2011, 15:40 [#12]:

Ура заработало))) Всем спасибо)

7 июля 2011, 15:41: Статус вопроса изменён на решённый (изменил автор вопроса — ierihon1)

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:43
Выполнено за 0.03 сек.