Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице. Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.
14-09-2007 12:52
Как же все-таки народ расслабляется на простых вопросах! :)
Я так думаю, что просто вторая форма в упор не знает первую, а уж тем более, есть ли у нее Label6... Чтобы исправить это положение, в секцию implementation второй формы добавьте в раздел "Uses" модуль первой, например, если первая форма находится в модуле SomeForm.pas, добавьте во вторую Uses SomeForm;
Поскольку обе формы используют друг друга, то следует избегать циклических ссылок в их Uses, т.е. обе ссылки друг на друга не должны находиться в секциях interface (т.е. либо обе в implementation, либо одна в interface, другая - в implementation). Если это возможно, то лучше всегда указывать их в секции implementation
P.S.
>>> варианты ответов типа
>>> Form1.Label6.Caption:= 'test';
>>> не работают (выдает ошибку)
...и вот тогда оно заработает...
14-09-2007 06:57 | Вопрос к автору: запрос дополнительной информации
Вы точно вызываете (отображаете) формы кодом ShowModal, а не Show? Дело в том, что ShowModal прерывает выполнение программы до того момента, как форма будет закрыта специальным образом (присвоением ModalResult значения, отличного от mrNone=0). Так что обращение должно идти либо с компонентов формы, отображаемой ShowModal, либо с другого потока (что вряд ли у Вас имеется).
13-09-2007 15:25 | Комментарий к предыдущим ответам
Бел Амор
Тут надо не забывать про один тонкий момент: CreateForm присваивает Reference правильный указатель на форму ДО вызова её конструктора, так что обращения к "Form1.что-то" не приведут к AV.
А вообще использовать создаваемые IDE глобальные переменные типа "Form1:TForm1" мне всегда казалось плохим стилем: и глюки можно словить и несколько форм данного класса таким образом не создать.
В пределах одного вопроса уже второй раз встречаю упоминание Application.CreateForm в контексте создания "динамических", то бишь неавтосоздаваемых форм. Вообще-то для этих целей существует конструктор. CreateForm все равно сводится к вызову того-же самого конструктора формы, вызов которого вы так упорно избегаете, только после создания формы или дата-модуля она еще проверяет, что это такое она только что сейчас создала, и если это форма, а главная форма приложеия еще не назначена, то эта форма и назначается главной. Т.о., просто вставляя в файл проекта последовательно идущие Application.CreateForm, Delhpi обеспечивает назначение главной формы (Application.MainForm) автоматически. Когда дело доходит до выполнения вашего кода, главная форма уже давно создана и назначена, и заставлять программу каждый раз при создании формы заниматься ерундой, на мой скромный взгляд - не совсем правильно. Господа! Я призываю вас для создания форм пользоваться только конструкторами форм, а Application.CreateForm оставить исключительно дизайнеру...
Соответственно т.к. label6 находится на этой форме, то и обращаться к ней нужно так:
Form1.label6.Caption='123';
Если же Вы имеете в виду массив динамически создаваемых форм, то все происходит абсолютно таким же способом, вот например (прошу прощения, я пишу на C++ Builder):
TForm1 *aRef;
TList *aList = new TList();
// Создаем формы
for(i = 0;i < 5;i ++)
{
Application.CreateForm(TForm1, &aRef);
aList->Add((void *)aRef);
}
// Меняем свойства допустим метки Label1 на каждой форме
for(i = 0;i < 5;i ++)
{
aRef = (TForm1 *)aList->Items[i];
aRef->Label1->Caption = AnsiString("Форма №") + IntToStr(i + 1);
}
Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter. Функция может не работать в некоторых версиях броузеров.