С Новым годом! Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.77/26: Рейтинг темы: голосов - 26, средняя оценка - 4.77
 Аватар для white_fenix
2 / 2 / 0
Регистрация: 12.01.2011
Сообщений: 21

Как засунуть форму из dll в TPanel главной формы приложения???

01.02.2011, 12:19. Показов 5146. Ответов 26
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть следующий вариант вызова формы из dll с динамическим подключением:

Код в dll:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <vcl.h>
#include <windows.h>
#pragma hdrstop
#include "FL_Form.h"
TApplication *ThisApp=NULL;
//------------------------------------------------------------------------------
#pragma argsused
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
    if ((reason==DLL_PROCESS_DETACH)&&(ThisApp)) {
        Application=ThisApp;
    }
    return 1;
}
//------------------------------------------------------------------------------
extern "C" void __declspec(dllexport) LoadFLForm(TApplication *CallingApp);
void LoadFLForm(TApplication *CallingApp) {
      if (!ThisApp) {
          ThisApp=Application;
          Application=CallingApp;
      }
      FLForm = new TFLForm(Application);
      FLForm->Show();
}
Код нажатия кнопки вызова формы из dll главной формы приложения:
Запись в хидере формы:
C++
1
2
3
4
5
6
__published...
private:
HINSTANCE dllFL;
typedef void(__import * FLType1(TApplication *));
FLType1 * Load_FLForm;
public...
Запись в .cpp формы:
C++
1
2
3
4
5
6
7
8
9
void __fastcall TBOREY2::Button2Click(TObject *Sender)
{
dllFL = LoadLibrary("FL.dll");
if (dllFL) {
   if (Load_FLForm=(FLType1 *)GetProcAddress(dllFL, "_LoadFLForm")) {
       LoadFLForm(Application);
   }
}
}
При установленных FormStyle для главной формы fsMDIForm и для дочерней в dll fsMDIChild, форма из dll открывается в адрессном пространстве (внутри) главной формы.
А как сделать, чтобы форма из dll открывалась внутри компонента TPanel главной формы приложения???
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
01.02.2011, 12:19
Ответы с готовыми решениями:

Как загрузить форму из dll и разместить её внутри главной формы на компоненте Panel?
Как загрузить форму из dll и разместить её внутри компонента TPanel главной формы? unit Unit1; interface uses ...

Как закрыть форму, запущенную из главной формы?
При запуске программы у меня открывается Form1. По нажатию на кнопку открывается Form2, а по нажатию на вторую кнопку она должна...

Как организовать Splash форму при загрузке главной формы?
Как организовать Splash форму при загрузке главной формы? Заранее спасибо!

26
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
01.02.2011, 12:48
C++
1
2
3
4
5
TForm *prisoner = new TForm (this);
prisoner->Parent = Panel1;
prisoner->Top = 10;
prisoner->Left = 10;
prisoner->Show();
(use brain not only copy-paste method ...)
0
 Аватар для white_fenix
2 / 2 / 0
Регистрация: 12.01.2011
Сообщений: 21
01.02.2011, 12:54  [ТС]
Цитата Сообщение от LK Посмотреть сообщение
C++
1
2
3
4
5
TForm *prisoner = new TForm (this);
prisoner->Parent = Panel1;
prisoner->Top = 10;
prisoner->Left = 10;
prisoner->Show();
И куда в dll эту часть кода надо засунуть, чтобы компилятор не ругался на то, что он не знает Panel1???
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
01.02.2011, 13:17
ну, вы же как-то в МДИ окно выводите ?

Добавлено через 2 минуты
ИМХО, панель в библиотеку сунуть зачем ?
C++
1
2
3
4
5
FLForm = new TFLForm(Application);
FLForm->Parent = Ваша_Панель;
FLForm->Top = 
FLForm->Left =
FLForm->Show();
Добавлено через 4 минуты
только никак в толк не возьму, зачем так издеваться над формой .
0
 Аватар для white_fenix
2 / 2 / 0
Регистрация: 12.01.2011
Сообщений: 21
01.02.2011, 13:30  [ТС]
Цитата Сообщение от LK Посмотреть сообщение
ну, вы же как-то в МДИ окно выводите ?

Добавлено через 2 минуты
ИМХО, панель в библиотеку сунуть зачем ?
C++
1
2
3
4
5
FLForm = new TFLForm(Application);
FLForm->Parent = Ваша_Панель;
FLForm->Top = 
FLForm->Left =
FLForm->Show();
Добавлено через 4 минуты
только никак в толк не возьму, зачем так издеваться над формой .
Вот когда я этот код пишу в dll, а затем компилирую - компилятор выводит ошибку Undefined symbol 'MainPanel' (Моя_Панель). То что вы предлагаете я делал и ранее - такой номер не проходит!!! Как родительскому TPanel передать LoadFLForm, которая открывает дочернюю форму из dll???
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
01.02.2011, 13:37
При установленных FormStyle для главной формы fsMDIForm и для дочерней в dll fsMDIChild, форма из dll открывается в адрессном пространстве (внутри) главной формы.
- может, фот этто пересмотреть натто ?
0
 Аватар для white_fenix
