С Новым годом! Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/15: Рейтинг темы: голосов - 15, средняя оценка - 4.67
 Аватар для Max_92
28 / 10 / 1
Регистрация: 26.04.2010
Сообщений: 457

Доступ к компонентам на другой форме

03.12.2013, 18:25. Показов 3199. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как правильно обращаться к компонентам, расположенным на Form1 из Form2? В Unit2.cpp подключил Unit1.h. При компиляции ошибок не выдаёт. Но при выполнении падает например на вызове "Form1->client->Socket->SendText(SendText)".
Второй момент: в Unit2.cpp есть также необходимость использовать переменные, объявленные в Unit1.cpp, поэтому я его заинклюдил, из-за чего была выдана куча варнингов линкера типа "Public symbol '_название_переменной' defined in both module Unit1.obj и Unit2.obj", но переменные сами вроде как работают.

Так как правильно всё-таки?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
03.12.2013, 18:25
Ответы с готовыми решениями:

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

получить доступ к компонентам другой программы
есть программа написанная на VCL, мне нужно из моей программы считывать данные с компонента DwarGrid, это возможно? я делал такое с...

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

7
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
03.12.2013, 19:19
Цитата Сообщение от Max_92 Посмотреть сообщение
"Form1->client->Socket->SendText(SendText)".
Сдается мне дело тут в синхронизации. Как именно объявлены компоненты? Где?
Цитата Сообщение от Max_92 Посмотреть сообщение
Второй момент
Покажите так же где вы их объявляете. Это сразу упростит дело.
0
 Аватар для Max_92
28 / 10 / 1
Регистрация: 26.04.2010
Сообщений: 457
03.12.2013, 19:51  [ТС]
SatanaXIII,
AnsiString SendText, RecvText; идёт сразу после TForm1 *Form1; в "Unit1.cpp".
Компонент TClientSocket закинут на Form1. На Form2 я нажимаю по кнопке и вызывается Form1->client->Socket->SendText(SendText);
0
98 / 81 / 14
Регистрация: 26.07.2013
Сообщений: 594
05.12.2013, 15:18
- Max_92, по идее, если Вы только определили глобально строки:
C++
1
2
  // .........
  AnsiString  SendText, RecvText;
в модуле "Unit1", (т.е. только в файле "Unit1.cpp"), а в файле "Unit1.h" о них нет упоминания,
и в файл "Unit2.cpp" Вы включили заголовок "Unit1.h", то в модуле "Unit2" эти строки не должны быть
видны!
Компилятор должен давать на них ошибки!
- Сразу-же скажу как надо определить в модуле "Unit1" глобальные строки SendText и RecvText:
1) - В файле "Unit1.cpp":
C++
1
2
  // .........
  AnsiString  SendText, RecvText;
- все как и было;
2) - В файле "Unit1.h":
C++
1
2
  // .........
  extern AnsiString  SendText, RecvText;
- Теперь эти глобальные строки будут определены один раз в данном модуле "Unit1" и видны
снаружи, всюду, куда Вы включите заголовок этого модуля "Unit1.h".
- Что касается второй проблемы, то я -бы поставил на строку - Form1->client->Socket->SendText( SendText );
точку останова отладчика, когда при выполнении программы она остановится на этой строке прошел-бы
по ней всей указателем мыши от начала и до конца и посмотрел-бы с каким компонентом этой строки
связана проблема.
- Мне кажется это одно из двух:
1) В модуле "Unit2" не правильно видится строка SendText (о чем я говорил выше).
2) У Вас название строки SendText совпадает с названием метода в злополучной строке.
Может, кстати, из за этого он и не правильно видит строку ! ...
2
40 / 25 / 7
Регистрация: 04.10.2012
Сообщений: 127
05.12.2013, 21:49
Скорее всего, дело не в области видимости сокета, а в создании объекта сокета.
Вынеси сокет в отдельный модуль, можно в отдельный класс, и вызывай из любых форм как захочется.
Не забудь про создание и уничтожение сокета внутри класса.

Если с созданием класса и модуля всё сложно, вызывай форму где сокет, и сделай её инвизибл.
Все объекты внутри формы будут созданы, можно обращаться к ним из другой формы.
0
 Аватар для Max_92
