Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.08.07;
Скачать: CL | DM;

Вниз

Взаимодействие дочерних форм в 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 некоторое значение из таблицы 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


 
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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.029 c
14-1121326554
Kolan
2005-07-14 11:35
2005.08.07
Пора оновлять этот сайт.


3-1120116915
Apachi
2005-06-30 11:35
2005.08.07
Возрощает ли ADOCommand количесво измененных записей


1-1121782781
Андрей Молчанов
2005-07-19 18:19
2005.08.07
TShellTreeView с галочками


1-1121395233
eXtreme
2005-07-15 06:40
2005.08.07
Обработчик событий компонента NMHTTP


1-1121836615
Elena_
2005-07-20 09:16
2005.08.07
Как найти корень или подкорень TreeView по значению data