2 / 2 / 0
Регистрация: 12.01.2011
Сообщений: 21
01.02.2011, 13:58  [ТС]
Цитата Сообщение от LK Посмотреть сообщение
- может, фот этто пересмотреть натто ?
Если в FormStyle формы в dll вернуть fsNormal, то эта форма естественно открывается в адресном пространстве рабочего стола ОС. Если также в главной форме приложения вернуть fsNormal, то поведение формы в dll тоже самое. При этом если добавить строку в .cpp dll-ки FLForm->Parent=MainPanel, то компилятор также ругается Undefined symbol 'MainPanel'. Если я даю указатель на элементы главной формы при помощи #include "MainForm.h" и прописываю FLForm->Parent=BOREY2->MainPanel, то компилятор ругается следующим образом: Unresolved external '_BOREY2_' reference from C:\...\DEBUG\FL.OBJ.
0
Эксперт С++
 Аватар для MikeSoft
3956 / 1811 / 184
Регистрация: 21.11.2009
Сообщений: 2,540
01.02.2011, 13:58
white_fenix, передайте указатель на нужный объект и назначьте его в качестве Parent'a там, где необходимо.
0
 Аватар для white_fenix
2 / 2 / 0
Регистрация: 12.01.2011
Сообщений: 21
01.02.2011, 14:03  [ТС]
Цитата Сообщение от MikeSoft Посмотреть сообщение
white_fenix, передайте указатель на нужный объект и назначьте его в качестве Parent'a там, где необходимо.
Подскажите пожалуйста как это сделать, а то голова уже кругом пошла.
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
01.02.2011, 15:08
передача указателя на объект в DLL
Указатель на объект
- как информация к размышлению.
0
 Аватар для white_fenix
2 / 2 / 0
Регистрация: 12.01.2011
Сообщений: 21
01.02.2011, 16:12  [ТС]
Цитата Сообщение от LK Посмотреть сообщение
Конечно спасибо за ссылки, но всё там как-то поверхностно описано. Допустим я создаю в функции dll ссылку на MainPanel главной формы следующим образом:
C++
1
2
3
4
5
...
TPanel *MainPanel=NULL;
FLForm = new TFLForm(Application);
FLForm->Parent=MainPanel;
FLForm->Show();
Компилятор не ругается, но таким образом код не работает. И не должен работать, т.к. главная форма, на которой панель MainForm, не понимает, что там в dll за MainForm. Как заставить форму понять, что MainPanel в dll это и есть панель главной формы??? Занялся освоением программирования в C++ совсем недавно и тут попросту застрял - помогите нубу.
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
01.02.2011, 16:23
Вот для интереса проясните - зачем форма в ДЛЛ и зачем форма на панели - это вы себе задание придумали с целью обучения, или нужда конкретной программы ?
0
 Аватар для white_fenix
2 / 2 / 0
Регистрация: 12.01.2011
Сообщений: 21
01.02.2011, 16:44  [ТС]
Цитата Сообщение от LK Посмотреть сообщение
Вот для интереса проясните - зачем форма в ДЛЛ и зачем форма на панели - это вы себе задание придумали с целью обучения, или нужда конкретной программы ?
Это нужда конкретной программы. Речь идёт о визуальном интерфейсе просмотра данных из БД, причём для каждого конкретного вида данных, содержащихся в БД, своя визуальная структура (окно), которая подгружается динамически. Вообще приложение представляет собой иерархию из dll, подключаемых как динамически, так и статически, и exe-ника в котором минимум управляющих элементов в целях опять таки уменьшения его размера. Делается это для экономии места в оперативе и для удобства обновления приложения в целом.
Связываться с COM-серверами не хотелось бы в связи с тем, что их нужно регистрировать в реестре ОС.
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
01.02.2011, 17:44
Все равно никак не пойму, для чего форма. Все это можно делать через тот же MDI, используя панели вместо форм, или просто на панели, разве что предполагается возможность отдельного (независимого) открытия формы для какого-нибудь типа данных, тогда да ... хотя с формами - и тут, имхо, перебор, может, не вник , ну а коль формы уже готовы, и все в ДЛЛ, тогда да ...
0
 Аватар для white_fenix
