Помощь - Поиск - Пользователи - Календарь
Полная версия: Mdi приложение
Форум «Всё о Паскале» > Delphi, Assembler и другие языки. > Delphi
YurKaluga
Задача:
В программе открыто несколько одинаковых "дочерних окон" - (А). Из одного из них открывается еще одно "дочернее окно" - (Б). В окне Б вводятся данные, которые нужно записать в переменную, определенную в окне А, из которого запустилось Б. Проблема в том, что данные записываются во все окна А, и как с этим справиться я не знаю.
Найти порядок дочерних окон, и определить нужное окно (т.е. его порядковый номер в списке дочерних окон MainForm) я, в принципе, могу. Но как обратиться к нужной переменной именно в этом окне?

Вопрос вдогонку:
Как из MainForm считать данные компонентов дочернего окна или запустить процедуру дочернего окна?
hardcase
Цитата(YurKaluga @ 23.01.2006 11:42) *
Задача:
В программе открыто несколько одинаковых "дочерних окон" - (А). Из одного из них открывается еще одно "дочернее окно" - (Б). В окне Б вводятся данные, которые нужно записать в переменную, определенную в окне А, из которого запустилось Б. Проблема в том, что данные записываются во все окна А, и как с этим справиться я не знаю.
Когда ты создаёшь новое окно (Б), то пересылай в него ссылку на окно (А), из которого происходит создание.
Цитата(YurKaluga @ 23.01.2006 11:42) *

Найти порядок дочерних окон, и определить нужное окно (т.е. его порядковый номер в списке дочерних окон MainForm) я, в принципе, могу. Но как обратиться к нужной переменной именно в этом окне?
Вопрос вдогонку:
Как из MainForm считать данные компонентов дочернего окна или запустить процедуру дочернего окна?

Есть у TForm индексное свойство

property MDIChildren[I: Integer]: TForm;


Преобразуешь тип формы - и делаешь с нею что хочешь.
YurKaluga
hardcase,

"пересылай в него ссылку на окно (А)" - что ты имеешь ввиду?

"Преобразуешь тип формы" -т.е.?
hardcase
Цитата(YurKaluga @ 25.01.2006 12:38) *

"пересылай в него ссылку на окно (А)" - что ты имеешь ввиду?

Я имею в виду, то что при создании нового или (вызове единственного существующего) (Б) окна ты передаёшь в него ссылку на то окно, которое его вызывает, чтоб (Б) было осведомлено о контексте своего выова - иначе нам будет трудно корректно предавать инфу в нужное окно.
Цитата(YurKaluga @ 25.01.2006 12:38) *

"Преобразуешь тип формы" -т.е.?

TMyForm( MainForm.MDIChildren[ Index ] )
YurKaluga
Ну, ладно, с преобразованием формы вроде понятно. А как обратиться к какому-нибудь Edit'у на ней? Главная форма же не знает, что это за форма и какие на ней есть компоненты.

А ссылка на вызывающее окно - это так называемый Handle?
hardcase
Почемуже не знаеть?!
Тыже можешь подключить к главному модулю, в разделе implementation строку
uses MyFormUnit;
- вот она уже и знает тип. А что, кто-то отменил преобразование типов в Делфи?
TMyForm(MainForm.MDIChildren[Index]).Edit1.Text:='Hardcase is ultimate!';

А зачем передавать хэндл? Ссылка - это ссылка, и хэндлы тут ни при чём, - обычный указатель типа TMyForm. (кстати хэндл - это тоже указатель - посмотри, на что он указывает ;-))
YurKaluga
Делаю так: в вызываемом окне прописал
LoadForm: TForm;

Когда его вызываю пишу:
var Child: TForm3;
begin
Child := TForm3.Create(Application);
LoadForm:=Form2;

Потом в дочернем окне пытаюсь
LoadForm.Edit1.Text:='9';


При компиляции:
[Error] TypeID.pas(66): Undeclared identifier: 'Edit1'
В чем ошибка?
hardcase
У тебя LoadForm типа TForm. А ты пытаешься обращаться к полу Edit1 - там его нету. объяви LoadForm как TForm2, в котором, видимо, у тебя и объявлено поле Edit1.
Gothic_Snake
Цитата(YurKaluga @ 25.01.2006 17:16) *

Ну, ладно, с преобразованием формы вроде понятно. А как обратиться к какому-нибудь Edit'у на ней? Главная форма же не знает, что это за форма и какие на ней есть компоненты.

А ссылка на вызывающее окно - это так называемый Handle?

или так...

Код
tlabel(form.findcontrol('Label1')).caption:='Василий пупкин';


тэги!!!
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.