![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Управление окнами в MDI-приложении [D6, D7, Win2k, WinXP]
Магнит © (2004-07-20 22:30:00)Раньше я как-то над этим не задумывался, а теперь ломаю голову....как?
Если, допустим, в MDI-приложении, из главной формы, открыть две дочернии, то как из одной дочерней формы управлять другой?
Могу только обращаться к переменным, а к свойствам объектов не могу :-(
Zlod3y (2004-07-22 14:18:00) [1]Плохиш - братан :о) с меня пЫво
Плохиш (2004-07-22 14:09:00) [2]
> Zlod3y (22.07.04 13:50) [18]
Если ты действительно в TForm2 пишешь TForm3.Create( self), то при закрытии TForm3 пиши TForm2(owner).Enable := true.
Zlod3y (2004-07-22 13:50:00) [3]Да нет же!
допустим, в проекте 3 формы: Form1, Form2 и Form3
From1 - MDIForm
From2 и Form3 - MDIChild
на From1 есть меню, по выбору какого-то пункта открывается From2 (TForm2.Create(self)), на From2 есть кнопка, по нажатию на которую From2 делается Form2.Enabled:=False и открывается Form3 (TForm3.Create(self))...при закрытии Form3 нужно чтобы происходила такая вещь -> Form2.Enabled:=True
Как это реализовать я не пойму... :-(
Bacuc (2004-07-21 12:14:00) [4]Как я понял, проблема состоит в том, что обращаться к дочерней форме? Если да, то я обошел это так:
1. Описываю функцию поиска дочернего окна по его заголовку:
function TForm1.SearchForm(TextCaption: string): integer;
var i,k: integer;
begin
k:=-1;
for i:=MDIChildCount-1 downto 0 do
if MDIChildren[i].Caption=TextCaption then k:=i;
Result:=k;
end;
2. А затем обращаюсь к окну:
if SearchForm('Form1')<>-1 then
MDIChildren[SearchForm('Form1')].Enabled:=True;
Show;
3. Можно обращаться к объектам формы Form1, например к Edit1:
if SearchForm('Form1')<>-1 then
(MDIChildren[SearchForm('Form1')] as Form1).Edit1.Text='EditText';
Gero (2004-07-21 12:06:00) [5]
> uses Form1;
> Form1.Enabled:=True;
?
Магнит (2004-07-21 07:48:00) [6]unit Unit2;
.....
uses Form1;
.....
procedure TForm2.Close(Sender: TObject);
begin
Form1.Enabled:=True;
end;
Gero (2004-07-21 01:22:00) [7]
> Магнит (21.07.04 00:59)
Скорее всего проблема не из-за Enabled.
Приведи весь код OnClose.
Магнит (2004-07-21 00:59:00) [8]ну обычное дело "Access violation" и т. д.....
Gero (2004-07-21 00:39:00) [9]
> Но ругается на Form1.Enabled:=True там
Русским матом ругается или может какие-то сообщения выдает?
Магнит (2004-07-21 00:36:00) [10]да знаю я! Но ругается на Form1.Enabled:=True там
Gero (2004-07-21 00:32:00) [11]Тогда придется написать его в обработчике OnClose формы Form2.
Магнит (2004-07-21 00:28:00) [12]хыы...понятное дело, но надо что-бы это Form1.Enabled:=True было написано в обработчике OnClose формы Form2
Gero (2004-07-21 00:15:00) [13]Form1.Enabled := True;
Магнит (2004-07-21 00:04:00) [14]Опишу проблему подробнее:
из дочерней(Form1) формы запускается ещё одна дочерняя(Form2), надо что-бы дочерняя(Form1) была Form1.Enabled:=True;
Магнит (2004-07-20 23:59:00) [15]в локальной процедуре всё нормально, не ругается, а вот когда глобально его описываю, то ругается.....где тогда этот тип опысывать? и как?
Заранее благодарю.
Алхимик (2004-07-20 23:54:00) [16]
> ругается на "Form: TMyMDIChild;"
T MyMDIChild
Тип описал?
:))
Магнит (2004-07-20 23:52:00) [17]ругается на "Form: TMyMDIChild;"
Gero (2004-07-20 23:41:00) [18]
> если наверняка можно обращаться по имени формы
Можно, но по указателю на нее обращаться будет проще.
var
Form: TMyMDIChild;
begin
Form := TMyMDIChild.Create;
Form.Caption := 'Hello';
end;
Магнит (2004-07-20 23:05:00) [19]да я смотрел уж давно, но не врубаюсь... нафига обращаться к окну по какому-то одному компьютеру известному номеру, если наверняка можно обращаться по имени формы
AlexG (2004-07-20 22:56:00) [20]Используй ActiveMDIChild, MDIChildCount и MDIChildren. Подробней смотри в помощи.