|
First, pack your data in a class
class CMyData
{
int m_iInt;
CString m_strString;
}
Put a copy constructor and an = operator for your class.
Then have an instance in your CMainDlg (say CMyData m_MainData )
In your CChildDlg, have another instance (say CMyData m_ChildData )
So in your handler,
CMainDlg::GetNewData()
{
CChildDlg cd();
cd.CopyData(m_MainData)
_OR_
CChildDlg cd(m_MainData)
_OR_
CChildDlg cd();
cd.m_ChildData = m_MainData
if (ID_CANCEL!=cd.DoModal())
{
m_MainData = cd.m_ChildData
}
}
You will need the copy operation anyway, so better put it in the <code>CMyData</code> class.
What you must not do is get a pointer on the data in the main dlg from within the child dlg and modify the data directly, because you will not know if the user cancels the operation, so you need a buffer (in our case, m_ChildDat a)
Company policy : no access to the internet but CP
~RaGE()
|
|
|
|
|
I know this is a simple question that I will regret answering. I am currently working in Borland C++ Builder (VCL) on adding some serial port activity to an older Windows project. No .NET (just yet). Rather than character by character processing messages (NMEA) from a number of serial ports I would like something simple like 'Readline' in .NET2 or an 'fgets'. Reading to a '\n' and timeout. I have done a bit of searching and found a lot of read character by character examples. Does anyone have the magic line at hand of code or recall how to read a text line?
|
|
|
|
|
jrgrobinson wrote: Rather than character by character processing messages (NMEA) from a number of serial ports I would like something simple like 'Readline'
With the ordinary serial port driver you simply cannot do this. Each character is transmitted as a groupd of bits consisting of a start bit, the actual character value, parity bits and one or two stop bits. There's no way for the hardware to know how you want to separate messages from each other; it should not since it's the wrong OSI layer for that.
It is for an application to handle this kind of situations, or some kind of service or "daemon".
I suggest that you implement a worker thread that reads the port, assembles the NMEA messages and puts them into a queue. When a complete new message has arrived and has been put in the queue, the worker thread signals the main thread to inform that there is a new message in the queue.
In your worker thread you have to read byte-wise and each NMEA message will start with '$' and end with '\n', if I remember correctly.
This way you won't bother the main thread until there's a complete NMEA message in the queue.
Have a look at Joe Newcomer's article about serial port programming here[^]. I don't know if the article is applicable for Borland C++ Builder, but it addresses some issues that you probably should think of anyway.
"It's supposed to be hard, otherwise anybody could do it!" - selfquote
|
|
|
|
|
Thanks Roger. It does seem like the standard exhaustive read is my more intelligent option. I have been looking at some of the old MSDN (Allen Denver, Serial Communications in Win32, 1995) and there is an EV_RXFLAG which happens in response to an event character you can set in the DCB. That does mean Overlapped receiving though which is too much for this really simple task. I was hoping I could achieve that 'One-line' as .NET2 does with ReadLine. Makes for very simple code. Thanks again for your time in responding.
|
|
|
|
|
Hello,
How I can set active tab in IE7 ? I have BHO, so i know Handles of IE main window(s) and
all Internet Explorer_Server window(s).
For example, I run 2 Internet Explorers with 3 tabs inside each.
How can i set tab #2 inside IE #1 active (e.g. visible, selected, focused) ?
Thanx for help !
|
|
|
|
|
Hello comunity,
i create a new button on my dialog, is CFileDialogEx i modify them with new dialog controls,
now i need to bind a function with this one button, now i have customized CFileDialog with new controls!
I call "cMyButton.Ceate(...)" in OnInitDialog(), and cMyButton is member of CFileDialogEx.
Ok, button is showed, all other to, but without call my funktion : OnAddParam();
What is wrong, what i have to do to bind the funktion OnAddParam() wit my control?
thanks for answers
regards
break;
|
|
|
|
|
Do you have BS_NOTIFY when you create button (cMyButton.Create)
|
|
|
|
|
ups, no!
i dont have this in my Create function!!!
Here is my Create(i add BS_NOTIFY):
m_cAddNewParam.Create(L"Add new param", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | BS_NOTIFY, cRect, pParentWnd, IDC_ADD_PARAM);
BEGIN_MESSAGE_MAP(CFileDialogEx, CFileDialog)
ON_BN_CLICKED(IDC_ADD_PARAM, OnAddParam)
END_MESSAGE_MAP()
dont work again, something else what i forgot to add?!
regards
break;
|
|
|
|
|
break; wrote: something else what i forgot to add?!
Nothing wrong with this code.
|
|
|
|
|
Hello Prasad,
i cant explain my self why my button dont run this function!!!
How do you make this? Any sample code?
regards
break;
|
|
|
|
|
break; wrote: m_cAddNewParam.Create(L"Add new param", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | BS_NOTIFY, cRect, pParentWnd, IDC_ADD_PARAM);
It's not related to your problem, but the BS_NOTIFY style is not necessary.
The code you have will work, though. How do you have OnAddParam() defined?
"Approved Workmen Are Not Ashamed" - 2 Timothy 2:15
"Judge not by the eye but by the heart." - Native American Proverb
|
|
|
|
|
Im not sure its your problem but I guess maybe its of IDC_ADD_PARAM.Anyway what happens if you run this code
#define IDC_TEST 1000
...
BEGIN_MESSAGE_MAP(Ctest1Dlg, CDialog)
ON_BN_CLICKED(IDC_TEST, OnBnClickedButton0)
END_MESSAGE_MAP()
DWORD Style=WS_CHILD|WS_VISIBLE|BS_NOTIFY|WS_EX_WINDOWEDGE|WS_TABSTOP|WS_BORDER;
m_Button.CreateEx(0,_T("BUTTON"),_T("Test"),Style,0,0,100,23,this->m_hWnd,(HMENU)IDC_TEST,0);
void Ctest1Dlg::OnBnClickedButton0()
{
MessageBox(_T("test"));
}
afx_msg void OnBnClickedButton0();
|
|
|
|
|
Hello WhiteSky,
i have exact like your sample, but dont work,
ok, is little different.
#define IDC_ADD_PARAM 1130
BEGIN_MESSAGE_MAP(CFileDialogEx, CFileDialog)
ON_BN_CLICKED(IDC_ADD_PARAM, OnAddParam)
END_MESSAGE_MAP()
BOOL CFileDialogEx::OnInitDialog()
{
m_cAddNewParam.CreateEx(0 ,L"BUTTON", L"name", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | WS_TABSTOP,
cRect.left, cRect.top, 100, 25, pParentWnd->m_hWnd, (HMENU)IDC_NEWPARAM, 0);
class CFileDialogEx : public CFileDialog
{
DECLARE_DYNAMIC(CFileDialogEx)
public:
CWnd m_cAddNewParam;
protected:
afx_msg void OnAddParam();
So i use other solution:
i create a new little dialog, put all controls what i need on them,
and include this dialog on my extended CFileDialog, so i have customized own CFileDialog.
For the future, i like to know why this dont work!
thanks for help
break;
|
|
|
|
|
Hi break;
If you declare CButton m_cAddNewParam; instead CWnd m_cAddNewParam; and insert BS_NOTIFY what happens?
|
|
|
|
|
Hi,
nothing happens, the same!
Ok, i think i use the solution with extra dialog with controls,
like in the answer before, that works!
thanks
break;
|
|
|
|
|
I was working with custom dialog(GetOpenFileName)and it was good.Did you check for IDC_ADD_PARAM 1130 is it a unique value ?
|
|
|
|
|
I think problem is on the detialy because if you run this code on the a project you can see a button and it response to clicks
|
|
|
|
|
Hi All,
when i call loadXML there is some memory leak.
please give me a solution to avoid memory leak.
|
|
|
|
|
voorugonda prashanth wrote: please give me a solution to avoid memory leak.
delete your pointers, or use smart pointers
|
|
|
|
|
voorugonda prashanth wrote: when i call loadXML there is some memory leak
How you are verifying this ? Can you show code ?
voorugonda prashanth wrote: please give me a solution to avoid memory leak.
Release memory allocated. As already suggested use smart pointers.
Delete memory allocated using new .
|
|
|
|
|
i displayed the filpath in my listview's first item. when I close the application its stored in xml file and when application reopen it will restore the data in the listview again through reading the xml file . when i read the data and dispaly item in the listview it will show me the UNICODE CHAR
e.g. like square box.
how can remove it please help me.
Amit
|
|
|
|
|
amitmistry_petlad wrote: it will show me the UNICODE CHAR
How can you be sure that it reads the characters in unicode ? It can simply be that you display a string that is wrong, perhaps because it failed during the load (or you did it wrong). Did you use your debugger to check if everything was as expected ?
|
|
|
|
|
when i wrote in the file it is like below
<filelist>
- <listitem type="dir" order="0">
<path>C:\Documents and Settings\Amit\Desktop\MediaFiles\</path>
</listitem>
</filelist>
then second time when i reopen and read from the file
.....<path>
C:\Documents and Settings\Amit\Desk
it is ok but then it will give three squarebox.
when i debug it is ok and display normal text but when dispaly in the listview at that time it gives square box in the listview GUI.
what should i do ?
the code is following
<pre>
if(inputtype=="dir")
{
if(tmp.find("order") != -1)
{
size_t pos1 = tmp.find_last_of("=");
string tmporder = tmp.substr(pos1 + 2);
size_t pos2 = tmporder.find_last_of("\"");
string inputorder = tmporder.substr(0,pos2);
int i=atoi(inputorder.c_str());
tok = strtok_s(NULL,"<>",&token);
tmp=tok;
if(tmp.find("path") != -1)
{
tok = strtok_s(NULL,"<>",&token);
string filename=tok;
WCHAR* DIRPATH=util.ConvertStringToWCHAR(filename.c_str());//i have done it both way with string as well as with tok but not successful
LvItem.pszText=(LPWSTR)DIRPATH;
SendMessage(hList,LVM_INSERTITEM,i,(LPARAM)&LvItem);
}
</pre>
-- modified at 22:54 Tuesday 13th February, 2007
|
|
|
|
|
amitmistry_petlad wrote: when i wrote in the file it is like below
<filelist>
<listitem type="dir" order="0"> <path>C:\Documents and Settings\Amit\Desktop\MediaFiles\
You should really use a XML-Parser instead of code it by hand.
Try TinyXML[^] or CMarkup[^]
Are you sure your ConvertStringToWCHAR() is working as expected?
In the Debugger, DIRPATH and filename look the same?
You are setting pszText , but not setting the mask accordingly.
Are you sure LVM_INSERTITEM can cope with unicode? I am not, but I never tried. it.
Wouldn't it be easier to use the CListCtrl s member InsertItem() ?
"We trained hard, but it seemed that every time we were beginning to form up into teams we would be reorganised. I was to learn later in life that we tend to meet any new situation by reorganising: and a wonderful method it can be for creating the illusion of progress, while producing confusion, inefficiency and demoralisation."
-- Caius Petronius, Roman Consul, 66 A.D.
|
|
|
|
|
jhwurmbach wrote: Are you sure your ConvertStringToWCHAR() is working as expected?
1)yes.ConvertStringToWCHAR() its working
jhwurmbach wrote: In the Debugger, DIRPATH and filename look the same?
2)yes. at the time of debugging i have checked it .both same .
jhwurmbach wrote: You are setting pszText, but not setting the mask accordingly.
is it must?
jhwurmbach wrote: Wouldn't it be easier to use the CListCtrls member InsertItem()?
i will try it out.
but i am using win32 .ok
jhwurmbach wrote: Are you sure LVM_INSERTITEM can cope with unicode? I am not, but I never tried. it.
that i dont know
|
|
|
|
|