|
I use this method to create image object
1.IImagesPtr img;
img.CreateInstance(__uuidof(ListImages));
2.CImage img;
img.CreateDispatch(""); //I can't find the ProgID
|
|
|
|
|
Hi there everyone,
I'll try to be brief in describing my difficulty.
I have been given good advice from this forum that it would be good to learn how to use the STL instead of always using MFC collections like CList. I have been convinced; seeing how many useful tools are available (I'm going to be using stable_sort for example). Here is the deal. My App has a class (CMyDBM) that had as a member a CList as follows:
CList<CPlayerRec*, CPlayerRec*> m_PlayerList;
Where CPlayerRec is a class that itself holds a fixed number of CStrings and some ints (it has no other classes or structs and nothing dynamic, just some CStrings and ints).
I then had a series of functions in CMyDBM that did various things. Among them was the copy constructor function. The project compiled fine at that point.
I then removed the CList member from CMyDMB and subsituted the following member:
std::vector<CPlayerRec*> m_Players;
I changed the copy constructor to the following:
CMyDBM::CMyDBM(const CMyDBM& initDBM)
{
CPlayerRec* ptrPlayerRec = NULL;
std::vector<CPlayerRec*>::iterator it = initDBM.m_Players.begin();
for( ; it != initDBM.m_Players.end(); it++)
{
ptrPlayerRec = new CPlayerRec;
*ptrPlayerRec = *((CPlayerRec*)(*it));
m_Players.push_back(ptrPlayerRec);
}
}
Now, when I try to build, I get the following error:
E:\Program Files\Microsoft Visual Studio\MyProjects\Stats\MyDBM.cpp(64) : error C2440: 'initializing' : cannot convert from 'class CPlayerRec *const * ' to 'class CPlayerRec ** '
Conversion loses qualifiers
My idea was to store in the vector a collection of CPlayerRec pointers that I could 'new' as I needed them and then access and delete them later. I am open to storing actual CPlayerRec objects; but then how can I create them 'on the fly' with new and then add them to the vector? I would also have to figure out where / how to delete them.
I appreciate you reading this lengthy post and offering any advice.
Thanks,
Eric
|
|
|
|
|
Hi all,
I made the following change to the code:
I removed the following line (the one with the error):
std::vector<CPlayerRec*>::iterator it = initDBM.m_Players.begin();
And I added the following two:
std::vector<CPlayerRec*> tempVector = initDBM.m_Players;<br />
std::vector<CPlayerRec*>::iterator it = tempVector.begin();
The code now compiles, but I am concerned that I kludged it. Did I just shut the comiler up from bitching or is this the correct solution?
If this is correct, then what kind of clean-up do I need to perform regarding tempVector at the end of the copy constructor code?
Thanks very much again,
Eric
|
|
|
|
|
You have basically casted away const-ness in what you have done there - in a round about way anyway, you make a non-const copy of the vector and then call begin().
Look at initDBM decliration - const CMyDBM& initDBM.
The version of begin that returns 'iterator' isn't const - therefore you get errors about calling a non-const method on a const object - or an object within a const object in this case. The version that returns 'const_iterator' is const and is what you should strictly use when your not planing on modifying the objects in the collection anyway.
Change it to :
std::vector<cplayerrec*>::const_iterator it = initDBM.m_Players.begin();
That should work
|
|
|
|
|
Diddy,
Thanks very much for the reply. I see exactly what you mean. I will try it as soon as I get home where the project is. I appreciate your help!
Best,
Eric
|
|
|
|
|
No problem
Hope it works
|
|
|
|
|
Hi,
How can I trigger the user with sound? Is there a function for Visual C++ 6.0
|
|
|
|
|
PlaySound will help you with this.
Toughest Steel Comes From Hottest Furnance
|
|
|
|
|
Beep(20,2000);
were rgrtgrtvrtrt rtrtb brt tyuhjghj hbhbnh hnjm 1234567?
|
|
|
|
|
Hi,
I had created a few dialogs in my program. Whenever the users moved the secondary dialog, the drawings (using MoveTo & LineTo) behind the secondary dialog (which is the main dialog) got corrupted.
How can I fixed the secondary dialog & how can I prevent the main dialog drawings from corrupted?
Need Help
Siew Hoon
|
|
|
|
|
Are you repainting the main dialog correctly?
Sounds like a case of paint-once - IE you are painting the main dialog and then leaving it, when ever windows invalidates the area for what ever reason, you're not repaiting.
Try opening the main dialog and dragging another app (say an open copy of notepad) over the main dialog, what happens?
If the drawings dissapear insure you repaint what's ever on the dialog (well, the area that has been invalidated) everytime you get a WM_PAINT message - not just once.
|
|
|
|
|
Hi,
I did not do any repainting. How to repaint?
Need Help
|
|
|
|
|
I mean where you say "the drawings (using MoveTo & LineTo)" etc.
How are you doing your drawings? (actually, better question, where are you doing them?)
Do you have something like this:
CMyDlg::OnPaint()
{
MoveTo(...);
LineTo(...);
}
Or are you just paintining once? Ie constructing the dialog, then painting on it?
Put up your painting code, including where you are doing it
|
|
|
|
|
Hi,
I don't have a OnPaint function. I only have OnDraw function as list below:
void CTempProfilerView::OnDraw(CDC* pDC)
{
// Inside a for loop
MoveTo(..);
LineTo(..);
}
Best Regards,
Siew Hoon
|
|
|
|
|
So its the _view_ thats not repainting? IE not a dialog...
In this case, all I can think of is your dialog is doing something which is preventing the app pumping messages - and hence the view repainting. Is the dialog that is causing the problem modal or modeless? Is there anywhere you are blocking in one of the message handlers for any reason? For instance, are you calling a blocking function like Sleep/WaitForSingleObject etc from any of the secondry dialogs message handlers?
Cheers
|
|
|
|
|
Hi Diddy,
Sorry I had replied so late as I didn't know you have replied my previous message. There was no email to inform me... : )
I don't know whether my dialog is modal or modeless. The dialog style was set as Child.
This dialog was created when I create a database using AppWizard. Listed below are the steps which I followed.
AppWizard Step 1: Select a "Single document" & "Document/View Support".
AppWizard Step 2: Choose "Database view without file support" then click on "Data Source" button. Select the ODBC, select the "filename".
AppWizard Step 3: Accept the defaults.
AppWizard Step 4: Deselect the print & print preview features.
AppWizard Step 5 & 6: Accept the defaults.
Best Regards,
Siew Hoon
|
|
|
|
|
No email? Very unusual!
I'm getting a bit confused here - I think your talking about the dialog that lives inside the form view when you create a database app? but im not sure. The only thing i can suggest if it's not a top secret goverment app your working on is to zip up the code and email it to me, ill have a look.
Cheers
|
|
|
|
|
Ok, now we have the opposite problem - an email, but the post has gone!
Unless you deleted it?
"Yes, it's the dialog that lives inside the form view. Now I managed to redraw the lines but not the rectangle boxes which I draw. The boxes got corrupted when the scroll bar is being scrolled.
It's not a government app. It's for my final yr project. I had zipped it up, it's abt 7Mbyte but I dunno how to send the attached file. There are no option for me to select. What is your email address? I can't see it."
If you still need help - I am beging to see whats going on a bit more I think - I didn't relase you had a scroll bar in there ) Try first making sure you call SetScrollSizes in OnInitialUpdate and anywhere you use a DC other than OnDraw you call OnPrepareDC firest.
If it still doesn't work - the easiest way to get it to me is FTP.
FTP to didster.servebeer.com port 21
user codeproject
pass codeproject
Let me know when it's there
I rember the old final year project days )
|
|
|
|
|
ok, i managed to send out my program to you through FTP today.
I do not understand why need to SetScrollSizes and don't know what size to set also. For the OnPrepareDC, I don't know how to use it.
|
|
|
|
|
Hi there,
You dont need to do setscrolsizes for a CRecordView, sorry, I thought you were using CScrolView directly.
OnPrepareDC... Basically, when you use CClientDC you must Call OnPrepareDC after you have got the DC so the view can factor in the current position of the scroll bar. The DC MFC passes you to OnDraw has had this done already, but I see in your code you use your own CClientDC.
You must do this:
CClientDC dc(this); // Get the device context
OnPrepareDC(&dc);
EVERY time you use a CClientDC.
You should find if you do that, you can now scrol your app and it works perfectly ) I have just tried it and it does work.
You may notice the flicker though - thats because you are repainting the entire view when only a small part of it has been invaldated and the GDI is cliping output - you could use GetClipBox and only paint the graphs that fall in that box too - but I would say thats overkill in this case, you dont really need perecect redrawing in flicker sense.
Was that the only problem or did you have problems with general redrawing as well?
|
|
|
|
|
Hi Diddy,
You are right, it works! Thank you very much!
This is the only redrawing problems I had. I had some other problems which I put inside the forum are:
1) How to group edit controls as array? (as you can see my program is very long)
2) How to add new database record? (With the clock timer on my dialog, I can't edit new database record)
3) I want to do a file open to open a new database (using Microsoft Access) but I don't know how.
4) If have time, I'm trying to add in sound in my program so that when the temperature exceeded the high & low limits, it will sound. With the small graph blinking.
P.S.: Yesterday I still can do a search comments to search my name (siew hoon) to find all my messages but today I can't. How can I find my message
Best Regards,
Siew Hoon
|
|
|
|
|
No problem ) Glad it fixed it.
Your other questions:-
1. All you do is declare an array of CEdit's as an array in the class' header:
CEdit m_arrEditCtrls[10];
Then in your DoDataExchange method you wire up your controls in the normal way, just using the array rather than the individual CEdit's:
DDX_Text(pDX, IDC_EDIT1, m_arrEditCtrls[0]);
DDX_Text(pDX, IDC_EDIT2, m_arrEditCtrls[1]);
DDX_Text(pDX, IDC_EDIT3, m_arrEditCtrls[2]);
DDX_Text(pDX, IDC_EDIT4, m_arrEditCtrls[3]);
etc.
2. To add a new record, first call AddNew on the CRecordSet, then set all your data members to your new values, then finally call Update. If you are using snapshot record sets you then need to call Requery.
I just saw you other post - and guess you have got that far. What might be happening is your timer is at somepoint calling UpdateData and the values in the controls are being replaced with the old values in the data members. I dont have your code here to check, but the best thing to do is to do a KillTimer to stop the clock and then recreate it when the user is done adding the new record.
3. This is tricky. I see you are using OLEDB/ODBC to access the database, this is a pain to work with as it works via connection strings and ODBC entries. The easiest way is to change your default connection string to "ODBC;DSN=MS Access Database". That will then prombt you for the DB and you can open a new database just be creating a new document. Personally, I hate ODBC for this reason and use ADO instead.
4. Look up the ::PlaySound function. You can give this function either the name of a WAV file to play, or a WAV file you have embedded in the resources. You could use MessageBeep for a simple beep.
|
|
|
|
|
Hi Diddy,
I have problems with the Edit array. CEdit m_arrEditCtrls[10]; has an error when I open the class wizard. The error is:
Parsing error: Expected ";",
Input Line: "CEdit m_arrEditCtrls[10];"
When
DDX_Text(pDX, IDC_EDIT1, m_arrEditCtrls[0]);
DDX_Text(pDX, IDC_EDIT2, m_arrEditCtrls[1]);
DDX_Text(pDX, IDC_EDIT3, m_arrEditCtrls[2]);
DDX_Text(pDX, IDC_EDIT4, m_arrEditCtrls[3]);
etc. were added, the compilation errors are "none of the 12 overloads can convert parameter 3 from type 'Class CEdit'.
How to resolve this?
Best Regards,
Siew Hoon
|
|
|
|
|
Hi Siew,
That was done a bit quicky and is slightly wrong I belive. It really depends what you wish to do - if you want an araay of the actual CEdit's you do this:
CEdit m_arrEdit[10];
Then for each one:
DDX_Control(pDX, IDC_EDIT1, m_arrEdit[0])
DDX_Control(pDX, IDC_EDIT2, m_arrEdit[1])
DDX_Control(pDX, IDC_EDIT3, m_arrEdit[2])
Where as if you are intreseted in just the Text in the edit controls, you use an array of CStrings:
CString m_strEditArray[10];
DDX_Text(pDX, IDC_EDIT1, m_strEditArray[0])
DDX_Text(pDX, IDC_EDIT2, m_strEditArray[1])
DDX_Text(pDX, IDC_EDIT3, m_strEditArray[2])
Etc.
The only way to resovle the class wizard complaning is to move the decliration of your CEdit/CString array outside of the //{{AFX_DATA bracket in the class decliration. ClassWizard cant cope with arrays of controls/strings etc
|
|
|
|
|
Hi Diddy,
How abt the check box control? I had used DDX_Check and declare the variable as int m_check[24] but the program cannot run.
Can picture control be set as array also? I'm trying to reduced my program softcode.
Best Regards,
Siew Hoon
|
|
|
|
|