|
You are putting a pointer to a CStringArray in your map, which means that it always points to the same instance of CStringArray that you were originally using (it's not a copy). And you do something like this:
psaTest->RemoveAll();
just after adding the pointer to the map. So, your CStringArray will be empty.
By the way, you shouldn't do something like this:
CStringArray* psaRes = new CStringArray;
...
...
m_mapType.Lookup(_T("index"),psaRes);
Because in that case you will have a memory leak. There's no need to make a new CStringArray: if the pointer is found in the map, it will be copied into the psaRes pointer (the address will be copied, not the content of course).
BTW, I suggest you take a look at the STL containers (map, list, ...) they are much easier to use (once you are confortable with the syntax).
|
|
|
|
|
Thank you for advice , much people say to me to use STL , I didn't work with , I try to keep all in MFC way .
|
|
|
|
|
I have an MFC application which uses the WebBrowser2 object to view html files and pdf files.
Application works fine in Windows XP but it crashes in Windows 7 when viewing pdf files. This application is built on Windows XP and distributed to XP/7 machines.
I have no available Windows 7 machines for debug as of this moment so I couldn't get any other useful information about the problem.
Anyone else experience this or can maybe point me to something that could shed some light? Thanks
|
|
|
|
|
Hi all. I try to do something , but maybe it's stupid thing ?
I want to draft a CMap object , with key as CString and as values CStringArray , something like this :
CMap<CString,CString&,CStringArray,CStringArray&> m_mapPack;
but I get :
error C2582: 'CStringArray' : 'operator =' function is unavailable
my question is, can I setup an CStringArray value into CMap object ? And how ?
Thank you .
|
|
|
|
|
Without a copy constructor or assignment operator, I do not think that CStringArray is copyable. You may want to derive your own class from it where you can provide one of the aforementioned constructs.
As an alternative, consider an STL solution. Something like:
typedef vector<string> myVector;
typedef map<string, myVector> myMap;
"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
"Some people are making such thorough preparation for rainy days that they aren't enjoying today's sunshine." - William Feather
|
|
|
|
|
Thank you for the solution ... if I can , I avoid STL , I try to keep all in MFC way ... hmm ... I write something like that :
CMap<CString,LPCTSTR,CStringArray*,CStringArray*> m_mapType;
it's compile , I'm working with ...
modified on Monday, May 23, 2011 3:25 PM
|
|
|
|
|
The problem with that is that when you add a new element to the map, only a pointer will be copied, not the contents of the array. So you need to keep track of these pointers and make sure they'll be deleted later.
The STL construct suggested above doesn't suffer from these problems, they'd do the copying for you.
I can think of no reason at all why anyone would want to use MFC when there is an easy to use alternative. Much of the MFC library is ancient and in a very bad shape. My personal experience is that, while you don't run into problems often, when you do it can take days to resolve the cause. I know for a fact that back in the time when I still used MFC I've lost weeks of valuable time just due to sloppy programming inside MFC. I've never had any such problems with STL.
|
|
|
|
|
2 threads call same global function at almost same time, the global function looks like
void MyFunction(int iWho)
{
CString cs;
cs.Format("%d",iWho);
edit.SetWindowText(cs);
edit.RedrawWindow();
Sleep(3000);
edit.SetWindowText(cs);
edit.RedrawWindow();
Sleep(3000);
edit.SetWindowText(cs);
edit.RedrawWindow();
Sleep(3000);
}
2 threads pass param 0 and 1 respectively to the function.
I hope that I can see 2 treads call the function in turn.
In other words, '0' and '1' are displayed in turn in some way.
But, at test, '1' appears only when all of 3 '0' are displayed.
Any suggestion for the "in turn" thread test?
.
|
|
|
|
|
Why would you think manipulating a UI control (i.e., edit box) from a secondary thread would be a good idea?
"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
"Some people are making such thorough preparation for rainy days that they aren't enjoying today's sunshine." - William Feather
|
|
|
|
|
You cannot force such a behaviour (expecially on a single core machine ).
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong.
-- Iain Clarke
[My articles]
|
|
|
|
|
Dual or more cores machine as I use now?
|
|
|
|
|
Well even on multiple cores, there's no way for user code to predict thread scheduling sequence.
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong.
-- Iain Clarke
[My articles]
|
|
|
|
|
includeh10 wrote: I hope that I can see 2 treads call the function in turn.
Hope away. In software development, there is no room for hope.
FWIW: the macroscopic behavior of threads (at a rate the human eye can discern) often is quite different from their actual, microscopic behavior. That is due to the specific scheduling algorithms implemented in the operating system; there always are some constants (e.g. "time slice") and, at least with Windows, there even is some cheating as far as thread priorities go.
Luc Pattyn [Forum Guidelines] [My Articles] Nil Volentibus Arduum
Please use <PRE> tags for code snippets, they preserve indentation, improve readability, and make me actually look at the code.
|
|
|
|
|
this kind replies should be thrown into rubbish bin.
|
|
|
|
|
You shouldn't throw away knowledge. Instead you should accept reality as it is.
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong.
-- Iain Clarke
[My articles]
|
|
|
|
|
Don't ask questions if you don't want to have answers.
Watched code never compiles.
|
|
|
|
|
The point of multithreading is to work in parallel on objectives that are not dependent on each other, and therefore don't care about order of execution.
If you do care about order of execution, use a single thread.
If you try to let your threads do only some things in a particular order, then you need synchronisation objects, such as a mutex or semaphore.
|
|
|
|
|
how to use the CFileDialog box to open the folder.....
i had done to open the .file extension which successfully opening but i am not able to open the folder plz help out this .....
|
|
|
|
|
sarfaraznawaz wrote: how to use the CFileDialog box to open the folder.....
Why not use SHBrowseForFolder() instead?
"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
"Some people are making such thorough preparation for rainy days that they aren't enjoying today's sunshine." - William Feather
|
|
|
|
|
CFileDialog automatically opens folders as they are selected by the user navigating a directory tree. Perhaps you could clarify your question.
The best things in life are not things.
|
|
|
|
|
i tried but not able to open or select the particular folder .....
here my code forit
void CfolderlockUIDlg::OnBnClickedAdd()
{
TCHAR szFilters[] = _T (" Allfolders(* *)¦* *¦¦");
CFileDialog dlg (TRUE, _T ("folder "), _T ("folders "),OFN_FILEMUSTEXIST |OFN_HIDEREADONLY | OFN_ALLOWMULTISELECT, szFilters,this);
//CFileDialog dlg(TRUE,NULL,NULL,OFN_ALLOWMULTISELECT ,NULL,NULL,0);
if (dlg.DoModal () == IDOK)
{
filepath = dlg.GetPathName();
m_edit.SetWindowText(filepath);
}
}
by this it shows all the folder but i cant select the or open the folder
|
|
|
|
|
Do you want to select the folder or the the file inside the folder? if its the folder then you can use the function that was mentioned by David
here is an example for that
BROWSEINFO bi;
ZeroMemory(&bi, sizeof(bi));
TCHAR szDisplayName[MAX_PATH];
szDisplayName[0] = '';
bi.hwndOwner = NULL;
bi.pidlRoot = NULL;
bi.pszDisplayName = szDisplayName;
bi.lpszTitle = _T("Please select a folder for storing received files :");
bi.ulFlags = BIF_RETURNONLYFSDIRS;
bi.lParam = NULL;
bi.iImage = 0;
LPITEMIDLIST pidl = SHBrowseForFolder(&bi);
TCHAR szPathName[MAX_PATH];
if (NULL != pidl)
{
BOOL bRet = SHGetPathFromIDList(pidl,szPathName);
if(FALSE == bRet)
return;
AfxMessageBox(szPathName);
}
and if you are selecting a file then you can see this example
SelectDialog - A Multiple File and Folder Select Dialog[^]
|
|
|
|
|
thanks its working.....
but one thing that its necessary to make browseinfo as zero memory ......
|
|
|
|
|
CString str;
str.Format(_T("All Files (*.dat)|*.dat||"));// change name .dat to any extension you want
CFileDialog file_dlg(TRUE,NULL,NULL,OFN_OVERWRITEPROMPT,str);
INT_PTR iRet = file_dlg.DoModal();
|
|
|
|
|