Форум: "Основная";
Текущий архив: 2005.10.09;
Скачать: [xml.tar.bz2];
ВнизMDI-прога и запуск зарегенных за ней файлов Найти похожие ветки
← →
Bonjovy (2005-09-19 08:44) [0]Есть MDI-прога (редактор). Открывает в себе несколько дочерних окон редактируемых файлов. Привязал в системе за ней определённый тип файлов. При FormCreate прога проверяет, запущена ли она уже (ищет своё окно), чтобы не плодить себя.
При запуске зарегенных файлов в проге проверяется ParamStr(1), и если енто свой тип файлов, то открывает его на редактирование. Но это работает только для первого запуска. При щелчке на somefile1.my_type стартует моя прога и в ней открывается этот файл. Но при щелчке на somefile2.my_type второй файл уже не открывается, т.к. в FormCreate определяется, что прога уже запущена и закрывает себя (вторую копию проги). Каким макаром передавать в первый экземпляр проги имя somefile2.my_type из второго экземпляра проги, чтобы в ней было уже два (и т.д.) открытых файла (ну типа как в Winworde)? Очень буду признателен. Спасибо.
← →
Котик Б (2005-09-19 09:14) [1]Слать первой форме сообщение WM_COPYDATA
← →
Bonjovy (2005-09-19 09:45) [2]Ну тогда и обработчик надо переопределить? А чё в нём писать?
Я сделал так":
в FormCreate: Application.OnMessage := AppMessage;
+
procedure TTestEditorForm.AppMessage(var Msg: TMsg; var Handled: Boolean);
begin
if Msg.message = WM_USER+1 then
begin
Open(StrPas(PChar(Msg.lParam)));
Handled := True;
beep;
end;
end;
В FormCreate пишу: SendMessage(Wnd_первой_проги, WM_USER+1, 0, DWord(@s) ) - не работает. В чём дело?
← →
Defunct © (2005-09-19 10:09) [3]Если с определением значения "Wnd_первой_проги" у тебя проблем не возникает. тогда внимательтно перечитай [1].
WM_COPYDATA... а не WM_USER+1...
← →
Bonjovy (2005-09-19 10:54) [4]Братцы, ну примерчик киньте, чего-то не догоняю.
proc FormCreate...;
var
...
st: string;
MyData: PCOPYDATASTRUCT;
begin
st:=ParamStr(1);
MyData.dwData:=0;
MyData.cbData:=Length(st);
MyData.lpData:=@st;
SendMessage(Wnd_первой_проги, WM_COPYDATA, Handle, MyData);// тут материться на несовпадение типов, делаю DWORD(MyData) ошибка на стадии выполнения выскакивает.
...
end;
В обработчике [2] заменил WM_USER+1 yf WM_COPYDATA.
А может и обработчик не так я переопределил и не так его сделал?
Пожалуйста, живой примерчик киньте, а?
← →
Котик Б (2005-09-19 11:17) [5]
var
wnd: HWND;
cds: COPYDATASTRUCT;
begin
.........
if (0 <> wnd)
then begin
// Формируем буфер для пересылки
cds.dwData := 0;
cds.cbData := Length(ParamString);
cds.lpData := PChar(ParamString);
SendMessage(wnd, WM_COPYDATA, 0, LPARAM(@cds))
end;
end;
← →
Leonid Troyanovsky © (2005-09-19 11:49) [6]
> Bonjovy (19.09.05 09:45) [2]
> в FormCreate: Application.OnMessage := AppMessage;
..
> В FormCreate пишу: SendMessage
Во-первых, OnMessage обрабатывает то, что Post*Message.
Второе тебе уже объяснили.
--
Regards, LVT.
← →
Bonjovy (2005-09-19 12:01) [7]Большущий всем рахмет, а также огромное спасибо, всё заработало.
Особый привет Котику Б. :)
← →
Bonjovy (2005-09-19 13:05) [8]В принципе всё работает, но только если я в SendMessage(Wnd, WM_COPYDATA, 0, LPARAM(@cds)) ставлю Wnd:=$FFFF. А если реальный Wnd главного окна первого экземпляра, то не работает. Стопудово уверен на счёт правильности Wnd, т.к. проверял, да и ShowWindow(Wnd, SW_SHOWNORMAL) отрабатывает - первый экземпляр раскрывается, если был свёрнут. Но мессага не всасывается через этот Wnd. В принципе, не суть важно, и так пашет, но охота разобраться, в чём здесь дело.
Котик Б., на тебя надежда. :)
← →
Leonid Troyanovsky © (2005-09-19 15:02) [9]
> Bonjovy (19.09.05 13:05) [8]
> В принципе всё работает, но только если я в SendMessage(Wnd,
> WM_COPYDATA, 0, LPARAM(@cds)) ставлю Wnd:=$FFFF. А если
> реальный Wnd главного окна первого экземпляра, то не работает.
> Стопудово уверен на счёт правильности Wnd, т.к.
Два первых утверждения стопудово доказывают неправильность Wnd.
--
Regards, LVT.
← →
Bonjovy (2005-09-19 16:26) [10]Лёня, ты конечно монстр, но давай по делу. При старте первого экземпляра в FormCreate мне ShowMessage(IntToStr(Form.Handle)) пишет хендл. Когда второй экземпляр перебирает окна, то то, что он находит, я сравниваю с первым - в копьё совпадают! А не работает этот Wnd в вызове SendMessage хоть тресни! Чё за лажа? Может знаешь? Thanks.
← →
Leonid Troyanovsky © (2005-09-19 17:11) [11]
> Bonjovy (19.09.05 16:26) [10]
> экземпляра в FormCreate мне ShowMessage(IntToStr(Form.Handle))
> пишет хендл. Когда второй экземпляр перебирает окна, то
> то, что он находит, я сравниваю с первым - в копьё совпадают!
Давай по существу: где прописан обработчик WM_COPYDATA?
--
Regards, LVT.
← →
Bonjovy (2005-09-19 17:14) [12]УУффф, надыбал лажу. Девствительно, Wnd был не окна, а Application-a.
Спасибо всем, кто принимал в дискуссии участие. Оперативный форум, ничего не скажешь! И последняя ложечка мёда - в [5] надо вместо cds.cbData := Length(ParamString); писать cds.cbData := Length(ParamString)+1;, иначе ни хрена не работает. Век живи - век учись!
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2005.10.09;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.013 c