Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.011 c
3-47190
Explorer
2002-06-19 09:01
2002.07.15
Данные из MSSQL в dbf


7-47843
DiGiTaL
2002-04-20 18:10
2002.07.15
Как поместить свою программу в Виндовую автозагрузку?


14-47731
Nevercomes
2002-06-11 20:05
2002.07.15
Мастера, помогите пожалуйста!


1-47476
ruslan_as
2002-07-03 14:47
2002.07.15
Открыть Excel-файл при помощи компонента на вкладке Servers


3-47076
MsGuns
2002-06-19 23:08
2002.07.15
Как заюзать QBE вместо SQL в T...Query ?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский