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

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

01.02.2011, 12:19. Показов 5416. Ответов 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
02.02.2011, 11:53
Студворк — интернет-сервис помощи студентам
Танцы с бубном :
C++
1
2
3
FLForm = new TFLForm(this);
FLForm = new TFLForm(MainForm);
FLForm = new TFLForm(Application);
0
 Аватар для white_fenix
2 / 2 / 0
Регистрация: 12.01.2011
Сообщений: 21
02.02.2011, 12:41  [ТС]
Цитата Сообщение от LK Посмотреть сообщение
Танцы с бубном :
C++
1
2
3
FLForm = new TFLForm(this);
FLForm = new TFLForm(MainForm);
FLForm = new TFLForm(Application);
Что ты имеешь ввиду этим код???
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
02.02.2011, 12:46
изменить владельца
0
 Аватар для white_fenix
2 / 2 / 0
Регистрация: 12.01.2011
Сообщений: 21
04.02.2011, 21:20  [ТС]
Цитата Сообщение от LK Посмотреть сообщение
изменить владельца
Этот вариант ничего не меняет - результат тот же!!!
Могу ли я при помощи указателей базового класса TForm дать понять exe-ку, что вызывается форма из dll, а затем присвоить указателю свойство Parent??? Например:
C++
1
2
3
4
5
6
7
8
TForm *dllForm;
dllFL = LoadLibrary("FL.dll");
if (dllFL) {
    if (Load_FLForm=(FLType *)GetProcAddress(dllFL, "_LoadFLForm")) {
        dllForm==Load_FLForm();
        dllForm->Parent=MainPanel;
    }
}
При такой реализации компилится нормально, но во время выполнения приложения при нажатии на соответствующую кнопку выскакивает ошибка: "access violation at 0x004f97b8: write of address 0x00030ffc".

Добавлено через 18 часов 40 минут
Переписал код следующим образом:

В .cpp dll-ки:
C++
1
2
3
4
5
6
TForm * __declspec(dllexport) LoadFLForm(TPanel *MainPanel) {
Application->CreatForm(__classid(TFLForm), &FLForm);
FLForm->Parent=MainForm;
FLForm->Show();
return FLForm;
}
В хэдере главной формы exe-ка:
C++
1
2
3
4
private:
HINSTANCE dllFL;
TForm *MForm;
TForm * (* Load_FLForm)(TPanel *MainPanel);
В .cpp главной формы exe-ка:
C++
1
2
3
4
5
void __fastcall TBOREY2::Button2Click(TObject *Sender) {
dllFL=LoadLibrary("FL.dll");
Load_FLForm=(TForm * (*)(TPanel *MainPanel))GetProcAddress(dllFL, "_LoadFLForm");
MForm=Load_FLForm(MainPanel);
}
Собирается без проблем, но при нажатии соответствующей кнопки в запущенном приложении выскакивает окошко с ошибкой следующего содержания: "Access violation at address 00000000. Read of address 00000000". На Builder 6 код вроде как работает без ошибок, а на RAD Studio 2010 вот такая байда творится!!!

Добавлено через 3 часа 57 минут
Причиной ошибки "Access violation at ..." является то, что Load_FLForm==NULL, т.е. функцию событие не находит, а значит не работает строка 3 приведённого кода в .cpp главной формы exe-ка.

Добавлено через 7 часов 30 минут
Вообщем у меня получилось засунуть форму в TPanel!!! Но это пока что возможно только с включёнными Dynamic RTL и Build with runtime packages!!! Кому это интересно представляю код реализации:

Код в .ccp 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
#include <vcl.h>
#include <windows.h>
#pragma hdrstop
#include "GC_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" TForm* __declspec(dllexport) LoadGCForm(TApplication *CallingApp) {
    if (!ThisApp) {
        ThisApp=Application;
        Application=CallingApp;
    }
    Application->CreateForm(__classid(TGCForm), &GCForm);
    return GCForm;
}
Код в .cpp exe-ка обработчика события нажатия кнопки вызова формы из dll:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//---------------------------------------------------------------------------
HINSTANCE dllGC;
TForm *Panel;
void __fastcall TBOREY2::Button1Click(TObject *Sender)
{
TForm *(* Load_GCForm)(TApplication *);
dllGC=LoadLibrary("GC.dll");
Load_GCForm=(TForm* (*)(TApplication *))GetProcAddress(dllGC, "_LoadGCForm");
Panel=Load_GCForm(Application);
Panel->Parent=MainPanel;
Panel->Left=0;
Panel->Top=0;
Panel->Height=MainPanel->Height;
Panel->Width=MainPanel->Width;
Panel->Visible=true;
}
//---------------------------------------------------------------------------
С выключенными Dynamic RTL и Build with runtime packages часть кода с указателем на родителя Parent не работает - если убрать эту часть кода, то Panel->Visible->true работает.
Может у кого на этом форуме есть какие идеи как "причесать" код таким образом, чтобы можно было без проблем задать Parent с выключенными Dynamic RTL и Build with runtime packages???

