Поиск:

Ответ в темуСоздание новой темы Создание опроса
> form in dll 
:(
    Опции темы
tokito
Дата 12.7.2005, 17:28 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











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

Код

    Application->Initialize(); 
    Application->CreateForm(__classid(TForm2), &Form2); 
    Application->Run(); 


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

  Вверх
Vyacheslav
Дата 13.7.2005, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 47
Всего: 59



Код

Form2 = new TForm2(Application);
Form2->ShowModal();



--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
tokito
Дата 14.7.2005, 08:43 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











тоже самое
  Вверх
Vyacheslav
Дата 14.7.2005, 10:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 47
Всего: 59



Код в студию. При ShowModal дальнейшее выполнение невозможно, пока не будет закрыто окно



--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
tokito
Дата 14.7.2005, 10:51 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











главного приложения кода нет, вот код из длл

Код

extern "C" __stdcall __export int dllfunc() 
{ 
    ....... 
    Application->CreateForm(__classid(TForm2), &Form2);
    Application->Run(); 
    ShowMessage("ку-ку федя съел медведя"); 
    ....... 
    return 0 ; 
} 


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

если вот так
Код

 Application->CreateForm(__classid(TForm2), &Form2); 
 Form2->ShowModal(); 

то эксепшеновая ругань типа EInvalid Operation, cant make visible window modal.

если вот так
Код

 Application->CreateForm(__classid(TForm2), &Form2); 
 Form2->Show(); 
   или
 Application->Run();
 ShowMessage("dssdf");

то последняя функция не дожидается закрытия формы.

  Вверх
Vyacheslav
Дата 14.7.2005, 11:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 47
Всего: 59



В дизане указываем для формы Visible = false

Код

extern "C" __stdcall __export int dllfunc() 
{ 
    
    TForm2* dlg = new TForm2(NULL);
    dlg->ShowModal();
     ShowMessage("ку-ку федя съел медведя"); 
    delete dlg; 
    return 0 ; 
} 




--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
Guest
Дата 14.7.2005, 11:24 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











неа, говорит access violation в dllfunc, и будет так говорить до тех пор пока Application->CreateForm не вызовешь.
  Вверх
Vyacheslav
Дата 14.7.2005, 11:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 47
Всего: 59



Так. Где говорит access violation ?
Ясно. Вы уперлись Application->CreateForm , причем уже на двух форумах smile.
Может в Form2 Owner где-то используете?
Ну тогда
Код

TForm2* dlg = new TForm2(Application);


И у меня есть тестовый проект, правда посвященный иллюстрации совсем другого.Но все равно скачайте и посмотрите.
Здесь http://bcdev.narod.ru/Articles/dll_template.htm
В конце статьи ссылка на проект.

Добавлено @ 11:35
Ваш вариант в файле modaldlg.cpp


--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
tokito
Дата 14.7.2005, 12:16 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











аксес ваолейщн выскакивает когда вызывается функция funcdll из главного приложения, конкретное место - обращение Form2->... надо зарегестрировать класс.

ваш проект скачал, щаз смотрю.
  Вверх
Guest
Дата 14.7.2005, 12:29 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











в вашеи проекте существует WinMain в Demo.cpp, у меня такого нет, да и все равно я не понимаю как это к дело относится, зачем мне ShowModal выносить в отдельную функцию в dll. что, я в одной функции это не могу делать?

Код

... int dllfunc()
{
    ShowMessage("1");
    // вызов формы
    ShowMessage("2");
}


надо чтобы покак не отработает форма, второй шоумесседж не должен появляться! вот каким образом ТАК вызвать эту форму ???
  Вверх
Vyacheslav
Дата 14.7.2005, 12:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 47
Всего: 59



А как вы вообще делаете? Если Вы создаете глваное приложение, то автоматом создается WinMain
Уже писал.
Код

... int dllfunc()
{
    ShowMessage("1");
    TForm2* dlg = new TForm2(Application); //создание экземпляра формы
    dlg->ShowModal() ; // вызов формы
    ShowMessage("2");
    delete dlg; // удаление ненужного экземпляра
}

Просто как дважды два. Чего тут не понятного?
Добавлено @ 12:54
Цитата(Guest @ 14.7.2005, 12:29)
зачем мне ShowModal выносить в отдельную функцию в dll. что, я в одной функции это не могу делать?


Где вы видите в моем проекте, что она вынесена в отделбную функцию?
Код

//declaration  ShowModal
extern "C" TModalResult __declspec(dllexport) ShowModal(AnsiString);
....
//definition ShowModal
TModalResult ShowModal(AnsiString a_String)
{
  TForm2* dlg = new TForm2(Application);
  dlg->Label1->Caption = a_String;
  return dlg->ShowModal();


Ваша функция называется dllfunc, моя ShowModal
Сначала я ее просто обявил, потом определ. Не нравится?
Можно так
Код

extern "C" TModalResult __declspec(dllexport) ShowModal(AnsiString)
{
   TForm2* dlg = new TForm2(Application);
  dlg->Label1->Caption = a_String;
  return dlg->ShowModal();
}

Но это один черт - просто способ оформления программ



--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
Vyacheslav
Дата 14.7.2005, 13:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 47
Всего: 59



Кстати все это уже было. Советую внимательно прочитать этот пост до конца. Вы как близнецы-братья smile
http://forum.vingrad.ru/index.php?showtopi...ndpost&p=424083


--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
vadims
Дата 14.7.2005, 14:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 305
Регистрация: 8.6.2005

Репутация: нет
Всего: 17



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

Имхо

1. Что такое нет главного приложения ?
2. Очень нехорошая вещь - писать в в системе создания форм свой код
3. Что за бред - во вторичной функции
Application->Run();

Вообщем, действительно мб я просто чего-то не понял, но помоему проблема просто в элемнтарной организации программы




--------------------
Cpu not found ! Press any key for software emulation.
PM MAIL   Вверх
tokito
Дата 14.7.2005, 18:03 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











вячеслав с вами очень приятно общаться, чесное слово, но напишите пожалйста еще кусок кода, где WinMain ??? :) :) :)

У меня проект в билдере - D L L, в нее входит
Код

unit1.cpp
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
    return 1;
}
... int func()
{
    ..........
}

unit2.h
class TForm2 : public TForm
{
__published:    // IDE-managed Components
        private:    // User declarations
          public:    // User declarations
    __fastcall TForm2(TComponent* Owner);
};
extern PACKAGE TForm2 *Form2;

unit2.cpp
#include <vcl.h>
#pragma hdrstop

#include "Unit2.h"

#pragma package(smart_init)
#pragma resource "*.dfm"
TForm2 *Form2;
__fastcall TForm2::TForm2(TComponent* Owner)
    : TForm(Owner)
{
}


и больше ни одного файла, и никаких винмейнов !

надо вызвать внутри func() эту форму, так чтобы... ну я раньше объяснял.
  Вверх
Vyacheslav
Дата 15.7.2005, 09:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 47
Всего: 59



Цитата(tokito @ 14.7.2005, 18:03)
вячеслав с вами очень приятно общаться, чесное слово, но напишите пожалйста еще кусок кода, где WinMain ??? smile smile smile

Мы кажется разговариваем на разных языках. Вы сказали, что у Вас нет WinMain. А на чем Вы проверяете Вашу dll. У Вас же должно быть exe-приложение, которое использует Вашу dll.
WinMain и создается в главном exe приложении. В проект dll он конечно не входит.
И зачем Вы тогда написали
Цитата(Guest @ 14.7.2005, 12:29)

в вашеи проекте существует WinMain в Demo.cpp

У меня в проекте Demo.cpp относится к главному приложению
Вы как смотрели мой проект? Это то же группа проектов, состоящая из одного exe и двух проектов dll, одно из которых запускает модальный диалог( именно это Вас интересует), а второе - MDI-child форму. Вы не смотрите отдельные фвйлы -откройте группу проектов.


--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0925 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.