|
I guess it is too late now since your other post(s) tell me you did with the "1 layerer + 1 normal window" solution but yepp, i would have recommended that also. Your app looks nice, btw...
> The problem with computers is that they do what you tell them to do and not what you want them to do. <
> Sometimes you just have to hate coding to do it well. <
|
|
|
|
|
C is a terrible language, it has no class, it has no object in life, and it can't inherit anything. But it got nothing to hide.
|
|
|
|
|
Nah, C is good. Is the only language enforcing free dom.
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]
|
|
|
|
|
Hi,
I want to write a small mfc dialog based program to test the functionality which the third-party library provides.
The flow of test program is simple. I made some buttons on the program.
When I pressed button A, then execute the action A. Pressed button B, then execute the action B...etc.
According to the library document, each action usually contains 3~5 steps.
Each step must call some functions which are provided by the library.
The document said some functions will use PostThreadMessage() to send some specific library-defined message within a specific time.
If the program doesn't receive library-defined message within a specific time, regard it as timeout.
And the frequency of this type function is often, not a little.
But now I don't know how to do this timeout functionality properly.
For now, I used a for loop and difftime() to check the time period repeatedly and didn't create any new thread in my program.
In the for loop, I use GetMessage(&MSG, 0, 0, 0) to receive the message which library function sent.
Although the library function can't work (because the library relies on a specific machine, and the machine doesn't connect to my pc),
I think that it's enough to test the timeout functionality.
But the test result seemed that it didn't work correctly. I use a MessageBox() which is outside the for loop.
And the message box always was showed later than the time I set.
Another problem is if I pressed the button to start the timeout functionality then press the OK or CANCEL button earlier than the timeout
message box, the program will disappear but still resides in the task manager...
(Even if I add OnDestroy() to call DestroyWindow(), the result is same)
So I thought the method which I use now is correct or not. But even it is the incorrect method, I don't know what the proper method is...
So does anyone can give me some suggestions, helpful references, related samples or why my program failed ?
Thank you very much.
|
|
|
|
|
oppstp wrote: The document said some functions will use PostThreadMessage() to send some specific library-defined message within a specific time.
If the program doesn't receive library-defined message within a specific time, regard it as timeout.
And the frequency of this type function is often, not a little.
But now I don't know how to do this timeout functionality properly.
What's to do other than respond to the messages that the library is sending? If the messages are being posted (rather than sent), you do not even have to respond to them in a timely manner.
"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
"Man who follows car will be exhausted." - Confucius
|
|
|
|
|
DavidCrow wrote: What's to do other than respond to the messages that the library is sending? If the messages are being posted (rather than sent), you do not even have to respond to them in a timely manner.
Thanks for the reply.
I think that the library is used for customers.
So it has the timeout functionality to prevent from the wait of customers.
If I don't receive the the library-defined message(might be network error or other reasons).
I will show the related message to the customers, not waiting for the response infinitely.
That's why I think the docoument asked the developers to do timeout functionality.
|
|
|
|
|
Hi All,
I want to display a large bitmap inside a picture control.I want the picture control to display the vertical and horizontal scroll bars automatically when the image size is larger than the picture control.How do i achieve this.Please help.
Thanking all in advance,
Ashwath.
|
|
|
|
|
I have just begun using C++ and cannot seem to figure out an effective way to accept thousand separators (Only commas) in a simple program.
Basically, I need to be able to validate whether a number (given by the string argv[1]) is correctly formatted or not, before I remove all commas and convert it to double/float.
Valid Input: +1,234.5E-1,234.5 (even +a,bcd.eE-a,bcd.e for now) >> Output: +1234.5E-12345.5 (+abcd.eE-abcd.e)
Invalid Input: 1,0 >> Output: X
Any help regarding this issue would be greatly appreciated.
|
|
|
|
|
why dont you look at regular expressions ? - they allow you to 'describe' what input should look like and then perform match tests for example
The other issue you might have, is, if you are writing for an international audience, the thousands separator is different depending on there you are :-
Aus : 1,234.00
France : 1.234,00
just two examples ...
ps .. as a start for your regular expression, consider
([0-9\-\+\.].)
the [] denote the start of a 'character 'set' - there some predefined ones like :digit:, :alpha: , in this case Im saying match any character from 0 to 9, ie 0 1 2 3 4 5 6 7 8 9 .. -, +, . usually have a meaning in a regular expression (regex) to that need to be 'escaped' to say treat them as is.. the last '.', ie right before the right bracket ')' , is not escaped, which means '1 or more repetitions (iirc) else what that would match would be a single digit number .. the () denote a 'match sub/group' - so if I had an array of matches returned by a regex, match[0] would be the entire matched expression, match[1] would be the first bracketed set etc
anyway, Im waffling - do a google on regular expressions, play with them in the language of your choice - they are well worthwhile spending time on
'g'
|
|
|
|
|
Are you taking internationalization into consideration? I mean, ten thousand is still ten thousand whether you write it as 10000 or 10,000 or 10 000.
Can you not just remove the commas and then convert using something like _gcvt() ?
"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
"Man who follows car will be exhausted." - Confucius
|
|
|
|
|
me again - see this for a starter
http://onlamp.com/onlamp/2006/04/06/boostregex.html[^]
unfortunately a smaller regex library John Maddock had on is home pages seems to have gone (it was an ourworld.compuserve account, so you'll have to download and build boost, which is where the library has gone anyway - well worth it even if you just build the regex library)
'g'
|
|
|
|
|
Just parse it; the code isn't at all difficult.
One of the lessons of programming is that simple brute force code is quite common and very effective. Don't think fancy, just think simple.
|
|
|
|
|
Thank you for all of your help. But I need to be able to perform the code without any additional downloads (such as the <regex boost.htp=""> library). Parsing it sounds like a good option at the moment. Also, I only have to deal with comma thousand separators, but I need to be able to tell whether they are valid or not (1,000,000 = Valid, 1000,000 = Invalid)
|
|
|
|
|
awesometrickycool wrote: ...I need to be able to tell whether they are valid or not (1,000,000 = Valid, 1000,000 = Invalid)
Why is that invalid? It's still one million.
"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
"Man who follows car will be exhausted." - Confucius
|
|
|
|
|
Yes, but if i were to remove all commas, then ,,,1,0,,000,00 would also be valid. So I just want to remove the valid commas (Eg. 1,000,000 = 1000000 (valid). 1,000,00,0 = 100000,0 (invalid). Sorry if this is a bit confusing.
|
|
|
|
|
awesometrickycool wrote: Sorry if this is a bit confusing.
Not confusing, but trying to account for every possible combination of digit separator (not all countries use a comma) is not a trivial task. A regular expression could be used after the fact to verify what was entered. A masked edit control could be used during the time of input.
"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
"Man who follows car will be exhausted." - Confucius
|
|
|
|
|
Parse the string, counting digits. If you get to more than three before the first comma (or period), error. If you don't get exactly three before the next comma or period, error. And so forth.
|
|
|
|
|
But how would this work for a complex variable such as +1,234.5E-1,234.5? And what is the command for parse (How do I begin to write such a code)?
|
|
|
|
|
You'd have to pull out the two numbers from both sides of the E to see if they are valid.
"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
"Man who follows car will be exhausted." - Confucius
|
|
|
|
|
Starting point off top of my head:
(I emphasize STARTING. I wrote this in less than ten minutes, it probably doesn't compile or even work, but is similar to code I've written. There are a myriad of ways to do this. For error reporting, you could use an index instead of incrementing the string [i.e. pStr[offset] ]
The main point is that it's just plain code, nothing fancy. No tricks. And will be very fast.)
inline
bool IsNumber(TCHAR ch)
{ return ch >= '0' && ch <= '9'; }
bool ParseVal(LPCTSTR& pStr, float& val)
{
val = 0.0f;
bool isNegative = false;
if (*pStr == '+')
{
pStr++;
}
else if (*pStr == '-')
{
pStr++;
isNegative = true;
}
if (!IsNumber(*pStr))
return false;
bool firstSegment = true;
int count = 0;
while (*pStr)
{
TCHAR ch = *pStr++;
if (ch == 'E' || ch == ' ')
{
break;
}
else if (ch == ',' || ch == '.')
{
if (firstSegment)
{
firstSegment = false;
if (count > 3)
return false;
}
else
{
if (count != 3)
return false;
}
count == 0;
}
else if (IsNumber(ch))
{
if (++count > 3)
return false;
}
else
{
return false;
}
}
return true;
}
|
|
|
|
|
Thanks for your reply. I ended up creating the following code: (However, it cannot deal with commas in the exponential)
#include <cstdlib>
#include <iostream>
#include <string>
using namespace std;
int main(int argc, char *argv[])
{
string str(argv[1]);
int count = 0;
int i = 0;
if((str[0] == '-')||(str[0] == '+'))
{
count = -1;
}
bool firstSegment = true;
while((count < 4)&&(i < str.size()))
{
if((str[i] == 'E' )||(str[i] == 'e')||(str[i] == '.'))
{
if((count == 3)||(firstSegment == true))
{
i = (str.size() - 1);
}
else if(firstSegment == false)
{
cout << "X" << endl;
count = 3;
i = (str.size() - 1);
}
}
else if(str[i] == ',')
{
if(firstSegment == true)
{
firstSegment = false;
if((count > 3)||(count == 0))
{
count = 4;
}
else
{
str.erase(i,1);
count = 0;
i--;
}
}
else
{
if(count != 3)
{
count = 4;
}
else
{
str.erase(i,1);
count = 0;
i--;
}
}
}
else
{
count++;
}
i++;
}
if((count!=3)&&(firstSegment == false))
{
cout << "Y" << endl;
}
cout << str << endl;
return 0;
}
What would be the best way to handle exponential commas? And is there any easier (smaller) way to handle the above code? (I had a small look into locales but cannot seem to get them to work).
|
|
|
|
|
#include <cstdlib>
#include <iostream>
#include <string>
using namespace std;
int main(int argc, char *argv[])
{
string str(argv[1]);
int count = 0;
int i = 0;
if((str[0] == '-')||(str[0] == '+'))
{
count = -1;
}
bool firstSegment = true;
while((count < 4)&&(i < str.size()))
{
if((str[i] == 'E' )||(str[i] == 'e')||(str[i] == '.'))
{
if((count == 3)||(firstSegment == true))
{
i = (str.size() - 1);
}
else if(firstSegment == false)
{
cout << "X" << endl;
count = 3;
i = (str.size() - 1);
}
}
else if(str[i] == ',')
{
if(firstSegment == true)
{
firstSegment = false;
if((count > 3)||(count == 0))
{
count = 4;
}
else
{
str.erase(i,1);
count = 0;
i--;
}
}
else
{
if(count != 3)
{
count = 4;
}
else
{
str.erase(i,1);
count = 0;
i--;
}
}
}
else
{
count++;
}
i++;
}
if((count!=3)&&(firstSegment == false))
{
cout << "Y" << endl;
}
cout << str << endl;
return 0;
}
That might be a bit easier to read...
|
|
|
|
|
Just scanned over the code. With some work, you could probably get the entire algorithm smaller, but the size would be negligible (and since you've bloated it up using string and cout, why bother ) Joking aside, this will result in fairly small, fast assembly.
For the exponential commas, write another function! If you find a way to combine them, that's great, but not worth worrying about.
(A big mistake a lot of programmer's make is thinking there is an all-in-one algorithm to solutions. The irony is that multiple, simple, algorithms are usually faster, easier to debug and may ultimately even be smaller. At the very least, writing things first as multiple, simple algorithms may help you see how to make a more complex algorithm that does more.)
|
|
|
|
|
How do locales work? And can they be used for the type of output I'm looking for? Just wondering...
|
|
|
|
|
Don't know how in plain C/C++, I program only in Win32.
For Win32 the function is GetLocaleInfo().
To get the thousand's and decimal separators. Call:
GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_STHOUSAND, separator, 2)
GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SDECIMAL, separator, 2)
The full list of constants is at:
http://msdn.microsoft.com/en-us/library/dd464799%28v=VS.85%29.aspx[^]
To speed things up, just make each call once at beginning of function.
|
|
|
|
|