28 / 10 / 1
Регистрация: 26.04.2010
Сообщений: 457
05.12.2013, 23:10  [ТС]
Dam33, сокеты вроде как работают и при обычном включении "Unit.h"
Staut, если определять переменные вот так: extern AnsiString SendText, RecvText; то в нужном файле потребуется их ещё раз объявить обычным способом? а то для указателя TForm * Form1 это выглядит именно так.
Цитата Сообщение от Staut Посмотреть сообщение
в модуле "Unit1", (т.е. только в файле "Unit1.cpp"), а в файле "Unit1.h" о них нет упоминания,
и в файл "Unit2.cpp" Вы включили заголовок "Unit1.h", то в модуле "Unit2" эти строки не должны быть
видны! Компилятор должен давать на них ошибки!
так и есть. просто у меня помимо этого в "Unit2.cpp" есть ещё переменные с такими же названиями, как и в "Unit1.cpp" (например интовая "function"), из-за чего линкер выдаёт варнинги. конечно, в этом дублировании смысла нет наверное, так что сделаю их глобальными.
а первый раз я пробовал тупо включить "Unit1.cpp" и ничего хорошего из этого не вышло.

Добавлено через 2 минуты
Цитата Сообщение от Staut Посмотреть сообщение
В модуле "Unit2" не правильно видится строка SendText (о чем я говорил выше).
переменная SendText есть только в "Unit2.cpp". но я попробую сделать всё в "Unit1.cpp", как вы сказали, с extern. только непонятно, надо ли будет потом ещё раз писать и в "Unit1.cpp" и в "Unit2.cpp" обычное объявление AnsiString SendText, RecvText ??

Добавлено через 6 минут
ещё один вопрос: как можно полностью "разрушить" форму, а не закрыть методом Close() ? Дело в том, что при повторном вызове в Form1 метода Form2->Show() на второй форме остаётся всякий мусор. Кроме явного вызова деструктора на ум ничего не приходит..
0
98 / 81 / 14
Регистрация: 26.07.2013
Сообщений: 594
06.12.2013, 16:08
- Max_92, что Вы, что Вы, повторю еще раз, постараюсь как можно понятнее. Приведу пример даже не
со строкой, а с простой переменной (int).
- Если Вы точно знаете, что переменная ( int first; ) должна быть определена глобально в модуле "Unit1" и не
должна быть видна ни в одном другом модуле, то просто пишете в файле "Unit1.cpp":
C++
1
2
  // .........
  int  first;
, и все ...Эта переменная БУДЕТ ОПРЕДЕЛЕНА ОДИН РАЗ В МОДУЛЕ "Unit1" И НЕ ВИДНА НИ В ОДНОМ ДРУГОМ МОДУЛЕ!
- Если эта переменная ( int first; ) все-же должна быть видна в других модулях проекта, то добавьте в файл
"Unit1.h" следующую запись:
C++
1
2
  // .........
  extern int  first;
- Теперь переменная ( int first; ) БУДЕТ ВИДНА ВСЮДУ, КУДА ВЫ ВКЛЮЧИТЕ ДИРЕКТИВУ ПРЕДПРОЦЕССОРА:
C++
1
2
// .........
#include  "Unit1.h"  // для раб. с переменной first.
- Надо стараться, чтобы разные переменные одного типа по возможности не имели одинаковых имен.
Это страшный источник трудно уловимых ошибок! Ну это, конечно, не относится к рабочим переменным,
типа int i, j n; и т.д., хотя и за ними надо пристально следить. За их областью видимости!
- А все значащие для проекта переменные, строки, экземпляры классов, указатели на экземпляры классов
и т.д. надо делать с уникальными именами! Мне кажется у Вас как-раз в этом и ошибка.
Пересмотрите повнимательней имена Ваших переменных, строк, объектов ...
1
 Аватар для Max_92
28 / 10 / 1
Регистрация: 26.04.2010
Сообщений: 457
06.12.2013, 21:57  [ТС]
Staut, всё, спасибо. разобрался уже вчера)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
06.12.2013, 21:57
Помогаю со студенческими работами здесь

Ошибка 2227, как получить доступ к компонентам другой формы?
В Form2.h прописан следующий код String^ text; Form1^ f=gcnew Form1(); text=f->textBox1->Text; Выводит...

Доступ к другой форме
FAQ почитал, но все равно не понял механизм взаимодействия форм.. Вообщем имеется frm_main - главная форма. Из главной формы...

Доступ к переменной на другой форме
Добрый день, проблема в следующем. Я создаю экземпляр класса на одной форме #pragma package(smart_init) #pragma resource...

Доступ к форме через другой класс
В общем, создается форма Form1 в которой есть textBox1. Создается класс public class class3 { . . . . . . . public void...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru