![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Подскажите message [D6, Win2k]
Андрусь © (2002-07-01 12:51:00)Уважуемый народ! Подскажите какой message идет в главную форму MDI приложения при закрытии дочерней формы. Зараннее спасибо!
Игорь Шевченко (2002-07-02 16:52:00) [1]Андрусь © (02.07.02 16:33)
Последний раз я был три года назад. Пиво понравилось, а Минск нравится всегда.
to All: извиняюсь за offtopic :-)
Андрусь (2002-07-02 16:33:00) [2]Насчёт пива - мы считаем,что оно у нас не очень,а пьём ваше :{.
Так что приехать разубедиться стоит.
Спасибо за помощь!
С пребольшим уважением,
Игорь Шевченко (2002-07-02 15:03:00) [3]Андрусь © (02.07.02 14:14)
Нет, не глупо. Пересылать тогда уж Handle загруженного пакета пакета, нужда в FindPackageByPackageID отпадет, так как умирающий Child будет пересылать ту информацию, которую можно сразу подать функции UnloadPackage.
> Как говорится - будете у нас на Колыме - заходите,милости
> просим:-)).
С удовольствием, мне у вас очень нравится. Жаль, повода нет приехать :-)))
Андрусь (2002-07-02 14:14:00) [4]Ясно,я так и думал. Как из child узнать пакет - пересылать через конструктор не слишком глупо?
Насчёт пива: У нас тут в Беларуси завтра День независимости - праздник. Настроение такое..
Как говорится - будете у нас на Колыме - заходите,милости просим:-)).
Игорь Шевченко (2002-07-02 14:11:00) [5]Андрусь © (02.07.02 14:00)
Тем более, оно (пиво) у вас очень даже неплохое :-)
Игорь Шевченко (2002-07-02 14:07:00) [6]Андрусь © (02.07.02 14:00)
Ее самому надо писать...Равно как и идентификаторы, однозначно идентифицирующие пакет...
Вашу задачу все-таки вам решать :-)
А пиво - с удовольствием :-)))
Андрусь (2002-07-02 14:00:00) [7]Извиняюсь,тут ещё моментик.Вот функцию-то FindPackageByPackageID что-то не найду.
С пребольшим уважением,
Андрусь (2002-07-02 13:23:00) [8]Спасибо, с меня пиво :-}!
С пребольшим уважением,
Игорь Шевченко (2002-07-02 12:59:00) [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 12:38:00) [10]Боьшое спасибо за помощь! Но вот тут ...
Короче,приношу свои извинения за то,что не сразу развернул всю задачу. Учитывая ваш опыт и знания не грех доспросить ещё чуток.
Суть то в чём:
Хочу сделать MDI через bpl. Каждая дочерняя форма в пакете. Как уже наверное стало понятно проблема в выгрузке пакета. Т.е.при закрытии дочерней формы нужно выгрузить пакет. Зараннее Большое спасибо! С пребольшим уважением,
Андрусь (2002-07-01 18:46:00) [11]Спасибо большое!
Игорь Шевченко (2002-07-01 15:05:00) [12]На 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 14:37:00) [13]Не совсем ясно,что на формкриэйт.Если не сложно, поясните.
И ещё,если не сложно,подскажите,откуда там проще вынуть имя закрывающейся формы. Спасибо большое!
С пребольшим уважением,
Игорь Шевченко (2002-07-01 13:59:00) [14]Ловить, естественно в перекрытой процедуре 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 13:29:00) [15]Извините,немного не доехал,и где мне его ловить? Спасибо ..
Игорь Шевченко (2002-07-01 13:10:00) [16]Маленькое дополнение: это сообщение идет MDIClient окну MDIFrame-формы. Самой же форме ничего не должно приходить, IMHO
Игорь Шевченко (2002-07-01 13:09:00) [17]WM_MDIDESTROY