|
jokefake wrote:
i just removed some of the lines from the code
void CSpeedDial::OnSpeedDelete()
{
POSITION pos = m_speedList.GetFirstSelectedItemPosition();
int index = m_speedList.GetNextSelectedItem(pos);
m_speedList.DeleteItem(index);
// TODO: Add your control notification handler code here
}
Which can be shortened to:
void CSpeedDial::OnSpeedDelete()
{
int index = m_speedList.GetNextItem(-1, LVIS_SELECTED);
if (index != -1)
m_speedList.DeleteItem(index);
} jokefake wrote: but how can i move an item up and down in the list
By deleting it and inserting it into the correct location.
"The largest fire starts but with the smallest spark." - David Crow
"Judge not by the eye but by the heart." - Native American Proverb
|
|
|
|
|
thanks, that code is really short and simple.
I tried moving a selected item up in the list control, but it is not working.
what may wrong with the code
void CTestingDlg::OnUp()
{
int index = m_cListCtrl.GetNextItem(-1, LVIS_SELECTED);
m_cListCtrl.InsertItem(index -1, m_cListCtrl.GetItemText(index, index));
m_cListCtrl.DeleteItem(index +1);
// TODO: Add your control notification handler code here
}
|
|
|
|
|
Delete first, then insert.
"The largest fire starts but with the smallest spark." - David Crow
"Judge not by the eye but by the heart." - Native American Proverb
|
|
|
|
|
deleting it first, deletes the row as i click on the buttom
i extracted my code from here.
BOOL CListCtrlEx::MoveRow(int from, int to)
{
//Can't move to the same place, or from or to a negative index
if(from == to || from < 0 || to < 0)
return FALSE;
//First Copy the row to the new location
if(CopyRow(from, to))
{
//If we have just inserted a row before
//this one in the list, we need to increment
//our index.
if(from > to)
DeleteItem(from + 1);
else
DeleteItem(from);
return TRUE;
}
else
return FALSE;
}
BOOL CListCtrlEx::CopyRow(int from, int to)
{
//Can't move to the same place, or from or to a negative index
if(from == to || from < 0 || to < 0)
return FALSE;
//Copy the row to the new index
InsertItem(to, GetItemText(from, 0));
//If row has been inserted before original
//increment the original
if(from > to)
from++;
//Loop through subitems
for(int i = 1; i < GetColumnCount(); i++)
{
SetItemText(to, i, GetItemText(from, i));
}
return TRUE;
}
|
|
|
|
|
It's not a good idea to copy code from elsewhere unless you have a good understanding of what it is doing. If the code is doing a specific task and you copy it to a new location, its role will change.
void OnClickMoveUp( void )
{
int nIndex;
CString strCommand;
nIndex = m_listctrl.GetNextItem(-1, LVNI_SELECTED);
ASSERT(-1 != nIndex);
strCommand = m_listctrl.GetItemText(nIndex, 0);
m_listctrl.DeleteItem(nIndex);
nIndex = m_listctrl.InsertItem(nIndex - 1, strCommand);
}
"The largest fire starts but with the smallest spark." - David Crow
"Judge not by the eye but by the heart." - Native American Proverb
|
|
|
|
|
thanks, it works perfectly with a list with only one column, what about if you have 2 columns
|
|
|
|
|
jokefake wrote: it works perfectly with a list with only one column, what about if you have 2 columns
Multiple calls to GetItemText() , for starters.
"The largest fire starts but with the smallest spark." - David Crow
"Judge not by the eye but by the heart." - Native American Proverb
|
|
|
|
|
i did sth like this and the result was no good at all
void CTestingDlg::OnUp()
{
int nIndex;
CString strCommand,strCommand2;
nIndex = m_cListCtrl.GetNextItem(-1, LVNI_SELECTED);
ASSERT(-1 != nIndex);
strCommand = m_cListCtrl.GetItemText(nIndex, 0);
strCommand2 = m_cListCtrl.GetItemText(0,nIndex);
m_cListCtrl.DeleteItem(nIndex);
nIndex = m_cListCtrl.InsertItem(nIndex - 1, strCommand);
m_cListCtrl.SetItemText(nIndex-1,1, strCommand2);
}
|
|
|
|
|
jokefake wrote: strCommand2 = m_cListCtrl.GetItemText(0,nIndex);
Should be:
strCommand2 = m_cListCtrl.GetItemText(nIndex, 1);
"The largest fire starts but with the smallest spark." - David Crow
"Judge not by the eye but by the heart." - Native American Proverb
|
|
|
|
|
do i have to do changes to the last code. the text on the 2nd column are not showing
m_cListCtrl.SetItemText(nIndex-1,1, strCommand2);
|
|
|
|
|
jokefake wrote: the text on the 2nd column are not showing
What does SetItemText() return? Have you verified that strCommand2 contains anything?
"The largest fire starts but with the smallest spark." - David Crow
"Judge not by the eye but by the heart." - Native American Proverb
|
|
|
|
|
strCommand contains the correct string. i think the problem have to do with the SetWindowText. do you have any suggestion of what i can do.
-- modified at 6:02 Wednesday 12th July, 2006
|
|
|
|
|
jokefake wrote: i think the problem have to do with the SetWindowText.
SetWindowText() is not used with a list control.
"The largest fire starts but with the smallest spark." - David Crow
"Judge not by the eye but by the heart." - Native American Proverb
|
|
|
|
|
1)Try CListCtrl::DeleteItem
2)Try LVN_KEYDOWN Notification after adding notify_reflect
3)Try LVN_INSERTITEM Notification and keep a counter along with the LVN_DELETEITEM were you will decrement it and wen it becomes 8 disable it .
Regards,
FarPointer
Blog:FARPOINTER
|
|
|
|
|
i try sth like this but is not working
void CSpeedDial::OnSpeedDelete()
{
POSITION pos = m_speedList.GetFirstSelectedItemPosition();
if(pos == NULL) return;
int index = m_speedList.GetNextSelectedItem(pos);
if(index<0 || index>m_speedList.GetItemCount()||
m_speedList.GetItemCount()!= m_speedArray.GetSize())
return;
m_speedList.DeleteItem(index);
m_speedArray.RemoveAt(index);
// TODO: Add your control notification handler code here
}
|
|
|
|
|
Hi all,
Can anyone point me the links where i can find Win32 and MFC faq (not releated to UI Programming). on topics like Multi-Threading,Sockets, IPC, Hooks for quick refernce and with quick example.
Regards
Abhishake
|
|
|
|
|
|
Wow, that is a big take. Jeffery Ritcher's book "Programming Applications with Microsoft Windows" is a must for system (non-GUI) developers. I don't think it has a free web version, though.
Best,
Jun
|
|
|
|
|
|
|
Hi together,
I need some help. I'm having some old VC6 code which works fine:
FILE* pipe = _popen("MyPipe", "r");
streambuf* buf = new stdiobuf(pipe);
istream in(buf); However, I have to get it run in VS2005 where it doesn't compile. For example, the function stdiobuf() doesn't exist any more
As far as I understand it: The new template-based stream functions can't handle file descriptors any more.
So, here's my question: How can I get data from a pipe to an istream object? I need it this way, because the rest of the old code works on istreams.
Thank you very much for your help in advance!
Regards,
Marcus.
|
|
|
|
|
Imagine.. in the ATL implementation, we have a collection or an array, ie :
int num[5];
num[0]=100;..... [5]=500;
Now in my client, (i.e VB) , I need to access them like,
(Imagine collection is the property which points to the array I've mentioned above}
msgbox (MyComp.Collection[0])
It should popup 100.
A little bit urgent !
|
|
|
|
|
Meat Loaf wrote: int num[5];
num[0]=100;..... [5]=500;
If you are going to be accessing num[5] , you'll need to use:
int num[6]; That has no bearing on your problem however.
"The largest fire starts but with the smallest spark." - David Crow
"Judge not by the eye but by the heart." - Native American Proverb
|
|
|
|
|
why 6 ?
If we say int num[5], it naturally has six elements right? 0,1,2,3,4,5.
so num[5] would point to 6th element. what's wrong here I dont understand. ..
NULL
|
|
|
|
|
Arrays in C are 0-based. By declaring int num[5] , the largest index value you could access would be num[4] .
"The largest fire starts but with the smallest spark." - David Crow
"Judge not by the eye but by the heart." - Native American Proverb
|
|
|
|