Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.10.09;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.038 c
14-1127143097
TUser
2005-09-19 19:18
2005.10.09
PCI-Express vs AGP


3-1124975931
TAN_K
2005-08-25 17:18
2005.10.09
QuickRep и поле QRMemo


14-1127121377
kot andrei
2005-09-19 13:16
2005.10.09
Украли ноутбук :(


1-1126791640
bokuto
2005-09-15 17:40
2005.10.09
Запуск архиватора


2-1125316634
Nox
2005-08-29 15:57
2005.10.09
Как извлеч корень N-ой степени?