Форум: "Основная";
Текущий архив: 2005.08.07;
Скачать: [xml.tar.bz2];
ВнизВзаимодействие дочерних форм в MDI-приложении Найти похожие ветки
← →
Starter © (2005-07-20 12:13) [0]По роду деятельности я не кодер, поэтому мой вопрос может показаться дилетантским.
Имеем две MDIChild-формы: Form2 и Form3, как осуществить
Form2.edit1.Text:=Form3.Edit2.Text;?
При компиляции подобного кода вылазит "Access violation at address..." Как буд-то я уже уничтожил Form2, хотя обе они в это момент открыты...
← →
Юрий Зотов © (2005-07-20 12:27) [1]Ну, чудес же не бывает? Вроде как, не бывает. Значит, либо Form2, либо Form3 содержит битую ссылку.
Код нужно видеть.
← →
Digitman © (2005-07-20 12:27) [2]
> При компиляции подобного кода вылазит "Access violation
> at address..."
в ходе компиляции ты никогда не получишь такое сообщение, потому что это ран-тайм сообщение
приведи фрагмент кода, где у тебя эти формы создаются ..
← →
evvcom © (2005-07-20 12:29) [3]
> в ходе компиляции ты никогда не получишь такое сообщение
А может у него компилятор "битый"?
← →
Плохиш © (2005-07-20 12:33) [4]
> Starter © (20.07.05 12:13)
> По роду деятельности я не кодер
Это следует понимать, что теория тебе неинтересна и книжки читать не барское дело?
← →
Starter © (2005-07-20 12:55) [5]Вру конечно про компилятор (от жары наверное), компилится все на ура.
Создаем форму 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 некоторое значение из таблицы Table2procedure TSBForm.DBGrid1DblClick(Sender: TObject);
var i: Integer;
begin
AddRMForm.Edit10.Text:=MainForm.Table2Nomer.AsString;//На этом этапе вылетает AV
Close;
end;
Т.е из AddRMForm(fsMDIChild) я вызвал SBForm(fsMDIChild) и хочу из SBForm передать некоторое значение в AddRMForm
← →
Digitman © (2005-07-20 13:04) [6]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) [7]//Плохиш ©
//Это следует понимать, что теория тебе неинтересна и книжки читать не барское дело?
Из 1070 стр. книги Архангельского "Программирование в Delphi5", например, вопросу MDI-приложений реально посвящены от силы 5 стр. И реальной инфы по этому вопросу за 3 три дня я нашел с гулькин нос. И на форум я полез не для того чтобы развлечся!
прошу прощения за offtop
← →
Starter © (2005-07-20 13:13) [8]Этот момент я уяснил. Чтоже сейчас, придется глобальную объявлять?
← →
evvcom © (2005-07-20 13:25) [9]
> придется глобальную объявлять?
Так если компилятор скушал твой код, она уже где-то объявлена!
← →
Плохиш © (2005-07-20 13:46) [10]
> Starter © (20.07.05 13:04) [7]
Для "не кодера" достаточно убрать из текста строчку
var AddRMForm: TAddRmForm;
> evvcom © (20.07.05 13:25) [9]
> Так если компилятор скушал твой код, она уже где-то объявлена!
Не "где-то", а в полне определённом месте известного модуля ;-)
← →
Digitman © (2005-07-20 13:47) [11]
> придется глобальную объявлять?
можно вообще ничего не объявлять, все уже и так объявлено
родительская 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;
← →
Starter © (2005-07-20 14:22) [12]Большое спасибо Digitman"у все заработало как надо! Всем спасибо за внимание!
← →
msguns © (2005-07-20 14:23) [13]>Имеем две MDIChild-формы: Form2 и Form3, как осуществить
Возник идиотский вопрос: а какой великий смысл сокрыт в том, чтобы из одной дочерней формы открывать другую дочернюю. Ведь эдак можно из главной формы открыть 3 "старшие" дочки и в каждой из них по три "младшие". И как потом разбираться в том, "кто на ком стоит" ?
ИМХО, если нужна "цепочка", то либо "третьи" формы создаются как модальные, либо отказаться от MDI в сторону SDI.
И попутно вопрос: как решен вопрос с элементами управления ? Из главной можно управлять любой дочкой либо там только одна кнопка "Close", а все дочери спроектированы по принципу "Omnium mea mento portu" ("Все свое ношу с собой") ?
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2005.08.07;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.034 c