<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic [SOLVED] How to interact to TabControl(NormalTab) controls in Archicad C++ API</title>
    <link>https://community.graphisoft.com/t5/Archicad-C-API/SOLVED-How-to-interact-to-TabControl-NormalTab-controls/m-p/248672#M5456</link>
    <description>&lt;DIV class="actalk-migrated-content"&gt;Hi&lt;BR /&gt;&lt;BR /&gt;I have a NormalTab control in my dialog.&lt;BR /&gt;There is a TextEdit control in NormalTab.&lt;BR /&gt;First I want to know to how I should declare the controls of the NormalTab and second get the TextEdit data in TestSettingsPageObserver class.&lt;BR /&gt;&lt;BR /&gt;Here is my code.&lt;BR /&gt;&lt;BR /&gt;resource file
&lt;PRE&gt;'GDLG'	32511	Modal 	0	0	 444  174  "Upload IFC" {
/* [  1] */ NormalTab			  0   0  428 148
								  32512 NoIcon "New" 
								  32513 NoIcon "Existing"
/* [  2] */  Button				260  106	  75   23  LargePlain		"Cancel"
/* [  3] */  Button				341  106	  75   23  LargePlain		"Upload" 
}

'DLGH'  32511  DLG_32511_Upload_IFC {
1	""							uploadTabControl
2	""							btnUpload
3	""							btnCancel
}

'GDLG'  32512    TabPage  0    0 428  100  "" {
/* [  4] */  LeftText           13   23   84   13  LargePlain		"Model file name:"
/* [  5] */  TextEdit			104  18   293  20  LargePlain		256
/* [  6] */  Separator		    13   53   385  1
}
'DLGH'  32512  TabPage_32512 {
4	""							lblModelName_New
5	""							txtModelName
6	""							seperator_2
}

'GDLG'  32513    TabPage  0    0 428  100  "" {
/* [  7] */  LeftText           13   23   84   13  LargePlain		"Model file name:"
/* [  8] */  PopupControl		104  18   293  20  144 0
/* [  9] */  Separator		    13   53   385  1

}
'DLGH'  32513  TabPage_32512 {
	7	""							lblModelName_Existing
	8	""							comboModelName
	9	""							seperator_2
}&lt;/PRE&gt;
ExportDialog.h&lt;BR /&gt;
&lt;PRE&gt;&lt;I&gt;
&lt;/I&gt;
#define IID_EXPORT						32511
#define IDT_NORMALTAB					1
#define IDB_BTN_CANCEL   				2
#define IDB_BTN_UPLOAD				        3

#define IDT_MODELNAME					5
#define IDC_EXISTING_MODEL				8

class ExportDialog : public DG::ModalDialog
{

	friend class TabControlObserver; 

private:
	DG::NormalTab   m_TabControl;
	DG::TextEdit	m_txtModelName;
	DG::Button		m_btnCancel;
	DG::Button		m_btnSave;
	DG::PopUp		m_comboModelName;

	TabControlObserver *tabControl;
	 
public:
	ExportDialog();
	~ExportDialog();
private:
	
protected:

private:
	ExportDialog(const ExportDialog&amp;amp;);
	const	ExportDialog&amp;amp; operator=(const ExportDialog&amp;amp;); //Disabled


};

// ----------------------------------------------- TabControlObserver ----------------------------------------------- 


class TabControlObserver :  public DG::PanelObserver, 
               public DG::NormalTabObserver, 
               public DG::ButtonItemObserver, 
               public DG::CompoundItemObserver 
{ 
private: 
   ExportDialog*      mDialog; 
   

protected: 
   // DG::PanelObserver 
   virtual void   PanelOpened (const DG::PanelOpenEvent&amp;amp; ev) override; 

   // DG::ButtonItemObserver 
   virtual void   ButtonClicked (const DG::ButtonClickEvent&amp;amp; ev) override; 

public: 
   explicit      TabControlObserver (ExportDialog* mainDialog); 
   ~TabControlObserver (); 
}; &lt;/PRE&gt;
ExportDialog.cpp&lt;BR /&gt;
&lt;PRE&gt;ExportDialog::ExportDialog() : 
ModalDialog (ACAPI_GetOwnResModule (), IID_EXPORT, InvalidResModule),
m_TabControl(GetReference (), IDT_NORMALTAB),
m_txtModelName(GetReference (), IDT_MODELNAME),
m_btnCancel(GetReference (), IDB_BTN_CANCEL),
m_btnSave(GetReference (), IDB_BTN_UPLOAD),
m_comboModelName(GetReference (), IDC_EXISTING_MODEL)
{
	tabControl = new TabControlObserver(this);
	m_TabControl.Attach(*tabControl); 
}

ExportDialog::~ExportDialog()
{
	//delete tabControl;
}
 
