|
The API call
StringFormat.SetMeasurableCharacterRanges(CharacterRange[])
will throw an Overflow exception if the CharacterRange[] parameter is greater than 32 elements long. For instance, the following code will throw an exception:
CharacterRange[] ranges = new CharacterRange[33];
StringFormat format = new StringFormat();
format.SetMeasurableCharacterRanges(ranges);
However, if ranges[] was <= 32 elements long, no exceptions are thrown. All of this is regardless of whether each CharacterRange element is initialized (of course, .NET initializes value types anyway). Looking throught the MSDN documentation, I see no mention of a length limit for the .SetMeasurableCharacterRanges method.
So I have 2 questions: is this a known bug or expected functionality? And what other options do I have for retrieving the character positions of text?
The graveyards are filled with indispensible men.
|
|
|
|
|
The documentation I found is a bit confusing. The VB version of the SetMeasurableCharacterRanges method takes one parameter, an array of type CharacterRange. The C# version takes two parameters:
Status SetMeasurableCharacterRanges(
INT rangeCount,
const CharacterRange *ranges
);
The first being the number of elements in the array pointed to by the second parameter, a pointer to an array of type CharacterRange.
The docs I found doesn't say that either parameter is optional, so I'd start there...
RageInTheMachine9532
|
|
|
|
|
Not sure what documentation you're looking at there, but .NET's SetMeasurableCharacterRanges takes only a single parameter, which is not optional.
I posted this question on an MSDN newsgroup and got the following reply:
We hit the same problem, and basically it is an undocumented 'feature'
To get around this limitation, test each character at a time, or in batches
of 32 characters
James
So it seems this is a 'feature'...? Really strange why it would be limited to 32 characters.
The graveyards are filled with indispensible men.
|
|
|
|
|
I wasn't reall impresed with the quality of what I found, but it's in the VS.NET2K3 documentation that came with the Enterprise version. Paste this: ms-help://MS.VSCC.2003/MS.MSDNQTR.2003APR.1033/gdicpp/gdi+/gdi+reference/classes/stringformatclass/stringformatmethods/setmeasurablecharacterranges.htm into the help browser address bar to see what I was looking at. It gives a C# example that takes TWO parameters. It could be that these docs were updated in the Oct'03 update to the VS documentation. I haven't been able to get that update installed...
SetMeasureableCharacterRanges is also not limited to 32 characters, but 32 character ranges.
RageInTheMachine9532
|
|
|
|
|
Hello!
I do not know how to open CD-ROM! Thanks.
|
|
|
|
|
Push the open/close button on the outside of the drive.
- Nick Parker My Blog
|
|
|
|
|
Could you provide some pictures explaining this?
Perl combines all the worst aspects of C and Lisp: a billion different sublanguages in one monolithic executable. It combines the power of C with the readability of PostScript. -- Jamie Zawinski
|
|
|
|
|
|
You get the Reply Of Today gift.
Mazy
"A bank is a place that will lend you money if you can prove that you don't need it." - Bob Hope
|
|
|
|
|
Mazdak wrote:
You get the Reply Of Today gift.
- Nick Parker My Blog
|
|
|
|
|
That's not correct...
That's how I get to my cup holder!
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
Heath Stewart wrote:
That's how I get to my cup holder!
I always confuse the two!
- Nick Parker My Blog
|
|
|
|
|
This type of functionality isn't built into the .NET framework, so you'll just have to use P/Invoke.
Lucky for you, I guy I know from another forum already has done this[^].
The graveyards are filled with indispensible men.
|
|
|
|
|
heheh
Matthew Hazlett
Windows 2000/2003 MCSE
Never got an MCSD, go figure...
|
|
|
|
|
|
I'm learning to deliver some additional functionality to the end user I'm going to have to envoke some transact-sql statements to detach and reattach my SQL-Server (MSDE) database. My C# application uses standard ADO.NET but I can't find any examples of Transact-sql statements be called from within a C# program.
Any hints or an snippet of code on how I would do this from within a C# application?
Thanks,
cb
|
|
|
|
|
betterc wrote:
Any hints
Search for SqlCommand class. You can run any query or t-sql statement with it.
Mazy
"A bank is a place that will lend you money if you can prove that you don't need it." - Bob Hope
|
|
|
|
|
Something like the following should do it:
static void DetachPubsDB()<br />
{<br />
string connStr = "provider=SQLOLEDB;Data Source=(local);User ID=sa;Password=;Initial Catalog=master; Network Library=dbmssocn";<br />
OleDbConnection conn = new OleDbConnection(connStr); <br />
<br />
try<br />
{<br />
conn.Open();<br />
<br />
OleDbCommand cmdDetach = new OleDbCommand("sp_detach_db", conn);<br />
cmdDetach.CommandType = CommandType.StoredProcedure;<br />
cmdDetach.Parameters.Add("dbname", "Pubs");<br />
cmdDetach.ExecuteNonQuery();<br />
<br />
OleDbCommand cmdAttach = new OleDbCommand("sp_attach_db", conn);<br />
cmdAttach.CommandType = CommandType.StoredProcedure;<br />
cmdAttach.Parameters.Add("dbname", "Pubs");<br />
cmdAttach.Parameters.Add("filename1", @"C:\Program Files\Microsoft SQL Server\Data\MSSQL\Data\pubs.mdf");<br />
cmdAttach.Parameters.Add("filename2", @"C:\Program Files\Microsoft SQL Server\Data\MSSQL\Data\pubs_Log.ldf");<br />
cmdAttach.ExecuteNonQuery();<br />
}<br />
catch(Exception excp)<br />
{<br />
Console.WriteLine(excp.Message);<br />
}<br />
finally<br />
{<br />
if(conn.State == ConnectionState.Open)<br />
conn.Close();<br />
conn.Dispose();<br />
}<br />
}
The most exciting phrase to hear in science, the one that heralds the most discoveries, is not 'Eureka!' ('I found it!') but 'That's funny...’
|
|
|
|
|
Thank you sooooooo much, I can hardly wait to give it a try!
Why is it that finding a simple example such as the one you have furnished is so difficult?
Thanks again!
cb
|
|
|
|
|
Actually, it's not so bad.
MSDN has lots of good articles on various facets of ADO.Net and if all else fails, there's Google. I would strongly recommend visiting Microsoft's ADO.Net Primer[^] if you plan to work with ADO.Net a lot.
Most of the challenge that I've seen people suffer through with ADO.Net stems from their previous history with ADO 2.x (COM-based).
The two ADO implementations share some terminology and concepts, but are largely different. Many experienced ADO 2.x developers find ADO.Net syntax more cumbersome than ADO 2.x and I suppose I agree to some extent.
A very good place to start is by examining the ADO.Net object hierarchy. Take the time to read about each class (there really aren't that many, and there are only a handful that get used in most common database transactions).
CodeProject is a great place to get information, but you have to have a mindset that you're prepared to explore and experiment - experience is the best teacher.
The most exciting phrase to hear in science, the one that heralds the most discoveries, is not 'Eureka!' ('I found it!') but 'That's funny...’
|
|
|
|
|
Agrreed and thank you.
I have bought several ADO.NET books and am picking it up really quickly. I was doing pretty good until I needed to write an application using an MSDE DB on a distributable CD.
In one sense since my application will be just referencing (reading) the DB my work is easy.
The hardwork is in developing a 'setup' routine that installs MDAC, .NET, MSDE, my application and reference the data on the CD.
This kind of through me into using transact-sql, something I've never needed to do before.
I found plenty of examples of transact-sql statements and I've written qutie a few ExecuteNonQuery() routines but I couldn't find an example that put it all together.
What you pointed out was that my commandtype = storedprocedure which I didn't think I needed.
So with your help and my recently purchased "The Guru's Guide to Transact-SQL" I'll get to experimenting.
Thanks again,
cb
|
|
|
|
|
Printing within C#/.NET seems pretty easy. At least it did until I tried to draw some objects with specific sizes.
During a print page event I try to draw a rectangle 1" x 1". I calculate the size as:
RectangleF r = new RectangleF( 0,0,g.DpiX,g.DpiY );
The rectangle is grossly over sized.
The DpiXY of the graphics is typically 600x600...seems right.
However, I do notice that the page units of the graphics are GraphicsUnit.Display which is not what I was expecting for a print event.
Transform of the Graphics is identity.
Any ideas ?
-Duncan
|
|
|
|
|
Ok, I'll answer this one myself
GraphicsUnit.Display is the default. This implied a 100dpi device.
Thus the correct way to calculate a real world size is:
float dpiXA = g.DpiX * ( 100.0f / g.DpiX );
float dpiYA = g.DpiY * ( 100.0f / g.DpiY );
Then use dpiXA/YA in your size calculations.
If you are doing a print preview to a display device ( typically 96dpi ) then this calculation will also be correct.
|
|
|
|
|
hi,
i have a Mesh that fills all the screen and i want to get a window loaded in the app so i can interact with it as realy active window
can i make my app form is parent for this certain window if yes how ??
|
|
|
|
|
Uhhhh....What?
I can't make any sense of what your trying to do. What are you trying to interact with and how do you want to interact with it?
RageInTheMachine9532
|
|
|
|