Форум: "Основная";
Текущий архив: 2002.07.15;
Скачать: [xml.tar.bz2];
ВнизПодскажите 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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.013 c