ListBox Select
Danie Viljoen -- A72820@kepnfs02.eskom.co.za
Wednesday, November 27, 1996
Environment : VC++1.5 , Win3.1
Hi there, I'm am just a hobbiest, but I really need your help?
After struggeling to get data into a Listbox, in a Dialogbox, I
cannot get the selected item out of it
PLEASE HELP
My code follows
void CMainWnd::CMEdit()
{
CString Data;
FNameList.RemoveAll();
//make list to display in listbox
for(int tel=1; tel <= counter; tel++){
Data=MainData[tel].FSurname;
Data+=", ";
Data+=MainData[tel].FName;
FNameList.AddTail(Data);
}
CApp2Dialog Dlg(this);
Dlg.DNameList=&FNameList;
if (Dlg.DoModal()==IDOK)
{
CString selectString;
// for debugging
char TestString[10];
CListBox* MyListBox = (CListBox*)(GetDlgItem(IDC_LIST1));
int selectno=MyListBox->GetCurSel();
// for debugging, to see the index of selected item, I
//always get a 0 back and I dont no way???
sprintf(TestString,"%i",selectno);
MessageBox(TestString,"info",MB_OK|MB_ICONINFORMATION);
// Another problem, even when I change the selectno to a
//constant, for example 2 I still gets a empty string back???
MyListBox->GetText(selectno, selectString);
MessageBox((const char*) selectString, "info", MB_OK|MB_ICONINFORMATION);
}
}
PLEASE HELP ME ?
Danie
LeRoy Baxter -- lbaxter@transport.com
Saturday, November 30, 1996
By the time you exit the DoModal(), any Windows (as opposed to MFC)
objects have been destroyed -- including your Listbox. You cannot use
GetDialogItem() from the Parent (as you have done here). Your
Dialog class will have to extract the relevant data an put it in member
variables in the CApp2Dialog class.
to rephrase; the MFC class has persistence within your app - the
actual Windows object (the dialog) is created and destroyed within
the DoModal().
On Tuesday, November 26, 1996 11:37 PM, Danie Viljoen[SMTP:A72820@kepnfs02.eskom.co.za] wrote:
>Environment : VC++1.5 , Win3.1
>
>Hi there, I'm am just a hobbiest, but I really need your help?
>
>After struggeling to get data into a Listbox, in a Dialogbox, I
>cannot get the selected item out of it
>
>PLEASE HELP
>
>My code follows
>
>void CMainWnd::CMEdit()
>{
> CString Data;
>
>
> FNameList.RemoveAll();
> //make list to display in listbox
> for(int tel=1; tel <= counter; tel++){
> Data=MainData[tel].FSurname;
> Data+=", ";
> Data+=MainData[tel].FName;
> FNameList.AddTail(Data);
> }
>
> CApp2Dialog Dlg(this);
> Dlg.DNameList=&FNameList;
> if (Dlg.DoModal()==IDOK)
> {
> CString selectString;
>
> // for debugging
> char TestString[10];
>
> CListBox* MyListBox = (CListBox*)(GetDlgItem(IDC_LIST1));
> int selectno=MyListBox->GetCurSel();
>
> // for debugging, to see the index of selected item, I
> //always get a 0 back and I dont no way???
> sprintf(TestString,"%i",selectno);
> MessageBox(TestString,"info",MB_OK|MB_ICONINFORMATION);
>
> // Another problem, even when I change the selectno to a
> //constant, for example 2 I still gets a empty string back???
> MyListBox->GetText(selectno, selectString);
> MessageBox((const char*) selectString, "info", MB_OK|MB_ICONINFORMATION);
> }
>}
>
>PLEASE HELP ME ?
>
>Danie
>
Luke Stephens -- luker@tfs.net
Sunday, December 01, 1996
After the DoModal() ends, the dialog is dead and the controls on the dialog
are also dead. You must retrieve values from within the dialog class.
Luke Stephens
luker@tfs.net
----------
> From: Danie Viljoen
> To: mfc-l@netcom.com
> Subject: ListBox Select
> Date: Wednesday, November 27, 1996 1:37 AM
>
> Environment : VC++1.5 , Win3.1
>
> Hi there, I'm am just a hobbiest, but I really need your help?
>
> After struggeling to get data into a Listbox, in a Dialogbox, I
> cannot get the selected item out of it
>
> PLEASE HELP
>
> My code follows
>
> void CMainWnd::CMEdit()
> {
> CString Data;
>
>
> FNameList.RemoveAll();
> //make list to display in listbox
> for(int tel=1; tel <= counter; tel++){
> Data=MainData[tel].FSurname;
> Data+=", ";
> Data+=MainData[tel].FName;
> FNameList.AddTail(Data);
> }
>
> CApp2Dialog Dlg(this);
> Dlg.DNameList=&FNameList;
> if (Dlg.DoModal()==IDOK)
> {
> CString selectString;
>
> // for debugging
> char TestString[10];
>
> CListBox* MyListBox = (CListBox*)(GetDlgItem(IDC_LIST1));
> int selectno=MyListBox->GetCurSel();
>
> // for debugging, to see the index of selected item, I
> //always get a 0 back and I dont no way???
> sprintf(TestString,"%i",selectno);
> MessageBox(TestString,"info",MB_OK|MB_ICONINFORMATION);
>
> // Another problem, even when I change the selectno to a
> //constant, for example 2 I still gets a empty string back???
> MyListBox->GetText(selectno, selectString);
> MessageBox((const char*) selectString, "info",
MB_OK|MB_ICONINFORMATION);
> }
> }
>
> PLEASE HELP ME ?
>
> Danie
Paul Todd. -- paul@pault.demon.co.uk
Sunday, December 01, 1996
Hi Danie,
Have you looked at the DoDataExchange method in a dialog box
When the DoModal loop in a dialog ends, all controls in the dialog are
destroyed.
So accessing the listbox outside of the Modal loop is not possible.
You need to create a public member variable such as m_strSelectedString in
the class and then in the DoDataExchange use DDX_LBString(pDX, IDC_LIST1,
m_strSelectedString);
You can then call TRACE1("The string was %s", dlg->m_strSelectedString)
If you need to send me all the original code and I will comment where you
are going wrong
Paul Todd.
----------
> From: Danie Viljoen
> To: mfc-l@netcom.com
> Subject: ListBox Select
> Date: 27 November 1996 07:37
>
> Environment : VC++1.5 , Win3.1
>
> Hi there, I'm am just a hobbiest, but I really need your help?
>
> After struggeling to get data into a Listbox, in a Dialogbox, I
> cannot get the selected item out of it
>
> PLEASE HELP
>
> My code follows
>
> void CMainWnd::CMEdit()
> {
> CString Data;
>
>
> FNameList.RemoveAll();
> //make list to display in listbox
> for(int tel=1; tel <= counter; tel++){
> Data=MainData[tel].FSurname;
> Data+=", ";
> Data+=MainData[tel].FName;
> FNameList.AddTail(Data);
> }
>
> CApp2Dialog Dlg(this);
> Dlg.DNameList=&FNameList;
> if (Dlg.DoModal()==IDOK)
> {
> CString selectString;
>
> // for debugging
> char TestString[10];
>
> CListBox* MyListBox = (CListBox*)(GetDlgItem(IDC_LIST1));
> int selectno=MyListBox->GetCurSel();
>
> // for debugging, to see the index of selected item, I
> //always get a 0 back and I dont no way???
> sprintf(TestString,"%i",selectno);
> MessageBox(TestString,"info",MB_OK|MB_ICONINFORMATION);
>
> // Another problem, even when I change the selectno to a
> //constant, for example 2 I still gets a empty string back???
> MyListBox->GetText(selectno, selectString);
> MessageBox((const char*) selectString, "info",
MB_OK|MB_ICONINFORMATION);
> }
> }
>
> PLEASE HELP ME ?
>
> Danie
Jim Lawson Williams -- jimlw@mail.ccur.com.au
Monday, December 02, 1996
At 07:37 AM 27-11-96 GMT+2, you wrote:
>Environment : VC++1.5 , Win3.1
>
>Hi there, I'm am just a hobbiest, but I really need your help?
>
>After struggeling to get data into a Listbox, in a Dialogbox, I
>cannot get the selected item out of it
G'day Danie!
I guess I could give a fairly grumpy response of "Go away and find a
Beginner's list!" However, from your question I infer that, while you
have programming experience, you've missed the links between external
events, the operating system, and application programs.
As the code is written, you load the list with data, display it, and
immediately test for a selection.
Think about it. Even on an 8086 there's no way the User is going to be
able to make a selection unless the program allows an appropriate
interval between displaying the dialog and looking for a selection.
You are getting a "no selection made" result. One logical explanation
would have to be "there's no 'wait' occurring". So, somehow or other
you are going to have to allow for the User to read the list-items
(which may involve scrolling up and down), think about the choices,
move the cursor to the chosen item, then "click". You are going to
have to yield control to the operating system and wait for it to wake
you up when the appropriate event has occurred.
In older-style systems this sequence might have been handled by
displaying a "prompt" message, followed by a simple "read-and-wait"
request, transferring control to the OS to do the physical device
control -- and whatever other tasks needed scheduling. With IO
complete, execution would eventually resume at the next sequential
instruction in the application program. It appears as if you are
trying to follow this model, which is entirely inappropriate: here the
User is not limited to one single action,and particularly not to the
data currently on display if the list-size is greater than the
display-area.
In the system you are using there are a much richer set of features,
though the User-input devices are (in the majority) limited to a
keyboard and a mouse. Windows and the Application Interface code are
interpreting every key-press, every mouse-event, and relating each to
the mix of tasks. In effect, a properly-functioning application is
hanging an implicit "wake-me-when-it-happens" read on every active
menu-item, every active control-bar button, and more beside.
Windows and MFC (as your chosen application platform) take the
responsibility for recognizing that a particular user-action has
occurred, and that the action has some meaning in the context of your
program. "Mouse-move" may be meaningful to some programs, require no
handling by others. Unless an event is defined as "meaningful", it
obviously has to be considered "meaningless" and discarded. You have
to define the events that interest you. You have to define how those
interesting events are to be handled.
In Windows the general mechanism for notifying programs of events is
through "messages". In VC++, the "message map" defines what messages
are to be accepted, and the handler-routine corresponding to each
message. In your particular case you want to catch the
"user-has-made-a-selection" message, which the Wizard will generate as
ON_LBN_SELCHANGE(IDC_LIST1, OnSelchangeList1)
in 4.1 (something similar in 1.5?) and insert a skeleton code-block
into your .CPP file.
I most strongly recommend you buy at least one book on MFC
programming. You will get a proper overview of how things work.
Good luck! Jim LW >From the BBC's "Barchester Chronicles":
"I know that ultimately we are not supposed to understand. But I
also know that we must try."
-- the Reverend Septimus Harding, C++ programmer
Greg D. Tighe -- gdt@eng.aisinc.com
Monday, December 02, 1996
> From: "Danie Viljoen"
> Environment : VC++1.5 , Win3.1
>
> Hi there, I'm am just a hobbiest, but I really need your help?
>
> After struggeling to get data into a Listbox, in a Dialogbox, I
> cannot get the selected item out of it
>
> PLEASE HELP
>
Danie,
Use ClassWizard to create a member variable in your dialog class
which is of type CString and is associated with your dialog's
listbox. When the DoModal() call returns the member variable will be
set to the selected item's text.
The reason your code did not work was that you were calling
CMainWnd::GetDlgItem() by default instead of explicitly calling
Dlg.GetDlgItem(). This probably would not have worked anyway after
the dialog window (and all control windows along with it) was
destroyed before returning from DoModal().
-Greg Tighe
Applied Intelligent Systems, Inc.
Ann Arbor, MI
gdt@aisinc.com
Nitin Bhide -- nitinb@gsslco.co.in
Tuesday, December 03, 1996
Environment : VC++1.5 , Win3.1
Hi there, I'm am just a hobbiest, but I really need your help?
After struggeling to get data into a Listbox, in a Dialogbox, I
cannot get the selected item out of it
PLEASE HELP
My code follows
void CMainWnd::CMEdit()
{
CString Data;
FNameList.RemoveAll();
//make list to display in listbox
for(int tel=1; tel <= counter; tel++){
Data=MainData[tel].FSurname;
Data+=", ";
Data+=MainData[tel].FName;
FNameList.AddTail(Data);
}
CApp2Dialog Dlg(this);
Dlg.DNameList=&FNameList;
if (Dlg.DoModal()==IDOK)
{
CString selectString;
// for debugging
char TestString[10];
CListBox* MyListBox = (CListBox*)(GetDlgItem(IDC_LIST1));
int selectno=MyListBox->GetCurSel();
// for debugging, to see the index of selected item, I
//always get a 0 back and I dont no way???
sprintf(TestString,"%i",selectno);
MessageBox(TestString,"info",MB_OK|MB_ICONINFORMATION);
// Another problem, even when I change the selectno to a
//constant, for example 2 I still gets a empty string back???
MyListBox->GetText(selectno, selectString);
MessageBox((const char*) selectString, "info", MB_OK|MB_ICONINFORMATION);
}
}
PLEASE HELP ME ?
Danie
----------------------------------------------------------------------------------------------------------------
When DoModal function is finished Dialog window and its child windows are destroyed.
Extract the selected item index and text of list box in your dialogs OnOK function. Store it in a
member variable of your dialog class and access those member variables after DoModal
function to get the selected item in the list.
Add a member variable CString m_selectString to your CApp2Dialog class.
CApp2Dialog::OnOK()
{
// for debugging
char TestString[10];
CListBox* MyListBox = (CListBox*)(GetDlgItem(IDC_LIST1));
int selectno=MyListBox->GetCurSel();
sprintf(TestString,"%i",selectno);
MessageBox(TestString,"info",MB_OK|MB_ICONINFORMATION);
MyListBox->GetText(selectno, m_selectString);
MessageBox((const char*) selectString, "info",
}
Now in you can access m_selectString variable of the CApp2Dialog class to get the
selected string after DoModal function.
Wolfgang Loch -- Wolfgang.Loch@RZ.TU-Ilmenau.DE
Tuesday, December 03, 1996
Danie Viljoen wrote:
>
> Environment : VC++1.5 , Win3.1
>
> Hi there, I'm am just a hobbiest, but I really need your help?
>
> After struggeling to get data into a Listbox, in a Dialogbox, I
> cannot get the selected item out of it
>
> PLEASE HELP
>
> My code follows
>
> void CMainWnd::CMEdit()
> {
> CString Data;
>
>
> FNameList.RemoveAll();
> //make list to display in listbox
> for(int tel=1; tel <= counter; tel++){
> Data=MainData[tel].FSurname;
> Data+=", ";
> Data+=MainData[tel].FName;
> FNameList.AddTail(Data);
> }
>
> CApp2Dialog Dlg(this);
> Dlg.DNameList=&FNameList;
> if (Dlg.DoModal()==IDOK)
> {
> CString selectString;
>
> // for debugging
> char TestString[10];
>
> CListBox* MyListBox = (CListBox*)(GetDlgItem(IDC_LIST1));
> int selectno=MyListBox->GetCurSel();
>
> // for debugging, to see the index of selected item, I
> //always get a 0 back and I dont no way???
> sprintf(TestString,"%i",selectno);
> MessageBox(TestString,"info",MB_OK|MB_ICONINFORMATION);
>
> // Another problem, even when I change the selectno to a
> //constant, for example 2 I still gets a empty string back???
> MyListBox->GetText(selectno, selectString);
> MessageBox((const char*) selectString, "info", MB_OK|MB_ICONINFORMATION);
> }
> }
>
> PLEASE HELP ME ?
>
> Danie
You should ask for the selected item before the dialog has been closed,
since after DoModal has returned, the dialog and the listbox are already
destroyed.
Override CApp2Dialog.OnOk() and store the item in a CString member of
the CApp2Dialog.
Wolfgang
--
/-------------------------------------------------\
| Wolgang Loch (Technical University of Ilmenau) |
| e-mail: Wolfgang.Loch@rz.TU-Ilmenenau.DE |
| www : http://www.rz.tu-ilmenau.de/~wolo |
\-------------------------------------------------/
Michael Boyken -- mboyken@pens.com
Tuesday, December 03, 1996
Danie,
There is a sample of a DDX routine on Compuserve (in the MFC section)
that provides a means of transferring a CStringList into and out of a
dialog box. It was intended for multiple selection list boxes but the
concept is the same for single selection.
Mike Boyken
mboyken@pens.com
>----------
>From: Luke Stephens[SMTP:luker@tfs.net]
>Sent: Saturday, November 30, 1996 10:42 PM
>To: mfc-l@netcom.com
>Subject: Re: ListBox Select
>
>After the DoModal() ends, the dialog is dead and the controls on the dialog
>are also dead. You must retrieve values from within the dialog class.
>
>Luke Stephens
>luker@tfs.net
>
>----------
>> From: Danie Viljoen
>> To: mfc-l@netcom.com
>> Subject: ListBox Select
>> Date: Wednesday, November 27, 1996 1:37 AM
>>
>> Environment : VC++1.5 , Win3.1
>>
>> Hi there, I'm am just a hobbiest, but I really need your help?
>>
>> After struggeling to get data into a Listbox, in a Dialogbox, I
>> cannot get the selected item out of it
>>
>> PLEASE HELP
>>
>> My code follows
>>
>> void CMainWnd::CMEdit()
>> {
>> CString Data;
>>
>>
>> FNameList.RemoveAll();
>> //make list to display in listbox
>> for(int tel=1; tel <= counter; tel++){
>> Data=MainData[tel].FSurname;
>> Data+=", ";
>> Data+=MainData[tel].FName;
>> FNameList.AddTail(Data);
>> }
>>
>> CApp2Dialog Dlg(this);
>> Dlg.DNameList=&FNameList;
>> if (Dlg.DoModal()==IDOK)
>> {
>> CString selectString;
>>
>> // for debugging
>> char TestString[10];
>>
>> CListBox* MyListBox = (CListBox*)(GetDlgItem(IDC_LIST1));
>> int selectno=MyListBox->GetCurSel();
>>
>> // for debugging, to see the index of selected item, I
>> //always get a 0 back and I dont no way???
>> sprintf(TestString,"%i",selectno);
>> MessageBox(TestString,"info",MB_OK|MB_ICONINFORMATION);
>>
>> // Another problem, even when I change the selectno to a
>> //constant, for example 2 I still gets a empty string back???
>> MyListBox->GetText(selectno, selectString);
>> MessageBox((const char*) selectString, "info",
>MB_OK|MB_ICONINFORMATION);
>> }
>> }
>>
>> PLEASE HELP ME ?
>>
>> Danie
>
| Вернуться в корень Архива
|