Добавлено через 23 часа 29 минут
Короче "причесал" без помощи "опытных" программистов, от которых никакой помощи!!! Вообщем код в .cpp exe-ка надо написать следующим образом:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
HINSTANCE dllGC;
TForm *Panel;
void __fastcall TBOREY2::Button1Click(TObject *Sender)
{
TForm *(* Load_GCForm)(TApplication *);
dllGC=LoadLibrary("GC.dll");
Load_GCForm=(TForm* (*)(TApplication *))GetProcAddress(dllGC, "_LoadGCForm");
Panel=Load_GCForm(Application);
Panel->ParentWindow=MainPanel->Handle;
Panel->Align=alClient;
//либо Panel->Left=0; Panel->Top=0; Panel->Height=MainPanel->Height; Panel->Width=MainPanel->Width;
Panel->Show();
//либо Panel->Visible=true;
}
Теперь всё собирается и запускается с выключенными RTL и runtime package!!!
2
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
04.02.2011, 21:56
Цитата Сообщение от white_fenix Посмотреть сообщение
1. Короче "причесал" без помощи "опытных" программистов, от которых никакой помощи!!!
2. Теперь всё собирается и запускается с выключенными RTL и runtime package!!!
1. Суть не в опытности специалистов, по поводу которых ты съехидничал (к оным я себя не отношу, так что все нормально ), а в затратах времени , необходимых для решения твоей / чьей-нибудь еще проблемы, и в количестве предоставленного кода, который , как правило, состоит из довольно непонятных "цитат" . Следуя твоей логике, я могу подбросить тебе проблемку, и спокойно жить, ожидая, когда ты приподнесешь мне готовое решение на блюдечке с голубой каемочкой .
2. Для того и форум - подстегнуть к самостоятельному решению, а если удасться - подсказать направлене "думания", а если повезет - предоставить решение. Но решать более сложные проблемы , как правило , приходится самому. И удовольствие от этого, ИМХО, больше, чем от простого copy-paste.
Вот и ты - свой первый (+) в этом форуме заработал честно, получи и распишись .
0
 Аватар для white_fenix
2 / 2 / 0
Регистрация: 12.01.2011
Сообщений: 21
04.02.2011, 22:39  [ТС]
Цитата Сообщение от LK Посмотреть сообщение
1. Суть не в опытности специалистов, по поводу которых ты съехидничал (к оным я себя не отношу, так что все нормально ), а в затратах времени , необходимых для решения твоей / чьей-нибудь еще проблемы, и в количестве предоставленного кода, который , как правило, состоит из довольно непонятных "цитат" . Следуя твоей логике, я могу подбросить тебе проблемку, и спокойно жить, ожидая, когда ты приподнесешь мне готовое решение на блюдечке с голубой каемочкой .
2. Для того и форум - подстегнуть к самостоятельному решению, а если удасться - подсказать направлене "думания", а если повезет - предоставить решение. Но решать более сложные проблемы , как правило , приходится самому. И удовольствие от этого, ИМХО, больше, чем от простого copy-paste.
Вот и ты - свой первый (+) в этом форуме заработал честно, получи и распишись .
1. Не совсем с тобой согласен, т.к. считаю, что проблемку можно и нужно всё-таки решать сообща, обсуждая довольно интересные и полезные задачи - одна голова хорошо, а две лучше. Потому что рано или поздно в своей практике эта самая задача себя проявит по закону подлости в самый неподходящий момент. Считаю, что форумы в большей степени предназначены для общения, в противном случае можно просто написать статейку и опубликовать.
2. Согласен в плане того, что удовольствия от самостоятельного решения проблемы гораздо больше, чем её совместная реализация.
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
04.02.2011, 22:49
Цитата Сообщение от white_fenix Посмотреть сообщение
1. проблемку можно
2. нужно всё-таки решать сообща, обсуждая довольно интересные и полезные задачи - одна голова хорошо, а две лучше. Потому что рано или поздно в своей практике эта самая задача себя проявит по закону подлости в самый неподходящий момент.
3. Считаю, что форумы в большей степени предназначены для общения
1. Если есть возможность и время - многие пробемы таки решают .
2. Кому - нужно ? На данный момент мне Ваше решение не нужно - будет нужно - начну искать - найду Ваше - буду Вам благодарен. Вы не путаете коллектив разработчиков-единомышленников и участников форума?
3. Вот именно, а не для решения отдельных, нередко, узкоспециализированных задач. И именно последние три наши с Вами сообщения и есть тому подтверждение , я считаю .
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
04.02.2011, 22:49

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
27
Ответ Создать тему
Новые блоги и статьи
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Nekobox - outbounds[0].transport: unknown transport type: raw
damix 01.10.2026
Фикс ошибки Правым кликом по серверу -> отладочная информация -> edit Заменить "net": "raw", на "net": "tcp", Нажать кнопку reload.
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru