Тема: Переключаться между формами

Здравствуйте! Как реализовать переключение из одной формы в другую (MFC). Проблема в том, что в acrxEntryPoint.cpp подключены headers всех форм:

/*acrxEntryPoint.cpp*/

#include "StdAfx.h"
#include "resource.h"
#include "Form1.h"
#include "Form2.h"
fStamp1 form1 = NULL;

    static int ads_addname(void)
    {
//----- Remove the following line if you do not expect any argument for this ADS function
    struct resbuf *pArgs =acedGetArgs () ;
    CAcModuleResourceOverride resOverride;

   form1.DoModal();
    acedRetVoid();    
    return (RSRSLT);
    }

а если подключать #include "Form2.h" в Form1.cpp, то получается ошибка линковки  LNK2005.
Если я тут туманно написал, очень хочется по кнопке из Form1 переходить в Form2.

Re: Переключаться между формами

Сергей пишет:

то получается ошибка линковки LNK2005

Точнее?

Re: Переключаться между формами

Ошибка на .obj
Когда я писал вопрос я названия изменял, а это реальная ошибка:

Error    1    error LNK2005: "class fStamp3 form3" (?form3@@3VfStamp3@@A) already defined in acrxEntryPoint.obj    fStamp1.obj    

Re: Переключаться между формами

Что-то ты слишком перемудрил. У тебя две глобальных переменных:

fStamp3 form3;

Так как кода я не вижу, то где это - не пойму.
Но у тебя еще на стадии компиляции должны быть ошибки на:

fStamp1 form1 = NULL; 

Не делай диалоги глобальными (можно делать глобальными указатели на диалоги).

Re: Переключаться между формами

Александр Ривилис пишет:

Не делай диалоги глобальными (можно делать глобальными указатели на диалоги).

Можно примерчик за наглость?=)

Re: Переключаться между формами

Александр как всегда указал верный путь, убрал

fStamp1 form1 = NULL;


поглубже в скрипты, дабы сделать её локальной.
Вроде работает. Спасибо Александр.
Но за пример с указателем буду оч благодарен, т.к. он немного скомпенсирует мою неграмотность в с++.

(изменено: Александр Ривилис, 15 ноября 2010г. 14:49:27)

Re: Переключаться между формами

// Определение глобального указателя
fStamp1 *form1 = NULL;
// Объявление в других модулях, чтобы не было error LNK2005
extern fStamp1 *form1;

Ну и немного утрировано:

   static int ads_addname(void)
   {
     struct resbuf *pArgs =acedGetArgs () ;
     CAcModuleResourceOverride resOverride;
     if (!form1) form1 = new fStamp1();
     if (form1) form1->DoModal();
     acedRetVoid();   
     return (RSRSLT);
   }

Re: Переключаться между формами

например, так

#include "form1.h"
...
static fStamp1 * form1 = NULL;

class CMyApp : public AcRxArxApp {
...
virtual AcRx::AppRetCode On_kInitAppMsg (void *pkt) 
{
  AcRx::AppRetCode retCode =AcRxArxApp::On_kInitAppMsg (pkt) ;
...
  if (form1 == NULL)
  {
    if ((form1 = new fStamp1) == NULL) {/*выгрузить ARX*/;}
    if (!form1->Create(acedGetAcadFrame())){/*выгрузить ARX*/;}
  }
...
  return (retCode) ;
}

virtual AcRx::AppRetCode On_kUnloadAppMsg (void *pkt) 
{
  if (form1)delete form1;
...
  AcRx::AppRetCode retCode =AcRxArxApp::On_kUnloadAppMsg (pkt) ;
  return (retCode) ;
}

а внутри своих функций пишешь form1->ShowWindow(SW_SHOW); а в своем окне вместо EndDialog(IDOK) пишешь ShowWindow(SW_HIDE);

В данном случае ты получаешь одно единственное окно, которое будет показано пользователю всякий раз, как он запустит команду, а не каждый раз новый экземпляр окна, если делать его внутренней переменной.
НО, сильно не злоупотребляй, т.к. потом проблемы все не разгребешь. Кстати, в данном случае окно получается немодальным, следовательно все редактирования БД акада (чертежа) через него потребуют блокировки используемой базы.
PS: не заморачивайся, делай как умеешь, когда наберешься опыта, руки сами потянутся переписать кривой кусок кода :)

Re: Переключаться между формами

Спасибо Александр и Николай за примеры. Стало намного понятней.