Rambler's Top100
"Knowledge itself is power"
F.Bacon
Поиск | Карта сайта | Помощь | О проекте | ТТХ  
 Круглый стол
  
Правила КС
>> Настройки

Фильтр вопросов
>> Новые вопросы
отслеживать по
>> Новые ответы

Избранное

Страница вопросов
Поиск по КС


Специальные проекты:
>> К л ю к в а
>> Г о л о в о л о м к и

Вопрос №

Задать вопрос
Off-topic вопросы

Помощь

 
 К н и г и
 
Книжная полка
 
 
Библиотека
 
  
  
 


Поиск
 
Поиск по КС
Поиск в статьях
Яndex© + Google©
Поиск книг

 
  
Тематический каталог
Все манускрипты

 
  
Карта VCL
ОШИБКИ
Сообщения системы

 
Форумы
 
Круглый стол
Новые вопросы

 
  
Базарная площадь
Городская площадь

 
   
С Л С

 
Летопись
 
Королевские Хроники
Рыцарский Зал
Глас народа!

 
  
ТТХ
Конкурсы
Королевская клюква

 
Разделы
 
Hello, World!
Лицей

Квинтана

 
  
Сокровищница
Подземелье Магов
Подводные камни
Свитки

 
  
Школа ОБЕРОНА

 
  
Арсенальная башня
Фолианты
Полигон

 
  
Книга Песка
Дальние земли

 
  
АРХИВЫ

 
 

Сейчас на сайте присутствуют:
 
  
 
Во Флориде и в Королевстве сейчас  00:36[Войти] | [Зарегистрироваться]
Ответ на вопрос № 55309

13-09-2007 07:22
Доброго времени суток.
Вопрос по работе с динамически создаваемыми формами.

Есть приложение, в нем несколько форм, некоторые динамические. динамические формы создаются следующим куском кода

Application.CreateForm(TForm1, Form1);
Form1.ShowModal;



нужно из другой формы обратиться к обьекту label6, находящемся на form1
Поиск по КС нужных р-татов не дал, заранее благодарен за помощь

[+] Добавить в избранные вопросы

Отслеживать ответы на этот вопрос по RSS

Ответы:


Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице.
Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.

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 07:05 | Сообщение от автора вопроса
Сорри за несовсем полную формулировку...
Упростив пример, должно быть следующее:

вызываем немодальную (сорри, ошибся в вопросе) форму form2 кодом, который я представил, из form1 а потом из вызванной формы меняем label формы form1

варианты ответов типа

Form1.Label6.Caption:= 'test';

не работают (выдает ошибку)

14-09-2007 06:57 | Вопрос к автору: запрос дополнительной информации
Вы точно вызываете (отображаете) формы кодом ShowModal, а не Show? Дело в том, что ShowModal прерывает выполнение программы до того момента, как форма будет закрыта специальным образом (присвоением ModalResult значения, отличного от mrNone=0). Так что обращение должно идти либо с компонентов формы, отображаемой ShowModal, либо с другого потока (что вряд ли у Вас имеется).

13-09-2007 23:35
Еще непонятно из какой части кода автор обращается к Label'у
если что-то типа


Application.CreateForm(TForm1, Form1);
Form1.ShowModal;
Form1.Label6.Caption:= 'test';


то отсутствие надписи 'тест' в метке при выводе формы на экран вполне понятно...

13-09-2007 15:25 | Комментарий к предыдущим ответам
Бел Амор
Тут надо не забывать про один тонкий момент: CreateForm присваивает Reference правильный указатель на форму ДО вызова её конструктора, так что обращения к "Form1.что-то" не приведут к AV.
А вообще использовать создаваемые IDE глобальные переменные типа "Form1:TForm1" мне всегда казалось плохим стилем: и глюки можно словить и несколько форм данного класса таким образом не создать.

13-09-2007 14:13
В пределах одного вопроса уже второй раз встречаю упоминание Application.CreateForm в контексте создания "динамических", то бишь неавтосоздаваемых форм. Вообще-то для этих целей существует конструктор. CreateForm все равно сводится к вызову того-же самого конструктора формы, вызов которого вы так упорно избегаете, только после создания формы или дата-модуля она еще проверяет, что это такое она только что сейчас создала, и если это форма, а главная форма приложеия еще не назначена, то эта форма и назначается главной. Т.о., просто вставляя в файл проекта последовательно идущие Application.CreateForm, Delhpi обеспечивает назначение главной формы (Application.MainForm) автоматически. Когда дело доходит до выполнения вашего кода, главная форма уже давно создана и назначена, и заставлять программу каждый раз при создании формы заниматься ерундой, на мой скромный взгляд - не совсем правильно. Господа! Я призываю вас для создания форм пользоваться только конструкторами форм, а Application.CreateForm оставить исключительно дизайнеру...

13-09-2007 08:02
Если формы создаются динамически, то у вас соответственно есть указатели на эти формы

Вот в данном случае:

Application.CreateForm(TForm1, Form1);
Form1.ShowModal;


указатель будет находится в Form1

Соответственно т.к. 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);
}





13-09-2007 07:50
Может поможет тебе :)

var
lb:TLabel;
begin
lb:=Tlabel.Create(form2);
lb:=(application.FindComponent('Form1').FindComponent('Label1') as tlabel);
lb.Caption := 'abc';


13-09-2007 07:40
а указав нужную форму.label6 не пробывал?
т.е. label6 находится например на Form2
то в Unit1 (Form1) вызываешь:

Form2.label6  ... и т.д.

Добавьте свое cообщение

Вашe имя:  [Войти]
Ваш адрес (e-mail):На Королевстве все адреса защищаются от спам-роботов
контрольный вопрос:
"Мы с тобой одной крови — ты и я!". Чьи это заветные слова?
в качестве ответа на вопрос или загадку следует давать только одно слово в именительном падеже и именно в такой форме, как оно используется в оригинале.
Надоело отвечать на странные вопросы? Зарегистрируйтесь на сайте.
Тип сообщения:
Текст:
Жирный шрифт  Наклонный шрифт  Подчеркнутый шрифт  Выравнивание по центру  Список  Заголовок  Разделительная линия  Код  Маленький шрифт  Крупный шрифт  Цитирование блока текста  Строчное цитирование
  • вопрос Круглого стола № XXX

  • вопрос № YYY в тесте № XXX Рыцарской Квинтаны

  • сообщение № YYY в теме № XXX Базарной площади
  • обсуждение темы № YYY Базарной площади
  •  
     Правила оформления сообщений на Королевстве

    Страница избранных вопросов Круглого стола.
      
    Время на сайте: GMT минус 5 часов

    Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter.
    Функция может не работать в некоторых версиях броузеров.

    Web hosting for this web site provided by DotNetPark (ASP.NET, SharePoint, MS SQL hosting)  
    Software for IIS, Hyper-V, MS SQL. Tools for Windows server administrators. Server migration utilities  

     
    © При использовании любых материалов «Королевства Delphi» необходимо указывать источник информации. Перепечатка авторских статей возможна только при согласии всех авторов и администрации сайта.
    Все используемые на сайте торговые марки являются собственностью их производителей.

    Яндекс цитирования