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

Вниз

Подскажите message   Найти похожие ветки 

 
Андрусь   (2002-07-01 12:51) [0]

Уважуемый народ! Подскажите какой message идет в главную форму MDI приложения при закрытии дочерней формы. Зараннее спасибо!


 
Игорь Шевченко ©   (2002-07-01 13:09) [1]

WM_MDIDESTROY


 
Игорь Шевченко ©   (2002-07-01 13:10) [2]

Маленькое дополнение: это сообщение идет MDIClient окну MDIFrame-формы. Самой же форме ничего не должно приходить, IMHO


 
Андрусь   (2002-07-01 13:29) [3]

Извините,немного не доехал,и где мне его ловить? Спасибо ..


 
Игорь Шевченко ©   (2002-07-01 13:59) [4]

Ловить, естественно в перекрытой процедуре WndProc для ClientHandle MDIFrame-формы.


type
TForm1 = class(TForm);
.....
procedure FormCreate(Sender: TObject);
private
FClientInstance : TFarProc;
FPrevClientProc : TFarProc;
procedure ClientWndProc(var Message: TMessage);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
FClientInstance := MakeObjectInstance(ClientWndProc);
FPrevClientProc := Pointer(GetWindowLong(ClientHandle,
GWL_WNDPROC));
SetWindowLong(ClientHandle,
GWL_WNDPROC, LongInt(FClientInstance));
end;

procedure TfMain.ClientWndProc(var Message: TMessage);
begin
with Message do
case Msg of
WM_MDIDESTROY:
begin
...........
{ Любая собственная обработка }
............
Result := CallWindowProc(FPrevClientProc,
ClientHandle,
Msg,
wParam,
lParam);
end;
else
Result := CallWindowProc(FPrevClientProc,
ClientHandle,
Msg,
wParam,
lParam);
end;
end;


С уважением,


 
Андрусь   (2002-07-01 14:37) [5]

Не совсем ясно,что на формкриэйт.Если не сложно, поясните.
И ещё,если не сложно,подскажите,откуда там проще вынуть имя закрывающейся формы. Спасибо большое!
С пребольшим уважением,


 
Игорь Шевченко ©   (2002-07-01 15:05) [6]

На FormCreate - замена стандартной процедуры своей.

Определить имя можно вызвав функцию FindControl со значением wParam сообщения WM_MDIDESTROY.
Например:


procedure TfMain.ClientWndProc(var Message: TMessage);
var
AText : array[0..MAX_PATH] of char;
AControl : TWinControl;
LogString : String;
begin
with Message do
case Msg of
WM_MDICREATE:
begin
Result := CallWindowProc(FPrevClientProc,
ClientHandle,
Msg,
wParam,
lParam);
LogString := "";
if GetWindowText(Result, AText, SizeOf(AText)) <> 0 then
LogString := Format("MDI child %s created", [AText]);
AControl := FindControl(Result);
if AControl <> nil then
LogString := LogString + " VCL component name is "+AControl.Name;
LogEvent(LogString);
end;
WM_MDIDESTROY:
begin
LogString := "";
if GetWindowText(wParam, AText, SizeOf(AText)) <> 0 then
LogString := Format("MDI child %s destroyed", [AText]);
AControl := FindControl(wParam);
if AControl <> nil then
LogString := LogString + " VCL component name is "+AControl.Name;
LogEvent(LogString);
Result := CallWindowProc(FPrevClientProc,
ClientHandle,
Msg,
wParam,
lParam);
end;
else
Result := CallWindowProc(FPrevClientProc,
ClientHandle,
Msg,
wParam,
lParam);
end;
end;


Где LogEvent - внешняя процедура, просто заносящая строку в некий TMemo.

С уважением,


 
Андрусь   (2002-07-01 18:46) [7]

Спасибо большое!


 
Андрусь   (2002-07-02 12:38) [8]

