Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.54 MB
Время: 0.041 c
1-1117174185
Kolan
2005-05-27 10:09
2005.06.14
Как сделать чтобы форма реагировала во время работы потоков.


1-1117235832
Dark123us
2005-05-28 03:17
2005.06.14
ошибка при попытке выгрузки Dll


1-1117099441
juice
2005-05-26 13:24
2005.06.14
Цвет выделения в ворде


1-1117521709
imm
2005-05-31 10:41
2005.06.14
Где искать буфер TBitmap


1-1117031143
SergP.
2005-05-25 18:25
2005.06.14
Необходимость деструктора в описании своего класса





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский