![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Взаимодействие дочерних форм в 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..."
в ходе компиляции ты никогда не получишь такое сообщение, потому что это ран-тайм сообщение
приведи фрагмент кода, где у тебя эти формы создаются ..