Перейти к содержанию
Fire Monkey от А до Я
  • 0

Доступ к компоненту


d7d1cd

Вопрос

Привет всем! В приложении есть фрейм Frame1 с расположенной на нем кнопкой Button1. Фрейм создается при нажатии кнопки на главной форме. Возможно ли из главной формы получить доступ к кнопке, расположенной на фрейме?

void __fastcall TMainForm::Button1(TObject *Sender)
{
 TFrame *Frame = new TFrame1(this);
 Frame->Parent = this;
 
 // Как выполнить такое?
 Frame->Button1->Text = L"Привет из главной формы!";
}
Ссылка на комментарий

Рекомендуемые сообщения

  • 0

Если это лучший ответ...то наверно пора плакать...неужели в фмх надо получать доступ к объектам фрейма путем "пробежки"...если правда то жесть просто...

Ссылка на комментарий
  • 0

Если это лучший ответ...то наверно пора плакать...неужели в фмх надо получать доступ к объектам фрейма путем "пробежки"...если правда то жесть просто...

Что Вы конкретно имеете ввиду?

Ссылка на комментарий
  • 0

вообще-то должно быть так (ну, со скидкой на синтаксис си):

Frame.Button1.Text := 'Привет из главной формы!';
Изменено пользователем krapotkin
Ссылка на комментарий
  • 0

как была поставлена задача этот метод поможет, если другой вариант знаешь место того что умничать мог бы ответить человеку

да все ок Мартифан, сори если неправильно выразился, я то как раз и не проверял еще фреймы, а постоянно открываю в фмх новое ).

дикость как раз в том, что это 

Frame->Button1->Text 

не сработало...

Ссылка на комментарий
  • 0

это не работает только если кнопки в классе не было, и ты ее динамически сам создал

тогда перебор

а еще лучше создать а ссылку сохранить в переменной. не 100 же кнопок там создается

Ссылка на комментарий
  • 0

 

вообще-то должно быть так (ну, со скидкой на синтаксис си):

Frame.Button1.Text := 'Привет из главной формы!';

Так сработает только если фрейм создается автоматически. У меня он создается вручную.

Ссылка на комментарий
  • 0

вообще-то должно быть так (ну, со скидкой на синтаксис си):

Frame.Button1.Text := 'Привет из главной формы!';
Так сработает только если фрейм создается автоматически. У меня он создается вручную.
вы запутали и даже стравили)))

а все из-за отсутствия инфы... вы создаете кнопку или нет? ))

Ссылка на комментарий
  • 0

Наверное я не правильно выразился. Фрейм я создаю в системе (File->New->Other->C++Builder Files->FireMonkey Frame). Располагаю на нем кнопку и удаляю фрейм из автоматически создаваемых (Project->Options->Forms). Это для того, чтобы фрейм не занимал оперативную память, когда он не выведен на экран. Для вызова фрейма в главном окне нажимается кнопка. При нажатии для фрейма выделяется память, меняется надпись на кнопке и фрейм выводится на экран.

Как Вы понимаете, это тестовый проект.

Ссылка на комментарий
  • 0

Тогда кнопка должна быть видна и так..

Кнопка видна при отображении фрейма. Только я не могу в дизайнере задать надпись на ней. Надпись будет определена в процессе работы программы.

Ссылка на комментарий
  • 0

Где-то что-то или кто-то запуталось.. Вот смотрю свой проект с фреймами динамически создаваемыми - все компоненты, что были накиданы на фреймы при проектировании, я прекрасно вижу.

Ссылка на комментарий
  • 0

если кнопка создана в дизайнере, значит, она описана как поле в классе фрейма, соответственно компилятор имеет доступ к ней стандартным способом

а есть у нее текст или нет, совершенно все равно

Ссылка на комментарий
  • 0

Глубочайше извиняюсь, что запутал всех. Приведенный в моем вопросе код немножко не такой. В качестве указателя на фрейм у меня используется глобальная переменная типа TControl:

// MainUnit.h
TControl *Frame;

void __fastcall TMainForm::Button1(TObject *Sender)
{
 Frame = new TFrame1(this);
 Frame->Parent = this;
}

Именно поэтому через эту переменную я не могу напрямую "достать" кнопку.

Изменено пользователем d7d1cd
Ссылка на комментарий
  • 0

Взять и привести TControl к вашему классу фрейма.

У меня будет несколько фреймов. Соответственно классы у них разные. Кроме этого, переменная TControl может указывать не на фрейм, а на объект типа TScrollBox.

Ваш совет хорош, сам думал над ним. В TControl есть переменная TagString. Там можно хранить имя класса объекта, указатель на который сейчас хранит сама переменная типа TControl. Но как привести указатель в TControl к классу в текстовой переменной?

TControl *Control = new TFrame1(this);
Control->TagString = L"TFrame1";

// Как теперь создать переменную класса, хранящегося в Control->TagString?
// Возможно ли это?
Ссылка на комментарий
  • 0
// Как теперь создать переменную класса, хранящегося в Control->TagString?
// Возможно ли это?

можете описать конечную задачу? ну если не секрет конечно...мало ли...может идея на млн.$ тянет

просто путаницы будет гораздо меньше и получите дельный совет...а то вопросы у вас сейчас к делфи или билдеру чем к фмх...

Изменено пользователем rustam_d
Ссылка на комментарий
  • 0

Есть конкретная задача: создать переменную класса, имя которого хранится в текстовом виде. Эта задача волнует меня давно. Вот подвернулась возможность снова обратить на нее внимание.

Ссылка на комментарий
  • 0

думаю, судя по задаче, вполне подойдет не текстовый, а просто имя класса

имеем исходный фрейм:

TBaseFrame=class(TFrame)
...
end;
TBaseFrameClass=class of TBaseFrame;

от него унаследованы

TMyFrame1=class(TBaseFrame)
...
end;
TMyFrame2=class(TBaseFrame)
...
end;

в главной форме - поле и метод
 

TMainForm=class(TForm)
...
  CurFrame:TBaseFrame;
  procedure Run(cl:TBaseFrameClass);
end;


procedure TMainForm.Run(cl:TBaseFrameClass);
begin
  FreeAndNil(CurFrame);
  CurFrame := cl.Create(Self);
  CurFrame.Parent := SomeContainerPanel;
  CurFrame.Align := Client;
end;

соответственно

procedure TMainForm.Button1Click(...);
begin
  Run(TMyFrame1);
end;
procedure TMainForm.Button1Click(...);
begin
  Run(TMyFrame2);
end;
Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...