|
A list control can not store double values without additional handling. To set the text of an item to a floating point value it must be converted. Read the documentation of the used sprintf, _sprintf_l, swprintf, _swprintf_l, __swprintf_l[^] function.
So you have to use something like
WCHAR szString[256];
swprintf(szString, sizeof(szString) / sizeof(WCHAR), L"%G", value);
But it would be better to use _snprintf_s, _snprintf_s_l, _snwprintf_s, _snwprintf_s_l[^] here:
TCHAR szString[256];
_sntprintf_t(szString, sizeof(szString) / sizeof(TCHAR), _T("%G"), value);
To get a double value back when reading the cell text use _tstof (atof, _atof_l, _wtof, _wtof_l[^]):
double CDataDialog::GetItemDouble(HWND hWnd, int nItem, int nSubItem) const
{
CString str = GetItemText(hWnd, nItem, nSubItem);
return _tstof(str);
}
modified 20-Mar-17 9:01am.
|
|
|
|
|
I did it but I got this: "no suitable constructor exists from double to ATL::CStringT wchar_t StrTraitMFC__DLL<wchar_t,atl chtraitsctr<wchar_t="">>>" on
CString str = GetItemText(hWnd, nItem, nSubItem);
If I don't turn data from string to double could I "pass" them in a text file after edit them on the list view?
|
|
|
|
|
Sorry, forget to rename it during copy & paste. Should be named GetItemDouble :.
double CDataDialog::GetItemDouble(HWND hWnd, int nItem, int nSubItem) const
{
CString str = GetItemText(hWnd, nItem, nSubItem);
return _tstof(str);
}
|
|
|
|
|
Thank you very much Sir!It was compiled fine!! I got a message about "Unhandled exception" when tried to write on second dialog but I must have made a mistake on code.Could I save editable data from list view on text file without converting them from string type?
|
|
|
|
|
Use the debugger to find out when the exception occurs and check the code lines that has been executed before.
You can write strings directly to text files when using appropriate file functions. But those will be then Unicode text files (when having a Unicode build) and the file class does no perform implicit conversion to ANSI text.
|
|
|
|
|
Vielen Dank!
|
|
|
|
|
Is there some very important reason for you to use in a MFC application plain Win32 macros/messages to handle List Control?
What is wrong to use CListCtrl Class methods?
|
|
|
|
|
Yes!As I mentioned above I am looking for a way to save all editable data in list view in a text file.
|
|
|
|
|
lolici wrote: ...I am looking for a way to save all editable data in list view in a text file. What does that have to do with not using MFC?
"One man's wage rise is another man's price increase." - Harold Wilson
"Fireproof doesn't mean the fire will never come. It means when the fire comes that you will be able to withstand it." - Michael Simmons
"You can easily judge the character of a man by how he treats those who can do nothing for him." - James D. Miles
|
|
|
|
|
Hi
I am trying to commucate with a sensor usimg 32 bit crc. I am using pre-built 32bit crc table. How can I implement error detection code? Sensor sends 38bytes of data with a header 0x93.
|
|
|
|
|
There is an error if the CRC send with the message is not the same as those calculated for the received message. So you have to
- Receive message
- Calculate CRC for received message
- Compare with CRC which is part of the message
The final implementation depends on the used message format which should be part of the sensor documentation.
|
|
|
|
|
thank you for your answer here is the code part of my project.
for aye=bytePullIdx:(crcIdx-1)
a = bitand(bitxor(byteBufferPtr(aye),bitshift(crc,-24)),hex2dec('FF'));
crc = bitxor(bitshift(crc,8),crcLookupTable2(a));
abowe byteBufferPtr is coming message (38bytes) crcLookupTable is pre-built table for crc polynom '04C11DB7'. after calculating crc I check if (crc==byteBufferPtr(crcIdx) condition to get the data.
Is there anything wrong here? because I could not get the right if condition here. I could not find the right crc value among the crc table values.
Thank you.
|
|
|
|
|
You need to find out what the sensor uses to calculate its CRC.
|
|
|
|
|
Actually I am working on code offline. I took 38byte of data starting with header and put it my code. The sensor is sensonor stim300
|
|
|
|
|
I do not think anyone here can guess what data the device will produce. You should check the technical documentation for the device, or contact the manufacturer.
|
|
|
|
|
The device produces 32bit crc with polynomial
0x04c11db7 What else do i need to ask?
|
|
|
|
|
|
Hi all of you. Is there a way to catch double-click event on an MDI client area, but when CMainFrame are derived from CMDIFrameWndEx, not from CMDIFrameWnd ?
I have solved this problem in the past (Catch double-click in CMainFrame[^]), when CMainFrame was derived from CMDIFrameWnd, but that trick doesn't work now ...
Can you give me a little help to solve this issue ? Thank you.
|
|
|
|
|
The CMDIFrameWndEx class extends CMDIFrameWnd , so it should work exactly the same.
|
|
|
|
|
I have applied the same technique:
if(! m_wndMDIClient.SubclassWindow(m_hWndMDIClient))
{
TRACE0(_T("Failed to create the MDI client window\n"));
return -1;
}
but get me ASSERT error: wincode.cpp , line 330, but at "Retry" the IDE led me here:
extern "C" int WINAPI
_tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
_In_ LPTSTR lpCmdLine, int nCmdShow)
#pragma warning(suppress: 4985)
{
return AfxWinMain(hInstance, hPrevInstance, lpCmdLine, nCmdShow);
}
I don't think it is so simple now, with new CMDIFrameWndEx ... I nthe meantime, I have found this: Debug Assertion Failed While Subclassing MDIClient Window VC++ 2008[^]
|
|
|
|
|
I don't see that that has anything to do with your original question. And since you are subclassing the Window, it may well be that you are doing something wrong.
If you go and look at the MSDN documentation you will see that the CMDIFrameWndEx does not block any of the methods of CMDIFrameWnd .
|
|
|
|
|
Applying old code, simply not working in this new case ... hmm ... I have to dig in ...
|
|
|
|
|
|
Hello everyone,
I have created a list view(Declared in CDataDialog) with data . I want the list view to have as rows-cells as the conductors so I used :for (int i = 1; i<= m_DialogCon; i++) (m_DialogCon is the variable which representes the number of conductors but was declared in CFeaturesDialog). How could I use m_DialogCon variable in CDataDialog?
Here is the code:
void CDataDialog::InsertItems()
{
HWND hWnd = ::GetDlgItem(m_hWnd, IDC_LIST1);
LVCOLUMN list;
list.mask = LVCF_TEXT | LVCF_WIDTH |
LVCF_FMT | LVCF_SUBITEM;
list.fmt = LVCFMT_LEFT;
list.cx = 50;
list.pszText = L"Conductor";
list.iSubItem = 0;
::SendMessage(hWnd, LVM_INSERTCOLUMN,
(WPARAM)0, (WPARAM)&list);
list.cx = 100;
list.pszText = L"Resistivity";
list.iSubItem = 1;
::SendMessage(hWnd, LVM_INSERTCOLUMN,
(WPARAM)1, (WPARAM)&list);
list.cx = 100;
list.pszText = L"Permeability";
list.iSubItem = 2;
::SendMessage(hWnd, LVM_INSERTCOLUMN,
(WPARAM)2, (WPARAM)&list);
list.cx = 100;
list.pszText = L"Outer Diameter";
list.iSubItem = 3;
::SendMessage(hWnd, LVM_INSERTCOLUMN,
(WPARAM)3, (WPARAM)&list);
list.cx = 100;
list.pszText = L"Inner Diameter";
list.iSubItem = 4;
::SendMessage(hWnd, LVM_INSERTCOLUMN,
(WPARAM)4, (WPARAM)&list);
list.cx = 100;
list.pszText = L"Rdc";
list.iSubItem = 5;
::SendMessage(hWnd, LVM_INSERTCOLUMN,
(WPARAM)5, (WPARAM)&list);
list.cx = 100;
list.pszText = L"x component";
list.iSubItem = 6;
::SendMessage(hWnd, LVM_INSERTCOLUMN,
(WPARAM)6, (WPARAM)&list);
list.cx = 100;
list.pszText = L"y component";
list.iSubItem = 7;
::SendMessage(hWnd, LVM_INSERTCOLUMN,
(WPARAM)7, (WPARAM)&list);
for (int i = 1; i<= m_DialogCon; i++)
{
SetCell(hWnd, L"1", 0, 0);
SetCell(hWnd, L"0.0000386063", 0, 1);
SetCell(hWnd, L"1", 0, 2);
SetCell(hWnd, L"0.025146", 0, 3);
SetCell(hWnd, L"0.00971", 0, 4);
SetCell(hWnd, L"0.09136", 0, 5);
SetCell(hWnd, L"0", 0, 6);
SetCell(hWnd, L"15.24", 0, 7);
}
}
void CDataDialog::SetCell(HWND hWnd1,
CString value, int nRow, int nCol)
{
TCHAR szString[256];
wsprintf(szString, value, 0);
LVITEM lvItem;
lvItem.mask = LVIF_TEXT;
lvItem.iItem = nRow;
lvItem.pszText = szString;
lvItem.iSubItem = nCol;
if (nCol >0)
::SendMessage(hWnd1, LVM_SETITEM,
(WPARAM)0, (WPARAM)&lvItem);
else
ListView_InsertItem(hWnd1, &lvItem);
}
class CDataDialog : public CDialog
{
DECLARE_DYNAMIC(CDataDialog)
public:
CDataDialog(CWnd* pParent = NULL);
virtual ~CDataDialog();
#ifdef AFX_DESIGN_TIME
enum { IDD = IDD_DIALOG2 };
#endif
protected:
virtual void DoDataExchange(CDataExchange* pDX);
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnBnClickedOk();
afx_msg void OnBnClickedExit();
void InsertItems();
void SetCell(HWND hWnd1, CString value, int nRow, int nCol);
CString GetItemText(HWND hWnd, int nItem, int nSubItem) const;
afx_msg void OnClickList1(NMHDR *pNMHDR, LRESULT *pResult);
afx_msg void OnOK();
BOOL OnInitDialog();
int nItem;
int nSubItem;
};
|
|
|
|
|
Just pass it as argument to InsertItems() . If you need it also with other functions save it in a member variable.
But it is actually not used in a meaningful context in your code. You are just overwriting the cell content multiple times with the same values.
|
|
|
|
|