Форум: "Основная";
Текущий архив: 2005.06.14;
Скачать: [xml.tar.bz2];
ВнизMDI: Как обратится из одной child формы к объектам другой child ф Найти похожие ветки
← →
CAMCOH © (2005-05-25 20:07) [0]Собственно вопрос в subj
MDI: Как обратится из одной child формы к объектам другой child формы.
Например у меня есть такая строка:s:=form2.edit1.Text;
Которая вызывается из form1.
Программа ругается и маерится. Обе формы child.
Заранее спасибо за ответ...
← →
Mx © (2005-05-25 20:17) [1]Используй свойство MDIChildren или передавай указатель явным образом.
← →
CAMCOH © (2005-05-25 20:18) [2]Mx а можно поподробнее ?
← →
Mx © (2005-05-25 20:20) [3]Ну как... У главной формы есть свойство MDIChildren[Index: Integer]: TForm, в нем содержаться все ее дочерние формы, кол-во которых ранво MDIChildCount. Используешь приведение типов и получаешь:
TНужнаяФорма(ГлавнаяФорма.MDIChildren[НужныйИндекс]).НужныйКонтрол и т.д.
А вообще, что такое Form1 и Form2? Когда им присваивается значение?
← →
CAMCOH © (2005-05-25 20:25) [4]Mx а как узнать index формы ?
← →
Defunct © (2005-05-25 20:28) [5]CAMCOH © (25.05.05 20:07)
Нужно избегать такой ситуации. Подумайте как можно сделать так, чтобы не было необходимости обращаться к элементам некой формы из других форм.
> s:=form2.edit1.Text;
Строки такого вида приводят к глюкам. Старайтесь избегать обращения к глобальным переменным (в данном случае Form2 - глобальная переменная)
← →
Mx © (2005-05-25 20:29) [6]Ну уж я не знаю. Пусть главная форма, создавая дочернюю, передаст ей указатель на ту, с которой связываться. Вообще, если тебе нужно связать две формы, то можешь использовать глобальные переменные, либо в одной сделать свойство - ссылку на другую. Например, первая форма при создании запоминает себя в глобальной переменной (или, например, в свойстве главной форме), а вторая форма юзает его для своих нужд. Тут много способов.
← →
Mx © (2005-05-25 20:30) [7]
> Defunct © (25.05.05 20:28) [5]
> в данном случае Form2 - глобальная переменная
В данном случае вообще не сказано, что такое Form2.
← →
CAMCOH © (2005-05-25 20:33) [8]Form1 и Form2 это дочерние формы.
Понятно что всё это нехорошо и надо избегать. Но всётаки как решить такую задачу ?
← →
Просто Джо © (2005-05-25 20:36) [9]
> Программа ругается и маерится.
Желательно поподробней.
Вообще думаю, что у тебя просто юнит с второй формой просто не включен в uses clause первой. То есть, сделать так:
unit Unit1;
interface
uses Unit2,...
Но, как справедливо заметили, лучше постараться избегать такой чрезмерной зависимости форм друг от друга, особенно посредством глобальных переменных.
← →
Mx © (2005-05-25 20:36) [10]А в чем проблема то? Если есть указатели на эти формы и формы эти уникальны (т.е. ни одна форма никогда больше не присвоит этим указателям себя), то их и используй.
← →
Defunct © (2005-05-25 20:37) [11]Mx © (25.05.05 20:30) [7]
Не требуется говорить, и так ясно что Form2 - глобальная переменная.
CAMCOH © (25.05.05 20:33) [8]
Ну давайте попробуем решить вашу задачу. Расскажите что ваша программа должна делать, и почему возникла необходимость обращаться к полям некой формы из других форм.
← →
CAMCOH © (2005-05-25 20:38) [12]Mx можешь на наглядном примере объяснить с указателями...
Я к сожалению далёк от этого.
← →
Просто Джо © (2005-05-25 20:38) [13]
> [12] CAMCOH © (25.05.05 20:38)
Ты не ответил на [9].
← →
Mx © (2005-05-25 20:39) [14]
> особенно посредством глобальных переменных
Не понимаю, что такого плохого в глобальных переменных? Если все грамотно сделано, можно избежать лишнего гемора со свойствами.
← →
CAMCOH © (2005-05-25 20:39) [15]Defuct я прекрасно понимаю что эту задачу можно решить с глобальными переменными если ты к этому клониш, но всётаки как её решить в лоб.
Я просто уже неоднократно сталкивался с этим и хочется уже узнать как можно это решить
← →
Mx © (2005-05-25 20:40) [16]
> Просто Джо © (25.05.05 20:38) [13]
> > [12] CAMCOH © (25.05.05 20:38)
> Ты не ответил на [9].
← →
CAMCOH © (2005-05-25 20:41) [17]Джо.
Юниты включены.
Матерится = Access violation at adress.....
← →
Defunct © (2005-05-25 20:43) [18]Mx © (25.05.05 20:39) [14]
Глобальные переменные это очень плохо, а особенно там где форма может быть просто закрыта.
Надеюсь вы знаете к чему приведет выполнение оператора S := Form2.Edit1.Text; если Form2 по какой-то причине оказалась несозданной или уже уничтоженной.
> Если все грамотно сделано
то в программе нет глобальный переменных вообще. Соответственно отсутствует и "гемор" с "чужими" свойствами.
← →
Mx © (2005-05-25 20:43) [19]
> CAMCOH © (25.05.05 20:41) [17]
Видимо за Form2 ничего не закреплено. Напиши наконец в чем задача?
← →
Defunct © (2005-05-25 20:44) [20]CAMCOH © (25.05.05 20:41) [17]
Следствие того, что написано в [18] о глобальных переменных.
← →
CAMCOH © (2005-05-25 20:46) [21]В данном кокретном случае на форме2 лежит таблица dbgrid.
а внутри процедур формы1 возникает необходимость выдёргивать данные из этой таблицы.
← →
Mx © (2005-05-25 20:46) [22]
> Defunct © (25.05.05 20:43) [18]
> то в программе нет глобальный переменных вообще
А как же с Application, Screen и т.п. VCL Не грамотно сделана? Иногда такой механизм все-таки нужен!
← →
Mx © (2005-05-25 20:46) [23]
> CAMCOH © (25.05.05 20:46) [21]
Как создается Form2?
← →
CAMCOH © (2005-05-25 20:47) [24]TForm2.Create(Application);
← →
Mx © (2005-05-25 20:49) [25]И чему это присваивается? Та глобальная переменная, которая автоматически добавляется не присваивается волшебным образом, если результат конструктора в нее не занести (Form2 := TForm2.Create(Application)), то в Form2 - ничего нет.
← →
CAMCOH © (2005-05-25 20:50) [26]Mx непонял вопроса...
procedure TMainForm.N11Click(Sender: TObject);
begin
Tform2.Create(Application);
end;
← →
Просто Джо © (2005-05-25 20:54) [27]
> [26] CAMCOH © (25.05.05 20:50)
Откуда в переменной Form2 появится ссылка на твою форму?
Если хочешь извращаться, то тогда уже так:
procedure TMainForm.N11Click(Sender: TObject);
begin
Form2 := Tform2.Create(Application);
end;
← →
Mx © (2005-05-25 20:54) [28]Напиши:
procedure TMainForm.N11Click(Sender: TObject);
begin
form2 := Tform2.Create(Application);
end;
А теперь представь, что тебе надо будет две таких формы. Таким образом, последующий N11Click затрет ссылку на предыдущую, так что подумай правильно ли ты все организуешь.
← →
CAMCOH © (2005-05-25 20:56) [29]Мне 2 такие формы не понадобятся по определению.
Написал как ты сказал и что это должно дать ?
← →
Defunct © (2005-05-25 20:56) [30]Mx © (25.05.05 20:46) [22]
> А как же с Application, Screen и т.п. VCL
Вы написали и т.п., можете назвать еще? Глобальных переменных всего-то на пальцах можно пересчитать, и являются они не более чем фантазией языка "Delphi".
Application и Screen скорее просто локальные переменные в рамках программы. Ведь в программе не может быть 2 Application или 2 Screen.
А форм может быть сколько угодно.
← →
Просто Джо © (2005-05-25 20:57) [31]<offtop>
Ох, прав АП. Мороны гораздо хуже мормонов.
</offtop>
← →
CAMCOH © (2005-05-25 20:58) [32]Ураа вроде справились с ошибкой.
Спасибо Mx и всем остальным кто помогал ;)
← →
Просто Джо © (2005-05-25 20:59) [33]
> [32] CAMCOH © (25.05.05 20:58)
> Ураа вроде справились с ошибкой.
Это временно, можешь не сомневаться. Ты открыл для них очень широкую дорогу.
← →
Mx © (2005-05-25 21:00) [34]
> Defunct © (25.05.05 20:56) [30]
Причем здесь количество? Я имею ввиду глобальные переменные в общем смысле. В этом смысле Application и Screen таковыми и являются. А еще всякие настройки, типа, DecimalSeparator, и их все-таки много и они глобальные.
← →
Defunct © (2005-05-25 21:01) [35]> CAMCOH ©
Жаль что вы считаете, что справились с ошибкой. На самом деле вы преобрели гораздо более сложную ошибку, которую найти потом будет гораздо труднее.
← →
Defunct © (2005-05-25 21:03) [36]Mx © (25.05.05 21:00) [34]
> А еще всякие настройки, типа, DecimalSeparator, и их все-таки много и они глобальные.
Вы ими пользуетесь? Лично я - нет.
Как для меня, Application и Screen являются локальными в рамках одного DPR.
← →
Mx © (2005-05-25 21:04) [37]Если форм действительно будет несколько CAMCOH, то тебе правильно говорят, впоследствии заколебешься.
← →
Mx © (2005-05-25 21:06) [38]
> Defunct © (25.05.05 21:03) [36]
Я думаю мы друг друга поняли :)
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2005.06.14;
Скачать: [xml.tar.bz2];
Память: 0.53 MB
Время: 0.031 c