Открытие выбранного файла в уже работающем приложении
Открытие выбранного файла в уже работающем приложении
Открытие выбранного файла в уже работающем приложении Автор: Пангин Дмитрий Викторович При программировании MDI-приложений возникает следующая задача: Если пользователь кликнул на файле, тип которого поддерживается создаваемым приложением, то, если приложение уже запущено, не нужно запускать новую копию приложения, а нужно открыть выбранный файл в уже работающем приложении. Я сделал это так (возможно есть более красивое решение): // В файле проекта: var i: integer; hMainForm: hwnd; copyDataStruct: TCopyDataStruct; ParamString: string; WParam, LParam: integer; begin // ищем главное окно приложения, вместо Caption - nil, // поскольку к заголовку главного окна может добавиться заголовок MDIChild // (нужно позаботиться об уникальности имени класса главной формы) hMainForm := FindWindow(?TMainForm?, nil); if hMainForm = 0 then begin Application.Initialize; Application.CreateForm(TFrmMain, frmMain); for i := 1 to ParamCount do TMainForm(Application.MainForm).OpenFile(ParamStr(i)); Application.Run; end else begin ParamString := ??; for i := 1 to ParamCount do begin // запихиваем все параметры в одну строку с разделителями ?13 ParamString := ParamString + ParamStr(i) + #13; end; // создаем запись типа TCopyDataStruct CopyDataStruct.lpData := PChar(ParamString); CopyDataStruct.cbData := Length(ParamString); CopyDataStruct.dwData := 0; WParam := Application.Handle; LParam := Integer(@CopyDataStruct); // отсылаем сообщение WM_COPYDATA главному окну открытого приложения SendMessage(hMainForm, WM_CopyData, WParam, LParam); Application.Terminate; end; end. // Обработчик сообщения WM_COPYDATA procedure TMainForm.CopyData(var Msg: TWMCopyData); var ParamStr: string; CopyDataStructure: TCopyDataStruct; i: integer; len: integer; begin CopyDataStructure := Msg.CopyDataStruct^; ParamStr := ??; len := CopyDataStructure.cbData; for i := 0 to len - 1 do begin ParamStr := ParamStr + (PChar(CopyDataStructure.lpData) + i)^; end; i := 0; while not (Length(ParamStr) = 0) do begin if isDelimiter(#13, ParamStr, i) then begin OpenFile(Copy(ParamStr, 0, i - 1)); ParamStr := Copy(ParamStr, i + 1, Length(ParamStr) - i - 1); end; inc(i); end; inherited; end; // проверено, работает.