Открытие выбранного файла в работающем приложении

{codecitation class=»brush: pascal; gutter: false;» width=»600px»}

Автор: Пангин Дмитрий Викторович

При программировании 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;

// проверено, работает.

{/codecitation}

Добавить комментарий