Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Взаимодействие дочерних форм в MDI-приложении [D5, WinXP]


Starter ©   (2005-07-20 12:13:00) 

По роду деятельности я не кодер, поэтому мой вопрос может показаться дилетантским.
Имеем две MDIChild-формы: Form2 и Form3, как осуществить
Form2.edit1.Text:=Form3.Edit2.Text;?
При компиляции подобного кода вылазит "Access violation at address..." Как буд-то я уже уничтожил Form2, хотя обе они в это момент открыты...


msguns   (2005-07-20 14:23:00) [1]

>Имеем две MDIChild-формы: Form2 и Form3, как осуществить

Возник идиотский вопрос: а какой великий смысл сокрыт в том, чтобы из одной дочернейформы открывать другую дочернюю. Ведь эдак можно из главной формы открыть 3 "старшие" дочки и в каждой из них по три "младшие". И как потом разбираться в том, "кто на ком стоит" ?
ИМХО, если нужна "цепочка", то либо "третьи" формы создаются как модальные, либо отказаться от MDI в сторону SDI.

И попутно вопрос: как решен вопрос с элементами управления ? Из главной можно управлять любой дочкой либо там только одна кнопка "Close", а все дочери спроектированы по принципу "Omnium mea mento portu" ("Все свое ношу с собой") ?


Starter   (2005-07-20 14:22:00) [2]

Большое спасибо Digitman'у все заработало как надо! Всем спасибо за внимание!


Digitman   (2005-07-20 13:47:00) [3]


> придется глобальную объявлять?


можно вообще ничего не объявлять, все уже и так объявлено

родительская MDI-форма имеет св-во MDIChildren, которое предст.собой список всех существующихдочерних MDI-форм, в этом списке ты и найдешь свою форму .. останется только привести ее тип к типу TAddRMForm, после чего можно спокойно обратиться к элементам формы

with MainForm do
for i:= 0 to MDIChildCount - 1 do
 if MDIChildren[i] is TAddRMForm then
   begin
     TAddRMForm(MDIChildren[i]).Edit10.Text:= ..;
     break; // закомментарить, если искомых форм искомого класса предполагается более одной
   end;


Плохиш   (2005-07-20 13:46:00) [4]


> Starter ©   (20.07.05 13:04) [7]

Для "не кодера" достаточно убрать из текста строчку

var AddRMForm: TAddRmForm;


> evvcom ©   (20.07.05 13:25) [9]
> Так если компилятор скушал твой код, она уже где-тообъявлена!

Не "где-то", а в полне определённом месте известного модуля ;-)


evvcom   (2005-07-20 13:25:00) [5]


> придется глобальную объявлять?

Так если компилятор скушал твой код, она уже где-то объявлена!


Starter   (2005-07-20 13:13:00) [6]

Этот момент я уяснил. Чтоже сейчас, придется глобальную объявлять?


Digitman   (2005-07-20 13:04:00) [7]

procedure TRMForm.ToolButton2Click(Sender: TObject);
var AddRMForm: TAddRmForm; //это локальная переменная !!
begin
AddRMForm:=TAddRMForm.Create(Application);
AddRMForm.Caption:='Форма';
end;

время жизни лок.переменной равно времени жизни п/программы, в котором эта переменная объявлена

ты создал форму класса TAddRMForm, ссылку на  созданную форму записал в лок.переменную и благополучно потерял эту переменную

а далее ты пишешь :

AddRMForm.Edit10.Text:= ..

здесь уже, очевидно, речь идет либо о статическойпеременной либо о поле класса .. ни то ни другое у тебя никогда не содержали никаких ссылок на форму, ибо ты ничего туда не записывал, но при этом сейчас почему-то пытаешься через AddRMForm сослаться на форму


Starter   (2005-07-20 13:04:00) [8]

//Плохиш ©
//Это следует понимать, что теория тебе неинтересна и книжки читать не барское дело?

Из 1070 стр. книги Архангельского "Программирование в Delphi5", например, вопросу MDI-приложений реально посвящены от силы 5 стр. И реальной инфы по этому вопросу за 3 три дня я нашел с гулькин нос. И на форум я полез не для того чтобы развлечся!

прошу прощения за offtop


Starter   (2005-07-20 12:55:00) [9]

Вру конечно про компилятор (от жары наверное), компилится все на ура.
Создаем форму AddRMForm:
procedure TRMForm.ToolButton2Click(Sender: TObject);
var AddRMForm: TAddRmForm;
begin
AddRMForm:=TAddRMForm.Create(Application);
AddRMForm.Caption:='Форма';
end;

аналогично создаем форму SBForm:
procedure TAddRMForm.SpeedButton1Click(Sender: TObject);
var SBForm: TSBForm;
begin
 SBForm:=TSBForm.Create(Application);
end;

В этой форме по событию возвращаем AddRMForm.Edit10.Text некоторое значение из таблицы Table2
procedure TSBForm.DBGrid1DblClick(Sender: TObject);
var i: Integer;
begin
AddRMForm.Edit10.Text:=MainForm.Table2Nomer.AsString;//На этом этапе вылетает AV
Close;
end;

Т.е из AddRMForm(fsMDIChild) я вызвал SBForm(fsMDIChild) и хочу из SBForm передать некоторое значение в AddRMForm


Плохиш   (2005-07-20 12:33:00) [10]


> Starter ©   (20.07.05 12:13)  
> По роду деятельности я не кодер

Это следует понимать, что теория тебе неинтересна и книжки читать не барское дело?


evvcom   (2005-07-20 12:29:00) [11]


> в ходе компиляции ты никогда не получишь такое сообщение

А может у него компилятор "битый"?


Юрий Зотов   (2005-07-20 12:27:00) [12]

Ну, чудес же не бывает? Вроде как, не бывает. Значит, либо Form2, либо Form3 содержит битую ссылку.

Код нужно видеть.


Digitman   (2005-07-20 12:27:00) [13]


> При компиляции подобного кода вылазит "Access violation
> at address..."


в ходе компиляции ты никогда не получишь такое сообщение, потому что это ран-тайм сообщение

приведи фрагмент кода, где у тебя эти формы создаются ..


Наверх

Титульная страница Поиск, карта сайта Написать письмо