//-------------------------- Class TabControlObserver ----------------------- 

TabControlObserver::TabControlObserver (ExportDialog* mainDialog): 
   mDialog (mainDialog)
{ 
   mDialog-&amp;gt;Attach (*this); 
   AttachToAllItems (*mDialog); 
} 


TabControlObserver::~TabControlObserver () 
{ 
   mDialog-&amp;gt;Detach (*this); 
   DetachFromAllItems (*mDialog); 
} 


void TabControlObserver::PanelOpened (const DG::PanelOpenEvent&amp;amp; /*ev*/) 
{ 
   mDialog-&amp;gt;SetClientSize (mDialog-&amp;gt;GetOriginalClientWidth (), mDialog-&amp;gt;GetOriginalClientHeight ()); 
   mDialog-&amp;gt;m_TabControl.SetClientSize(mDialog-&amp;gt;GetOriginalClientWidth (),(mDialog-&amp;gt;GetOriginalClientHeight () / 2) - mDialog-&amp;gt;m_btnCancel.GetHeight());
} 


void TabControlObserver::ButtonClicked (const DG::ButtonClickEvent&amp;amp; ev) 
{ 
   // Close dialog with acceptance 
	if (ev.GetSource () == &amp;amp;mDialog-&amp;gt;m_btnCancel) { 

      mDialog-&amp;gt;PostCloseRequest (DG::ModalDialog::Accept); 
	  

    }  
	else if ( ev.GetSource() == &amp;amp;mDialog-&amp;gt;m_btnSave ) 
	{
		//here I need to get mDialog-&amp;gt;m_txtModelName text
		GS::UniString temp =  mDialog-&amp;gt;m_txtModelName.GetText(); // this value always comes empty
	}
} &lt;/PRE&gt;
My goal is to get mDialog-&amp;gt;m_txtModelName information in ButtonClicked function.&lt;/DIV&gt;</description>
    <pubDate>Tue, 01 Aug 2023 11:50:42 GMT</pubDate>
    <dc:creator>Anonymous</dc:creator>
    <dc:date>2023-08-01T11:50:42Z</dc:date>
    <item>
      <title>[SOLVED] How to interact to TabControl(NormalTab) controls</title>
      <link>https://community.graphisoft.com/t5/Archicad-C-API/SOLVED-How-to-interact-to-TabControl-NormalTab-controls/m-p/248672#M5456</link>
      <description>&lt;DIV class="actalk-migrated-content"&gt;Hi&lt;BR /&gt;&lt;BR /&gt;I have a NormalTab control in my dialog.&lt;BR /&gt;There is a TextEdit control in NormalTab.&lt;BR /&gt;First I want to know to how I should declare the controls of the NormalTab and second get the TextEdit data in TestSettingsPageObserver class.&lt;BR /&gt;&lt;BR /&gt;Here is my code.&lt;BR /&gt;&lt;BR /&gt;resource file
&lt;PRE&gt;'GDLG'	32511	Modal 	0	0	 444  174  "Upload IFC" {
/* [  1] */ NormalTab			  0   0  428 148
								  32512 NoIcon "New" 
								  32513 NoIcon "Existing"
/* [  2] */  Button				260  106	  75   23  LargePlain		"Cancel"
/* [  3] */  Button				341  106	  75   23  LargePlain		"Upload" 
}

'DLGH'  32511  DLG_32511_Upload_IFC {
1	""							uploadTabControl
2	""							btnUpload
3	""							btnCancel
}

'GDLG'  32512    TabPage  0    0 428  100  "" {
/* [  4] */  LeftText           13   23   84   13  LargePlain		"Model file name:"
/* [  5] */  TextEdit			104  18   293  20  LargePlain		256
/* [  6] */  Separator		    13   53   385  1
}
'DLGH'  32512  TabPage_32512 {
4	""							lblModelName_New
5	""							txtModelName
6	""							seperator_2
}

'GDLG'  32513    TabPage  0    0 428  100  "" {
/* [  7] */  LeftText           13   23   84   13  LargePlain		"Model file name:"
/* [  8] */  PopupControl		104  18   293  20  144 0
/* [  9] */  Separator		    13   53   385  1

}
'DLGH'  32513  TabPage_32512 {
	7	""							lblModelName_Existing
	8	""							comboModelName
	9	""							seperator_2
}&lt;/PRE&gt;
ExportDialog.h&lt;BR /&gt;
&lt;PRE&gt;&lt;I&gt;
&lt;/I&gt;
#define IID_EXPORT						32511
#define IDT_NORMALTAB					1
#define IDB_BTN_CANCEL   				2
#define IDB_BTN_UPLOAD				        3

#define IDT_MODELNAME					5
#define IDC_EXISTING_MODEL				8

