Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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 некоторое значение из таблицы 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.056 c
3-1120217231
syte_ser78
2005-07-01 15:27
2005.08.07
БД в комбо


9-1113910376
[GameDev]
2005-04-19 15:32
2005.08.07
На какой ячейке мышь ?


3-1120132412
TohaNik
2005-06-30 15:53
2005.08.07
SELECT из ХП


1-1121763742
FANAT
2005-07-19 13:02
2005.08.07
можно как то узнать какая это переменная?


14-1121706889
Ajax
2005-07-18 21:14
2005.08.07
"Жди меня и я вернусь..."





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский