|
You cannot call non-static member functions inside a static function. The reason is simple: static function don't 'belong' to a particular instance of the class (they don't receive the this parameter), thus, you can only access members (functions and variables) that doesn't belong to a particular instance also (so only static members).
The solution to remove the static but I don't think this will solve the problem. In general, there is a way to explicitely pass the this parameter so that the function can use this parameter and call a public function from that particular instance.
|
|
|
|
|
Inside your static function you should know the HWND value of your dialog. In this case you can try:
EnableWindow(GetDlgItem(hDlg, IDC_Button_Search), FALSE);
I hope this helps.
|
|
|
|
|
EnableWindow(GetDlgItem(hDlg, IDC_Button_Search), FALSE); again throws the same error..
Any other clues please!
Thanks
Raji
|
|
|
|
|
RajiRaghu wrote:
[...] again throws the same error..
Any other clues please!
What error is thrown in both cases? I think you should give us more details.
|
|
|
|
|
error C2660: 'CWnd::EnableWindow' : function does not take 2 arguments
error C2352: 'CWnd::GetDlgItem' : illegal call of non-static member function
Thanks
Raji
|
|
|
|
|
It seems your static function is a member of a window class. In this case try to use ":: ":
::EnableWindow(::GetDlgItem(hDlg, IDC_Button_Search), FALSE);
|
|
|
|
|
RajiRaghu wrote: How to call "GetDlgItem(IDC_Button_Search)->EnableWindow(FALSE);" inside a static method?
you need the pointer to that window before proceeding i.e.
wndPointer->GetDlgItem(IDC_Button_Search)->EnableWindow(FALSE);
where wndPointer is pointer to that dialog window!
"Opinions are neither right nor wrong. I cannot change your opinion. I can, however, change what influences your opinion." - David Crow
cheers,
Alok Gupta
VC Forum Q&A :- I/ IV
Support CRY- Child Relief and You
|
|
|
|
|
Since you know the ID of the control, you do not need to use MFC's version of GetDlgItem(...) . Something like:
HWND hWnd = ::GetDlgItem( hWndDlg, IDC_Button_Search );
if( hWnd )
{
::EnableWindow( hWnd, FALSE );
} Should work just fine. Never be afraid to go old-school instead of jumping through so many hoops just to use MFC's version of something.
Peace!
-=- James If you think it costs a lot to do it right, just wait until you find out how much it costs to do it wrong! Avoid driving a vehicle taller than you and remember that Professional Driver on Closed Course does not mean your Dumb Ass on a Public Road! DeleteFXPFiles & CheckFavorites (Please rate this post!)
|
|
|
|
|
You can use GetDlgItem for get hwnd from your controls if you know ID form control
CWnd *pWnd=GetDlgItem(IDC_CONTROL) and HWND m_hwnd=::GetDlgItem(hWnd,IDC_CONTROL)
|
|
|
|
|
Hello,
Suppose the following code:
<br />
char * f(void)<br />
{<br />
return "Hello";<br />
}<br />
<br />
char *s = f();<br />
is this code safe? in other words, does s always point to the string "Hello"?
what about these ones?
<br />
char *s = "All ";<br />
strcat(s, f());<br />
<br />
CString s = f();<br />
my aim is to know how these codes are translated to assembly language.
|
|
|
|
|
Ali Tavakol wrote: is this code safe?
Nope. You are returning the address of a temporary string. Thus, the memory is not protected anymore. Sure, the pointers still 'points' at a the same address but the contents are not protected anymore, thus they can be overwritten.
|
|
|
|
|
Ali Tavakol wrote: is this code safe?
nope. your f() function returns a pointer to a local variable, so, outside the function, the caller could get anything, like an invalid pointer.
Ali Tavakol wrote: strcpy(f(), "All");
what ??? you're trying to write "All" into a function ??
|
|
|
|
|
toxcct wrote: what ??? you're trying to write "All" into a function ??
No, he tries to write "All" in the pointer that is returned by the function. If he removed the (), then he would try to write something at the address of the function.
|
|
|
|
|
i understand what the code did, but i'm not sure he knew what his code was doing. moreover, he changed his post...
|
|
|
|
|
Ali Tavakol wrote: char * f(void)
{
return "Hello";
}
//in main
char *s = f();
This is safe as you are returning a string literal, but it is preferable that you change the function to say const char* f(void).
Ali Tavakol wrote: strcpy(f(), "All");
This is not, you are not supposed to modify a string literal.
Ali Tavakol wrote: CString s = f();
This is safe.
|
|
|
|
|
I am interested in your reply.
I have modified my post.
please explain how you say it?
|
|
|
|
|
Exactly what would you like to be explained?
edit: noticed the modification
Ali Tavakol wrote: char *s = "All ";
strcat(s, f());
It's best to have a habit of putting const. const char *s = "All ";
Again, this is not safe as you are not supposed to modify a string literal which is pointed to by s.
-- modified at 4:29 Thursday 10th August, 2006
|
|
|
|
|
hfry wrote: This is safe
I don't think we have the same notion of safety .
Sorry, but it is not safe: sure, the pointer still 'points' at the same address but the contents of the strings are not protected anymore (we are out of the scope of the function in which the string was local). You save this address in another pointer but that doesn't change the fact that the memory is still unprotected.
So, later in your program you may find garbage characters in your string and you don't know way. It is like using a string allocated with new after having deleted it.
|
|
|
|
|
String literals are statically allocated, ie. memory is allocated for them when the application is loaded. The string is valid throughout the lifetime of the application. This would of course be different if he was allocating a string on the stack.
|
|
|
|
|
Mmmh... true. After searching a little bit on the net, I found that also. So you are right, this is perfeclty safe (shame on me ).
I thought that strings litteral where handled the same as normal strings.
|
|
|
|
|
<br />
char * f(void)<br />
{<br />
char *s;<br />
return s;<br />
}<br />
now which codes in the first post are safe?
-- modified at 4:34 Thursday 10th August, 2006
|
|
|
|
|
const char* f(void)
{
const char *s = "Hello";
return s;
}
This is safe but it is best to write it like this, this way the compiler will definately complain if you try to do something wrong.
You just have to remember that a string literal exists for the lifetime of the application, and that you should not modify the string literal.
edit: i noticed you modified your post...
Ali Tavakol wrote: char * f(void)
{
char *s;
//assume that string s is given by the user
return s;
}
Given by the user? Assuming something like this...
char * f(void)
{
char *s;
char buffer[100];
getuserinput(buffer, 100);
s = buffer;
return s;
}
Then no. You are not supposed to return a pointer to a variable allocated on the stack out of a function.
-- modified at 4:37 Thursday 10th August, 2006
|
|
|
|
|
I think
char * f(void)
{
return "Hello";
}
is almost equivalent to
char * f(void)
{
static char t[] = "Hello";
return t;
}
therefore it is safe to return a pointer to this kind of "temporary" string.
|
|
|
|
|
Cedric Moonen wrote: Sorry, but it is not safe: sure, the pointer still 'points' at the same address but the contents of the strings are not protected anymore
Since his function was returning a string literal, it is safe. String literals are stored in static memory, so the pointer he returns will be pointing to a location in memory that will ALWAYS have that string (at least as long as that program is running).
Granted, this is not a desirable way to return such data, but it is both legal and safe.
Cedric Moonen wrote: So, later in your program you may find garbage characters in your string and you don't know way. It is like using a string allocated with new after having deleted it.
That would have been the case if the code he wrote was changed to:
char* f()
{
char buffer[20] = {0};
strcpy(buffer, "Hello");
return buffer;
}
But since he was returning a string literal, it is not the case.
If you decide to become a software engineer, you are signing up to have a 1/2" piece of silicon tell you exactly how stupid you really are for 8 hours a day, 5 days a week
Zac
|
|
|
|
|
Odd - I have no idea why your post was voted down, it was completely correct.
Peace!
-=- James If you think it costs a lot to do it right, just wait until you find out how much it costs to do it wrong! Avoid driving a vehicle taller than you and remember that Professional Driver on Closed Course does not mean your Dumb Ass on a Public Road! DeleteFXPFiles & CheckFavorites (Please rate this post!)
|
|
|
|