class ExportDialog : public DG::ModalDialog
{

	friend class TabControlObserver; 

private:
	DG::NormalTab   m_TabControl;
	DG::TextEdit	m_txtModelName;
	DG::Button		m_btnCancel;
	DG::Button		m_btnSave;
	DG::PopUp		m_comboModelName;

	TabControlObserver *tabControl;
	 
public:
	ExportDialog();
	~ExportDialog();
private:
	
protected:

private:
	ExportDialog(const ExportDialog&amp;amp;);
	const	ExportDialog&amp;amp; operator=(const ExportDialog&amp;amp;); //Disabled


};

// ----------------------------------------------- TabControlObserver ----------------------------------------------- 


class TabControlObserver :  public DG::PanelObserver, 
               public DG::NormalTabObserver, 
               public DG::ButtonItemObserver, 
               public DG::CompoundItemObserver 
{ 
private: 
   ExportDialog*      mDialog; 
   

protected: 
   // DG::PanelObserver 
   virtual void   PanelOpened (const DG::PanelOpenEvent&amp;amp; ev) override; 

   // DG::ButtonItemObserver 
   virtual void   ButtonClicked (const DG::ButtonClickEvent&amp;amp; ev) override; 

public: 
   explicit      TabControlObserver (ExportDialog* mainDialog); 
   ~TabControlObserver (); 
}; &lt;/PRE&gt;
ExportDialog.cpp&lt;BR /&gt;
&lt;PRE&gt;ExportDialog::ExportDialog() : 
ModalDialog (ACAPI_GetOwnResModule (), IID_EXPORT, InvalidResModule),
m_TabControl(GetReference (), IDT_NORMALTAB),
m_txtModelName(GetReference (), IDT_MODELNAME),
m_btnCancel(GetReference (), IDB_BTN_CANCEL),
m_btnSave(GetReference (), IDB_BTN_UPLOAD),
m_comboModelName(GetReference (), IDC_EXISTING_MODEL)
{
	tabControl = new TabControlObserver(this);
	m_TabControl.Attach(*tabControl); 
}

ExportDialog::~ExportDialog()
{
	//delete tabControl;
}
 
//-------------------------- Class TabControlObserver ----------------------- 

TabControlObserver::TabControlObserver (ExportDialog* mainDialog): 
   mDialog (mainDialog)
{ 
   mDialog-&amp;gt;Attach (*this); 
   AttachToAllItems (*mDialog); 
} 


TabControlObserver::~TabControlObserver () 
{ 
   mDialog-&amp;gt;Detach (*this); 
   DetachFromAllItems (*mDialog); 
} 


void TabControlObserver::PanelOpened (const DG::PanelOpenEvent&amp;amp; /*ev*/) 
{ 
   mDialog-&amp;gt;SetClientSize (mDialog-&amp;gt;GetOriginalClientWidth (), mDialog-&amp;gt;GetOriginalClientHeight ()); 
   mDialog-&amp;gt;m_TabControl.SetClientSize(mDialog-&amp;gt;GetOriginalClientWidth (),(mDialog-&amp;gt;GetOriginalClientHeight () / 2) - mDialog-&amp;gt;m_btnCancel.GetHeight());
} 


void TabControlObserver::ButtonClicked (const DG::ButtonClickEvent&amp;amp; ev) 
{ 
   // Close dialog with acceptance 
	if (ev.GetSource () == &amp;amp;mDialog-&amp;gt;m_btnCancel) { 

      mDialog-&amp;gt;PostCloseRequest (DG::ModalDialog::Accept); 
	  

    }  
	else if ( ev.GetSource() == &amp;amp;mDialog-&amp;gt;m_btnSave ) 
	{
		//here I need to get mDialog-&amp;gt;m_txtModelName text
		GS::UniString temp =  mDialog-&amp;gt;m_txtModelName.GetText(); // this value always comes empty
	}
} &lt;/PRE&gt;
My goal is to get mDialog-&amp;gt;m_txtModelName information in ButtonClicked function.&lt;/DIV&gt;</description>
      <pubDate>Tue, 01 Aug 2023 11:50:42 GMT</pubDate>
      <guid>https://community.graphisoft.com/t5/Archicad-C-API/SOLVED-How-to-interact-to-TabControl-NormalTab-controls/m-p/248672#M5456</guid>
      <dc:creator>Anonymous</dc:creator>
      <dc:date>2023-08-01T11:50:42Z</dc:date>
    </item>
    <item>
      <title>Re: How to interact to TabControl(NormalTab) controls</title>
      <link>https://community.graphisoft.com/t5/Archicad-C-API/SOLVED-How-to-interact-to-TabControl-NormalTab-controls/m-p/248673#M5457</link>
      <description>Hi, &lt;BR /&gt;
 &lt;BR /&gt;
