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

Вниз

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

Наверх




Память: 0.56 MB
Время: 0.206 c
1-1116973210
redlord
2005-05-25 02:20
2005.06.14
сколько тиков работает винда


1-1116927138
Stef
2005-05-24 13:32
2005.06.14
прочитать ini файл на сайте в интернете


3-1115369119
DelphiN!
2005-05-06 12:45
2005.06.14
Создание в FastReport отчета по таблице неизвесной структуры


1-1117281103
dmitry_t
2005-05-28 15:51
2005.06.14
RxLib и анимированный gif


1-1117001110
Kolan
2005-05-25 10:05
2005.06.14
Как экспортировать класс из dll.