Боьшое спасибо за помощь! Но вот тут ...
Короче,приношу свои извинения за то,что не сразу развернул всю задачу. Учитывая ваш опыт и знания не грех доспросить ещё чуток.
Суть то в чём:
Хочу сделать MDI через bpl. Каждая дочерняя форма в пакете. Как уже наверное стало понятно проблема в выгрузке пакета. Т.е.при закрытии дочерней формы нужно выгрузить пакет. Зараннее Большое спасибо! С пребольшим уважением,


 
Игорь Шевченко ©   (2002-07-02 12:59) [9]

Я бы сделал так:
У главной формы (я надеюсь, она не в пакете ?:-))))
следал бы обработчик пользовательского сообщения.
const
WM_MDICHILDDESTROYED = WM_USER + 777;

type
TMainForm = class(TForm)
.....
private
procedure WMMDIChildDestroyed (var Message : TMessage); message WM_MDICHILDDESTROYED;

В MDIChild форме, неважно, в пакете она или где, в событии FormDestroy вставил бы строчку:

PostMessage (Application.MainForm.Handle, WM_MDICHILDDESTROYED,
PackageID,0);
Где packageid - некий идентиификатор того пакета, который больше не нужен и должен быть выгружен

И в главной форме:

procedure TMainForm.WMMDIChildDestroyed (var Message : TMessage);
var
PackageHandle : HMODULE;
begin
PackageHandle := FindPackageByPackageID(Message.Wparam);
if PackageHandle <> 0 then
UnloadPackage(PackageHandle);
end;

Разумеется, возможны варианты...

С уважением,


 
Андрусь   (2002-07-02 13:23) [10]

Спасибо, с меня пиво :-}!
С пребольшим уважением,


 
Андрусь ©   (2002-07-02 14:00) [11]

Извиняюсь,тут ещё моментик.Вот функцию-то FindPackageByPackageID что-то не найду.
С пребольшим уважением,


 
Игорь Шевченко ©   (2002-07-02 14:07) [12]

Андрусь © (02.07.02 14:00)

Ее самому надо писать...Равно как и идентификаторы, однозначно идентифицирующие пакет...

Вашу задачу все-таки вам решать :-)

А пиво - с удовольствием :-)))


 
Игорь Шевченко ©   (2002-07-02 14:11) [13]

Андрусь © (02.07.02 14:00)

Тем более, оно (пиво) у вас очень даже неплохое :-)


 
Андрусь ©   (2002-07-02 14:14) [14]

Ясно,я так и думал. Как из child узнать пакет - пересылать через конструктор не слишком глупо?

Насчёт пива: У нас тут в Беларуси завтра День независимости - праздник. Настроение такое..
Как говорится - будете у нас на Колыме - заходите,милости просим:-)).


 
Игорь Шевченко ©   (2002-07-02 15:03) [15]

Андрусь © (02.07.02 14:14)

Нет, не глупо. Пересылать тогда уж Handle загруженного пакета пакета, нужда в FindPackageByPackageID отпадет, так как умирающий Child будет пересылать ту информацию, которую можно сразу подать функции UnloadPackage.


> Как говорится - будете у нас на Колыме - заходите,милости
> просим:-)).


С удовольствием, мне у вас очень нравится. Жаль, повода нет приехать :-)))


 
Андрусь ©   (2002-07-02 16:33) [16]

Насчёт пива - мы считаем,что оно у нас не очень,а пьём ваше :{.
Так что приехать разубедиться стоит.
Спасибо за помощь!
С пребольшим уважением,


 
Игорь Шевченко ©   (2002-07-02 16:52) [17]

Андрусь © (02.07.02 16:33)

Последний раз я был три года назад. Пиво понравилось, а Минск нравится всегда.

to All: извиняюсь за offtopic :-)



Страницы: 1 вся ветка

Текущий архив: 2002.07.15;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.014 c
8-47617
Yoga
2002-02-28 22:39
2002.07.15
Графика


1-47528
Arthur1
2002-07-04 14:06
2002.07.15
Как получить путь зущеной программы.


3-47107
Леонид
2002-06-12 21:09
2002.07.15
два вопроса


8-47613
Olgerd
2002-03-01 19:48
2002.07.15
Эффект Допплера


1-47270
qd5
2002-06-28 23:52
2002.07.15
Вызов процедуры