In GRC resource file the ID of the items are sequence numbers in a resource scope. &lt;BR /&gt;
So please modify your GRC resource file like this: &lt;BR /&gt;
 
&lt;PRE&gt;'GDLG'	32511	Modal 	0	0	 444  174  "Upload IFC" { 
/* [  1] */ NormalTab			  0   0  428 148 
								  32512 NoIcon "New"  
								  32513 NoIcon "Existing" 
/* [  2] */  Button				260  106	  75   23  LargePlain		"Cancel" 
/* [  3] */  Button				341  106	  75   23  LargePlain		"Upload"  
} 
 
'DLGH'  32511  DLG_32511_Upload_IFC { 
1	""							uploadTabControl 
2	""							btnUpload 
3	""							btnCancel 
} 
 
'GDLG'  32512    TabPage  0    0 428  100  "" { 
/* [  1] */  LeftText           13   23   84   13  LargePlain		"Model file name:" 
/* [  2] */  TextEdit			104  18   293  20  LargePlain		256 
/* [  3] */  Separator		    13   53   385  1 
} 
'DLGH'  32512  TabPage_32512 { 
1	""							lblModelName_New 
2	""							txtModelName 
3	""							seperator_2 
} 
 
'GDLG'  32513    TabPage  0    0 428  100  "" { 
/* [  1] */  LeftText           13   23   84   13  LargePlain		"Model file name:" 
/* [  2] */  PopupControl		104  18   293  20  144 0 
/* [  3] */  Separator		    13   53   385  1 
 
} 
'DLGH'  32513  TabPage_32513 { 
	1	""							lblModelName_Existing 
	2	""							comboModelName 
	3	""							seperator_2 
}&lt;/PRE&gt; &lt;BR /&gt;
 &lt;BR /&gt;
And don't forget to change the IDs in ExportDialog.h header file also!&lt;BR /&gt;
 &lt;BR /&gt;
Regards, &lt;BR /&gt;
Tibor</description>
      <pubDate>Wed, 25 Feb 2015 12:48:53 GMT</pubDate>
      <guid>https://community.graphisoft.com/t5/Archicad-C-API/SOLVED-How-to-interact-to-TabControl-NormalTab-controls/m-p/248673#M5457</guid>
      <dc:creator>Tibor Lorantfy</dc:creator>
      <dc:date>2015-02-25T12:48:53Z</dc:date>
    </item>
    <item>
      <title>Re: How to interact to TabControl(NormalTab) controls</title>
      <link>https://community.graphisoft.com/t5/Archicad-C-API/SOLVED-How-to-interact-to-TabControl-NormalTab-controls/m-p/248674#M5458</link>
      <description>Thank you for the response, but your answer is not helpful because I changed but it again doesn't work and also is it correct to have two control with the same ID in a class ?</description>
      <pubDate>Wed, 25 Feb 2015 15:26:48 GMT</pubDate>
      <guid>https://community.graphisoft.com/t5/Archicad-C-API/SOLVED-How-to-interact-to-TabControl-NormalTab-controls/m-p/248674#M5458</guid>
      <dc:creator>Anonymous</dc:creator>
      <dc:date>2015-02-25T15:26:48Z</dc:date>
    </item>
    <item>
      <title>Re: How to interact to TabControl(NormalTab) controls</title>
      <link>https://community.graphisoft.com/t5/Archicad-C-API/SOLVED-How-to-interact-to-TabControl-NormalTab-controls/m-p/248675#M5459</link>
      <description>&lt;BLOCKQUOTE&gt;ggiloyan wrote:&lt;BR /&gt;is it correct to have two control with the same ID in a class?&lt;/BLOCKQUOTE&gt; &lt;BR /&gt;
 &lt;BR /&gt;
No, each item must have unique ID in a class. &lt;BR /&gt;
 &lt;BR /&gt;
BUT you must define a new class for each 'GDLG' resource! &lt;BR /&gt;
So if you have 1 Modal dialog and 2 TabPage in your GRC file, then you should have 3 classes. &lt;BR /&gt;
 &lt;BR /&gt;
The example code from Tamás Zolnai in the other topic (How to create a TabControl) is imperfect. &lt;BR /&gt;
I will fix that code, please be patient!</description>
      <pubDate>Wed, 25 Feb 2015 15:44:10 GMT</pubDate>
      <guid>https://community.graphisoft.com/t5/Archicad-C-API/SOLVED-How-to-interact-to-TabControl-NormalTab-controls/m-p/248675#M5459</guid>
      <dc:creator>Tibor Lorantfy</dc:creator>
      <dc:date>2015-02-25T15:44:10Z</dc:date>
    </item>
  </channel>
</rss>

