Пангин Дмитрий Викторович прислал письмо следующего содержания: При программировании 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
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;