Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Form1 и Form2  (Прочитано 12131 раз)
0 Пользователей и 1 Гость смотрят эту тему.
artsb
Гость
« : 28-11-2007 19:08 » 

Есть две формы. На дочерней есть эдит и кнопка. При нажатии на кнопку текст из эдит'а нужно перенести в переменную в главной форме. Как это можно сделать? И как запустить свою функцию, которая находится в Unit1 из Unit2?
Спасибо.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 28-11-2007 19:17 » 

1) с деталями - к борландщикам Улыбаюсь (я под борландом не пишу...)

2) достать текст: послать окошку сообщение WM_GETTEXT , или поюзать стандартное средство борланда (см п.1)

3) как запустить свою функцию, которая находится в Unit1 из Unit2?

одно из решений - по такому принципу
Код:
class Unit1
{
public:
  F()
  {
  }

} u1;

class Unit2
{
  Unit1* p_u1;

  Unit2(...,Unit1* p_u1_i)
  {
     p_u1=p_u1_i;
  }
} u2;
....


где то в u2
{
  p_u1->F();
}

« Последнее редактирование: 28-11-2007 19:21 от Алексей1153++ » Записан

RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #2 : 28-11-2007 20:11 » 

artsb, в BC++ к каждой форме в исходники автоматом добавляется указатель на этот класс. Для главной формы ему при старте присваивается указатель на объект этой формы. Если класс главной формы - TForm1, то и указатель будет того же имени - Form1.
Тебе надо в Form2.cpp подключить заголовок Form1.h, объявить в TForm1 публичный член класса нужного типа (AnsiString), а в обработчике кнопки в TForm2 обратиться к этому члену:

Form1->myVar = Edit1->Text;
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
artsb
Гость
« Ответ #3 : 29-11-2007 07:04 » 

К сожалению не нашёл Form1.h и Form2.cpp. Возможно вы опечатались.
Сделал так:
В Unit1.h в секцию pablic на писал объявление:
AnsiString aaa;
В Unit1.h подключил Unit2.h и наоборот. Теперь всё работает.

Но может так неправильно делать? Отпишитесь пожалуйста.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #4 : 29-11-2007 07:20 » 

перекрёстные инклуды делать достаточно вредно , у тебя одного из них будет достаточно, по идее. Какой - попробуй методом научного тыка, я щас не могу сообразить Улыбаюсь
Записан

RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #5 : 29-11-2007 08:41 » 

artsb, с именами ты все почти правильно делаешь. Дело не в опечатке. Я сохраняю формы в файлах с логичными названиями, а не дефолтными. Например, если класс формы TfrmMain, то имя файла - frmMain.cpp (TfrmMain.cpp билдер не позволяет - у него какие-то затыки тут) и заголовок - frmMain.h. Иначе через неделю уже не вспомнишь, зачем Unit13.h и что делает Form25...

Начсет "почти правильно": подключать надо не в заголовочном файле, а в cpp. Подключать в заголовке необходимо только тогда, когда в подключаемом заголовке объявляются типы, используемые в твоем заголовке.

Алексей1153++, это бывает вынуждено и не запрещено.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
artsb
Гость
« Ответ #6 : 29-11-2007 15:30 » 

RXL : "подключать надо не в заголовочном файле, а в cpp".
Опечатался я. Извиняюсь. Имелось ввиду Unit1.h в Unit2.cpp.
Насчёт опечатки извиняюсь.
Записан
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #7 : 01-12-2007 06:20 » 

artsb, учите С++
Идиомы, Паттерны, техники, билиотеки, Алксандруску, Саттер, Вандервуд, Эккель, Липман

Задача сводится, к тому что из одного класса нужно звать методы второго.
Это можно делать через указатель на класс, через ссылку на класс, через функторы(забыл как паттерн завётся), через указали на метод класса, через некоторую внешнюю функцию

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

можно создать свой интерфейс и у наследовать от него родительскую форму реализовав методы.

способов море

опять же
std::bind1st(
      std::mem_fun(&X::foo), &x);
надеюсь знакомая конструкция
« Последнее редактирование: 01-12-2007 06:28 от LogRus » Записан

Странно всё это....
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines