|
That's correct, but you can't use C headers in the managed world. As mentioned C++/CLI expects additional keywords.
|
|
|
|
|
ABuenger wrote:
That's correct, but you can't use C headers in the managed world. As mentioned C++/CLI expects additional keywords.
It accepts additional keywords (ref, value etc...) but does not expect them - they are not required. If you don't use them, it specifies standard unmanaged types. I have used header files of structures from VC6 completely unmodified in VS2005 without any issues, including unions, structs and enums.
Of course, there may be specific reasons why your header file doesn't work. Have you tried it?
Ryan "Punctuality is only a virtue for those who aren't smart enough to think of good excuses for being late" John Nichol "Point Of Impact"
|
|
|
|
|
I need to internationalize an application i am developing which UI is currently in english. I thought about putting the strings in a table in a SQL database (Sqlite) and then query the strings at runtime.
Are there better options? I don't like multiple string tables in the resources or a resource DLL. I would like to be able to edit the strings side by side where a sql database is the option in my eyes.
Any pros and cons? Examples?
Thanks Andre
|
|
|
|
|
There are many ways to handle the problem. Your way should work as well as any other. I like to use an ini file for my UI strings as it is an easily editable text file.
"You're obviously a superstar." - Christian Graus about me - 12 Feb '03
"Obviously ??? You're definitely a superstar!!!" - mYkel - 21 Jun '04
"There's not enough blatant self-congratulatory backslapping in the world today..." - HumblePie - 21 Jun '05
Within you lies the power for good - Use it!
|
|
|
|
|
Do you have all string in one file or one file for each language? The big advantage of a table in a database would be that during development i can just append the strings in english and later i can fill the empty cells with translations.
Would you use an integer or string as primary key of the table? An integer (auto increment id) would have the disadvantage that i also need an enum with the ids.
I thought about something like this:
CString sString = QueryString ("ID_FILE");
|
|
|
|
|
ABuenger wrote: Do you have all string in one file or one file for each language? The big advantage of a table in a database would be that during development i can just append the strings in english and later i can fill the empty cells with translations.
One language per file.
Actually I currently have only English files, but it is simply a matter of making a copy of the file, translating it, and distributing the translated ini file with the app. Or distributing all the language files and having the installer rename the correct one for the language used. Using this method also makes it easier for me (or anyone else) to correct any spelling mistakes or ambiguities that I may have missed when writing the app without having to recompile.
One thing I did do though is put all the default strings into the app's string table in English just in case the ini file can not be found or is corrupted some how.
ABuenger wrote: Would you use an integer or string as primary key of the table? An integer (auto increment id) would have the disadvantage that i also need an enum with the ids.
I thought about something like this:
CString sString = QueryString ("ID_FILE");
That would be my prefered method. Makes it easier to associate strings with controls, menu items, etc. if they all have the same ID strings. Numbers just are not descriptive enough.
"You're obviously a superstar." - Christian Graus about me - 12 Feb '03
"Obviously ??? You're definitely a superstar!!!" - mYkel - 21 Jun '04
"There's not enough blatant self-congratulatory backslapping in the world today..." - HumblePie - 21 Jun '05
Within you lies the power for good - Use it!
|
|
|
|
|
Would this technique perform well at runtime? Unless you had some sort of caching the performance would be considerably slower then LoadString . Even with caching you would have an initial delay while the cache is primed.
Steve
|
|
|
|
|
I don't think that there will be a performance penality even if the strings are queried on the fly. Also they could be cached in a map or array.
|
|
|
|
|
In your particular app it may not be noticeable - But I'd be willing to bet it would be slower. LoadString is a simple API optimized for the simple lookup of strings which are already in memory and SQLLite is a fully fledged database engine. In general generality always has its price. I would suggest that you make a simple app to measure and see - Nothing fancy, just load some strings in a loop and time it.
Steve
|
|
|
|
|
I think we are talking about hundreds or tenth of a second. A sql database would have the advantage that with a simple script the strings could be exported to .c files with static arrays of strings and compiled into the app.
|
|
|
|
|
A tenth of a second is a lot for a computer. You are correct in that if you have a database you have more flexibility - Such as in your example - With this technique I guess you could have the best of both worlds by compiling the strings (from the database) directly into the app via the exported C file. Still to me it seems an overly complex solution to a simple problem - although you may have compelling reason to use a database I don't know about.
Steve
|
|
|
|
|
I don't think a user would notice if the creation of a window or dialog takes a tenth of a second longer.
My problem is that i need the strings in a MFC project as well as in an embedded system (handheld controller) with very limited memory resources. With string tables in the resources i am bound to MFC. Also in most cases i have seen yet the string tables are missing more or less strings over the time because it is a hard task to keep them all up to date.
So the options i see for me is either a sql database, XML file or some other kind of text file.
In my eyes a table is less error prone because i have the columns for each language side by side and can easily find empty cells. I could even query for empty cells to find out if i have missed some.
|
|
|
|
|
If you want to generate a text file form the database (a .C file with the strings in it) perhaps XML would be a good choice, you could use XSL to do the conversion. I imagine by now with all the hype around XML there a plenty of good editors around.
Steve
|
|
|
|
|
It will be slower, but we are talking about UI strings here. Most UI elements have very few strings so the impact will be the UI loading a few milliseconds slower. I doubt a user would ever notice the difference.
"You're obviously a superstar." - Christian Graus about me - 12 Feb '03
"Obviously ??? You're definitely a superstar!!!" - mYkel - 21 Jun '04
"There's not enough blatant self-congratulatory backslapping in the world today..." - HumblePie - 21 Jun '05
Within you lies the power for good - Use it!
|
|
|
|
|
I've just gone through the same problem in a large application. We've had some problems with the strings that have had to be located in the database, namely maintenance issues (it can be a bit of a pain to add new or change existing strings). For a good 90% of the strings, we put them in XML files that are loading into hash tables at run time. I prefer this approach, but either/or are a *lot* easier than resources! Just one more piece of advise, make sure however you put the strings together that you can change the order of the parameters in the string itself. We had some developers putting in printf-style formatting, and that was a nightmare for the translators.
|
|
|
|
|
Hi,
I am programming a custom error dialog box with two three CStatic Controls.
The first is a title, the second is a message and the third is a picture box set to be a icon.
The first two are okay. The third is really bugging me!
I've created a variable for the CStatic from the Variable Wizard called m_Icon and then in Init_Dialg I set it to a standard Icon using this:
<br />
m_Icon.SetIcon(AfxGetApp()->LoadStandardIcon(IDI_EXCLAMATION)); <br />
I have also tried creating an Icon using HICON and setting the control to the HICON and using the method m_Icon.SetIcon(::LoadIcon(IDI_EXCLAMATION));
They all compile fine.
But when i the app runs, i dont see the Icon. The Controls Visability is set to TRUE.
Where have I gone wrong and how can I correct this?
Many Thanks
Tom.
P.S Personally creating Custom Error Dialogs is a pain, and I am looking forward to seeing the Windows Vista TaskDialog!!
-- modified at 16:09 Sunday 22nd January, 2006
|
|
|
|
|
LoadStandardIcon() takes a LPCTSTR , not an UINT . Use the MAKEINTRESOURCE macro to convert IDI_EXCLAMATION to an LPCTSTR .
m_Icon.SetIcon(AfxGetApp()->LoadStandardIcon(MAKEINTRESOURCE(IDI_EXCLAMATION)); ::LoadIcon takes two parameters, the first of which is the handle to the applications's instance, or NULL if loading standard icons. I am surprised the code even compiled.
"You're obviously a superstar." - Christian Graus about me - 12 Feb '03
"Obviously ??? You're definitely a superstar!!!" - mYkel - 21 Jun '04
"There's not enough blatant self-congratulatory backslapping in the world today..." - HumblePie - 21 Jun '05
Within you lies the power for good - Use it!
|
|
|
|
|
Actually, IDI_EXCLAMATION is defined in winuser.h using MAKEINTRESOURCE() , so it's not needed here.
Ryan "Punctuality is only a virtue for those who aren't smart enough to think of good excuses for being late" John Nichol "Point Of Impact"
|
|
|
|
|
Does your static control have the SS_ICON style set?
Ryan "Punctuality is only a virtue for those who aren't smart enough to think of good excuses for being late" John Nichol "Point Of Impact"
|
|
|
|
|
MSG msg; <br />
<br />
while( TRUE )<br />
<br />
{ <br />
<br />
if ( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) )<br />
<br />
{ <br />
<br />
if ( msg.message == WM_QUIT )<br />
<br />
{<br />
<br />
break;<br />
<br />
}<br />
<br />
TranslateMessage( &msg );<br />
<br />
DispatchMessage( &msg );<br />
<br />
}<br />
<br />
}
IM PROUD TO BE A GMAIL;
|
|
|
|
|
Yes, it's a message loop and ...??? What is EXACTLY the question ?
|
|
|
|
|
do you think this would be substantially enough for a DX game?
IM PROUD TO BE A GMAIL;
|
|
|
|
|
Because you're using PeekMessage rather then GetMessage your loop spins in the outer while loop even when there is no message to process. Unless you have an else not show in the code above in the if ( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) ) statement this code is needlessly inefficient. I would suggest you replace it with a GetMessage and watch the CPU usage go down.
Steve
|
|
|
|
|
thank you for the comment, and yes I do have an else statement in the block but forgot to write it in. so you think it will still be good if it has an else block or should i stick with getmessage?
IM PROUD TO BE A GMAIL;
|
|
|
|
|
Normally you'd use PeekMessage and perform some idle time processing in the else part. I'm not sure what's going on in the else bit but it looks ok to me. I find myself a little concerned that you may be busy waiting but I'd have to see the else bit to be sure.
Steve
|
|
|
|