2 / 2 / 0
Регистрация: 12.01.2011
Сообщений: 21
01.02.2011, 18:12  [ТС]
Цитата Сообщение от LK Посмотреть сообщение
Все равно никак не пойму, для чего форма. Все это можно делать через тот же MDI, используя панели вместо форм, или просто на панели, разве что предполагается возможность отдельного (независимого) открытия формы для какого-нибудь типа данных, тогда да ... хотя с формами - и тут, имхо, перебор, может, не вник , ну а коль формы уже готовы, и все в ДЛЛ, тогда да ...
LK формы все в dll, поэтому и возник вопрос как сделать TPanel формы в exe-ке контейнером для форм в dll с динамическим подключением. 100% решение этой проблемы существует, но ввиду моей весьма скудной компетенции в C++ у меня пока что это сделать не получается, поэтому прошу помощи у Вас более опытных программистов.
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
01.02.2011, 18:22
Ну а существующий, я так понял, вариант с MDI чем не устраивает ?
0
 Аватар для white_fenix
2 / 2 / 0
Регистрация: 12.01.2011
Сообщений: 21
01.02.2011, 20:01  [ТС]
Цитата Сообщение от LK Посмотреть сообщение
Ну а существующий, я так понял, вариант с MDI чем не устраивает ?
Не устраивает, т.к. необходимо более гибкое решение в плане интерфейса. Так есть идеи на счёт поставленного вопроса???
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
01.02.2011, 20:13
Идей нет.
0
Эксперт С++
 Аватар для MikeSoft
3956 / 1811 / 184
Регистрация: 21.11.2009
Сообщений: 2,540
01.02.2011, 21:19
Цитата Сообщение от white_fenix Посмотреть сообщение
Подскажите пожалуйста как это сделать, а то голова уже кругом пошла.
Точно также, как и передача обычного указателя в функцию, как параметра.
Например, у вас есть какой-то класс:
C++
1
2
3
4
5
6
7
8
class TMyClass {
  public:
    //...
  private:
    //...
  protected:
    //...
};
И есть объект этого класса:
C++
1
TMyClass *MyClassObject = new TMyClass();
Вам нужна функция, в которую вы сможете передать указатель на этот объект, допустим такая:
C++
1
2
3
4
5
6
void SetParentToButton(TMyClass *ObjectFromMain)
{
  TButton *MyButton = new TButton(ObjectFromMain);
  MyButton->Parent = ObjectFromMain;
  // ...
}
Её использование:
C++
1
SetParentToButton(MyClassObject);
Думаю, суть понятна ...

То же самое необходимо сделать и вам.
Если у вас какой-то собственный класс, то его описание должно быть и в заголовочном файле, в DLL.
0
 Аватар для white_fenix
2 / 2 / 0
Регистрация: 12.01.2011
Сообщений: 21
02.02.2011, 11:47  [ТС]
MikeSoft спасибо за наводящий ответ, но когда в dll я прописываю TParent *MainPanel, то естественно компилятор на например такой код:
C++
1
2
3
4
5
extern "C" void __declspec(dllexport) LoadFLForm(void) {
      FLForm = new TFLForm(MainPanel);
      FLForm->Parent=MainPanel;
      FLForm->Show();
}
не ругается, но опять же форма просто тупо появляется поверх формы приложения, а не в панели этой формы как хотелось бы. Когда я пишу extern TPanel *MainPanel; то это всё равно что в dll засунуть хэдер из exe-ка и компилятор соответственно ругается. А когда я пишу extern TPanel *MainPanel = new TPanel(Application); то компилятор при вызове формы из dll ругается на отсутствие родительского компонента.
Здесь проблема состоит в том, что не проходит сопоставление классов TPanel exe-ка и dll. Когда вызываешь глобальный класс TApplication, то сопоставление проходит нормально, а с TPanel проблема. Ещё оговорюсь, что все модули компилируются с выключенными Dynamic RTL и Build with runtime packages. Есть ещё какая мысля как решить проблему???
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
02.02.2011, 11:47
Помогаю со студенческими работами здесь

Как начать работу приложения с формы, не являющейся главной
Такая задача. Есть форма Form1, и она считается главной.... Создал другую форму, и тепер хотелось чтобы сначала запускалась та другая форма...

Как перевести фокус с первой формы на вторую форму приложения?
Здраствуйте, подскажите пожалуйста, как заставить фокус перейти с первой формы на вторую форму одного и того же приложения,...

Как использовать в коде DLL компоненты из формы основного EXE приложения?
У меня есть форма,которая загружает в память DLL библиотеку. На форме к примеру есть компоненты Radiobutton,Checkbox,Memo .Я хочу...

Как передать информацию в вызываемую форму из контекстных меню различных объектов главной формы
Здравствуйте. Мне необходимо решить следующую задачу. Есть форма с рисунками (см. Рисунок 1). При нажатии правой кнопкой мыши на каждый...

Как в dll засунуть иконки?
Доброго всем времени суток!!! Подскажите пожалуйста, как можно в dll засунуть иконки, dll с поддержкой vcl, но иконки надо использовать...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю 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% до. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru