|
I know what you want to do. I just think that instead of blocking File/New and File/Open you should close current document and load/create new one. This will result in at most one document open in any given moment.
Tomasz Sowinski -- http://www.shooltz.com
- It's for protection - Protection from what? Zee Germans?
|
|
|
|
|
What you are saying is the right thing to do. You know it and I know it. But what about the next man? It should be possible to totally rule out the option.
There are several reasons, by the way. First, if you have many different views it gets totally messed up if you have several documents. Secondly, my app. will probably break with several documents (probably poor programming, but anyway... ).
So, once again, help in this matter will be greatly appreciated.
Haakon S.
|
|
|
|
|
My solution (close open document before opening/creating new one) gives you exactly what you need: you have MDI app --and-- at most one document is open. Your app will not break; user will be working with exactly one document.
Tomasz Sowinski -- http://www.shooltz.com
- It's for protection - Protection from what? Zee Germans?
|
|
|
|
|
CMDIFrameWnd *pFrame =
(CMDIFrameWnd*)AfxGetApp()->m_pMainWnd;
CMDIChildWnd *pChild = pFrame->MDIGetActive();
|
|
|
|
|
Description:
============
There are a lot of times in a dialog box that one would want to read-in/display a number that has a unit. For instance, this can be achieved by a pair of edit box and static box.
Edit box control containing the value Static Control displaying the unit:
2.378e-3 Meter
User can also choose his favorite unit system in a centralized dialog box. For example, he could specify whether he would rather to have the lengths to be displayed in Meter, Inch, Centimeter, ...
Question:
=========
I thought the best way to accomplish this task is deriving a customized edit box and static controls from MFC's CEdit and CStatic classes and adding the following paramteres to it:
double m_Conversion; // Conversion factor from SI to the user's selected unit.
CString m_UnitName; // The Unit's name, "m", "cm", "mm", ...
This seems to be such a common problem that I thought there might have already been some specialized codes written by other people for this purpose.
I appreciate any input/suggestion/pointers in regards to my question. Please e-mail a copy of your response to "asi@enginia.com".
Thank you.
Ali Asi
asi@enginia.com
Ali Asi
|
|
|
|
|
I am using a system doing exactly what you are asking for.
1. First, you establish a vector of UINT's where the user enters all preferences. For example, length is put in m_UnitVector[2].
2. Secondly, you establish the options in a pairs of const char* and conversion factors:
const char* CUnit::m_Length[]={" [m]"," [ft]"," [mm]"," [in]",NULL};
const float CUnit::m_fLength[]={1.0F,3.280839F,1000.0F,39.37008F};
Here, length is stored in meters as the base unit.
3. In your edit box showing the unit you enter m_unit.m_Length[m_UnitVector[2]], in the box showing the number you show m_fMyLength*m_unit.m_fLength[m_UnitVector[2]]. Of course, when you go the other way with UpdateData(TRUE), you divide instead of multiply.
Hope you can make use of this.
Regards, Haakon S.
|
|
|
|
|
Hi All,
I've got a CFormView derived class, where I am creating controls at runtime and placing them on the form. This seems to work OK, but I am wondering how to get some resource ID's to use with theswe controls at runtime. SHould I just reserve a bunch of them, or is there a way to get them dynamically?
Thanks,
Aaron
|
|
|
|
|
If you won't use these IDs later, then you can assign 0xFFFF to all the dynamically created extra controls (I've done it in the past and it worsks.)
Joaquín M López Muñoz
Telefónica, Investigación y Desarrollo
|
|
|
|
|
Well, the problem is that I have an existing control that the label control is associated with. I create these two controls, a sort of super duper edit control, and its buddy, a static label, dynamically. The edit derived control has a method, something like SetBuddy(int nResourceID) that takes a resource ID to the associated label. For my own use, I have been just saving the window handles to talk to the controls, but the edit control needs a resource. I had been just setting them to 0, without any trouble.
|
|
|
|
|
Ok, I posted something about this yesterday, and here is some more info:
The basic problem is that whenever I try to step over an API call (InitDialog(), CoCreateInstance(), etc) I get the same exception being raised:
0XC0000005: Access Violation
This only happens when I'm stepping through code. The exception always seems to be raised at the same assembly instruction:
mov eax,fs:[00000018]
I guess this is something to do with the debugger not coping with external function calls, but I can't figure out what is going on other than that.
If anyone needs more information I'd love to provide it, just ask
I hope someone knows what's going on here...
TIA,
Pete
|
|
|
|
|
Is this stepping over any call such as this, or is this a specific class's InitDialog() and CreateInstance() calls?
-dz
|
|
|
|
|
Seems to be any call like this, not restricted to specific classes, or specific API calls.
|
|
|
|
|
ok.. does it compile and run fine, and only crash when you are debuging?
could you give the top level code where you are actually overriding OnInitDialog and what line it is crashing.. because going that deep into the assembler means nothing to me
p.s. if it compiles and runs fine and is just messed up when you are debugging then im clueless
-dz
|
|
|
|
|
Yeah, it compiles and runs great normally, it just falls over when I try debugging.
It's not specifically overriding functions that causes problems, it's just calling them.
the assembly means nothing to me either, but I thought it might be a good clue for someone
|
|
|
|
|
moredip wrote:
the assembly means nothing to me either, but I thought it might be a good clue for someone
What is the line above the line. fs:[0000018] is the thread environment bock. Puzzling that it crashes there.
|
|
|
|
|
Are you using .dll ? Are you sure these are compatible with debug mode ? When you say it compiles and runs, is it in Debug or Release ?
~RaGE();
|
|
|
|
|
I'm using "MFC as static library". I think they're the standard debug libs, cos they worked fine until about a day ago - and no, I can't think of anything I changed.
It compiles and runs in Debug mode.
|
|
|
|
|
here's the function that fails:
BOOL DProjectLoader::OnInitDialog()
{
CDialog::OnInitDialog();
...
...
here's the call stack:
KERNEL32! 77e83a14()
CThreadSlotData::GetThreadValue(int 1) line 259 + 12 bytes
CThreadLocalObject::GetData(CNoTrackObject * (void)* 0x00564410 CThreadLocal<_AFX_THREAD_STATE>::CreateObject(void)) line 400 + 17 bytes
CThreadLocal<_AFX_THREAD_STATE>::GetData() line 173 + 13 bytes
CThreadLocal<_AFX_THREAD_STATE>::operator _AFX_THREAD_STATE *() line 183 + 15 bytes
AfxGetModuleState() line 235 + 10 bytes
AfxGetResourceHandle() line 22 + 11 bytes
CWnd::ExecuteDlgInit(const char * 0x000000bd) line 3248 + 5 bytes
CDialog::OnInitDialog() line 670 + 15 bytes
DProjectLoader::OnInitDialog() line 71
here's the assembly:
...
...
...
77E839EC pop eax
77E839ED ret
77E839EE or eax,0FFFFFFFFh
77E839F1 ret
77E839F2 mov eax,[7FFE0018]
77E839F7 mov edx,dword ptr ds:[7FFE0014h]
77E839FD cmp eax,dword ptr ds:[7FFE001Ch]
77E83A03 jne 77E839F2
77E83A05 mov ecx,dword ptr [esp+4]
77E83A09 mov dword ptr [ecx],edx
77E83A0B mov dword ptr [ecx+4],eax
77E83A0E ret 4
77E83A11 push ebp
77E83A12 mov ebp,esp
77E83A14 mov <---- eax,fs:[00000018]
77E83A1A mov ecx,dword ptr [ebp+8]
77E83A1D cmp ecx,40h
77E83A20 jae 77EB86EB
77E83A26 and dword ptr [eax+34h],0
77E83A2A mov eax,dword ptr [eax+ecx*4+0E10h]
77E83A31 pop ebp
77E83A32 ret 4
77E83A35 push ebp
...
...
...
|
|
|
|
|
Look like it's a debugger problem. What happens when you run the app and then attach to the debugger. Sometimes, that works.
|
|
|
|
|
um.... how do I attach to a running process
I'm embarrased to admit I've never learnt how to do that with VC++
|
|
|
|
|
1. Launch VC++ without your project open
2. Launch your app from explorer
3. In VC++ Select Build->Start Debug->Attach To Process
4. Open the file and put breakpoints it would work. Remember donot open the project
|
|
|
|
|
Thanks.
Well I can step through fine when I attach, using breakpoints and everything, just like you said. So I take it this has happened to you before?
Any solutions, other than attaching every time I want to debug?
Is this a bug in VC++?
Either way, thanks a lot for your help Rama, it would have taken me a long time to get to this stage on my own.
Thanks again,
Pete
|
|
|
|
|
I am not sure where the bug is in VC++ or some other libraries.
moredip wrote:
Any solutions, other than attaching every time I want to debug?
May be on some other machine it might work. I had worse problem when I was executing the app an oracle query failing but when I was running under debugger everything was fine. So I had to attach it and then debug.
|
|
|
|
|
It's wierd, cos it was working fine (for like 6 months) until the other day, when it just broke. And I can't work out why.
I may try reinstalling VS and see what happens.
|
|
|
|
|
Is it possible to have a base item in a menu have an ID and function associated with it?
ex. File, Edit, View, SayWoop
is it possible to click on SayWoop and have it do something, or do i need to look into putting a CButton into the Menu?
thanks!
-dz
|
|
|
|