|
If you are not happy with what you have, I can tell
you how I did it, but I must warn you, it has been
a big effort.
I did it as part of a larger project; relevant steps include:
- text lines stored in memory basically in an ArrayList,
one item per line;
- each line also holds two flags to indicate comment
status; these get set when the line is input/changed;
- text drawn in a Panel, using OnPaint handler,
and Graphics.DrawString;
- all coloring/syntax highlighting handled inside OnPaint,
based on a simple parser that knows the list of
keywords (and their color) for each of the supported
programming languages.
Steps taken to get maximum performance:
- only the visible lines are parsed, colored and painted;
lines scrolled outside the panel are skipped (except
for the comment flags).
A typical Panel shows up to 60 lines, a very small
number with respect to an entire source file.
- the comment flags help in starting the first visible
line either as continued comment (green background)
or not.
- the simple parsers are not full fledged parsers, they
dont understand expressions, dont return a parse tree,
etc. They must only process a single line and know about
comments, string literals, and keywords.
- the parsers return tokens (identifiers, constants,
operators, etc) as a string plus Color; Graphics.DrawString
paints these tokens individually.
- as a result of all this, nearly linear behavior, and no delay
whatsoever.
All in all a couple thousand lines of C# code (and
based on a growing library of low-level classes that
I use in all my apps and that is not included in the
estimate).
Hope this clarifies things.
|
|
|
|
|
Okay, somebody tell me the secret!!!
I need to check the ASCII value of a
single character in a string --
(value of a quote " or an equal sign =,
which is ascii 34 and 61 respectively)
I cannot figure out how this is done -- I've
been all over the map on this! I'm embarrassed
to say I am an experienced programmer (PLSQL and
VB6) C# is my first object oriented effort and
I am about to pull my hair out on what would seem
to be a simple task. Please, if anyone can show
an example of this, I'd truely be grateful.
Remember that I am a beginner and may not be
able to make leaps of logic as in "just use Char".
Thanks.
stone_sks
|
|
|
|
|
stone_sks wrote: "just use Char".
See? You know the answer already.
In what way do you want to "check the ASCII value"?
Will something as simple as if ( s [ 0 ] == 61 ) ... suffice?
|
|
|
|
|
Yes, it could be that simple.
What I am doing is parsing through a string
where I need to check each character's ASCII
value. But yes, it could be as simple as
your example inside a for loop. Thank you.
stone_sks
|
|
|
|
|
And Regular Expressions won't do what you need?
|
|
|
|
|
No, I need to check the value against the ASCII
chart, as in the following example (which is VB6 code)
c is value I will check.
Select Case Asc(c)
Case 13, 9, 10
sSql1 = sSql1 & " "
Case Is < 32
sSql1 = sSql1 & " "
Case 34
sSql1 = sSql1 & "'"
Case Is > 124
sSql1 = sSql1 & " "
Case Else
sSql1 = sSql1 & c
stone_sks
|
|
|
|
|
Well, as Luc pointed out, you can use character literals
switch ( c )
{
case '\t' :
case '\r' :
case '\n' : ... ; break ;
case '\"' : ... ; break ;
...
default : ... ; break ;
}
Although, that test for < 32 , is problematic.
But it looks like you're simply replacing non-printing characters with a SPACE, a QUOTE with an APOSTROPHE, and everything else left as it is; I expect that can be done with a Regular Expression.
|
|
|
|
|
PIEBALDconsult wrote: Although, that test for < 32, is problematic
well, not really, I would suggest:
if (c < ' ') ...
There is one, very structured, alternative using an array, that serves as
a translator; it does not rely on any knowledge about ASCII values !
char[] translatation=new translation[128];
translatation[(int)'a']='a';
translatation[(int)'b']='b';
translatation[(int)'\t']=' ';
etc
then:
foreach (char cin in inputCollection) {
char cout=0;
if (cin<translation.Length) cout=translation[(int)cin];
if (cout!=0) stringbuilder.Append(cout);
}
of course the initialization can be shortened by using a foreach loop as in
foreach (char c in "abcd....") translation[(int)c]=c;
|
|
|
|
|
Well I meant it doesn't fit with the switch .
This is a case where a series of if/else s is better than a switch
if ( ( c < ' ' ) || ( c > '~' ) ) // append ' '
else if ( c == '\"' ) // append '\''
else // append c
The original VB (?) is more complex than necessary.
|
|
|
|
|
Thanks for your help Luc!
stone_sks
|
|
|
|
|
You're welcome.
|
|
|
|
|
Thank you for you help . I'll experiment with
all the suggestions.
stone_sks
|
|
|
|
|
Yes, it could be that simple.
What I am doing is parsing through a SQL string
of text where I need to check each character's ASCII
value. The string I am checking will be form of an
SQL statement. My end goal of the program I am
developing is to convert the statment to Vb style
SQL.
But yes, it could be as simple as
your example inside a for loop. Thank you.
stone_sks
|
|
|
|
|
You seldom need the integer ASCII value of a character in a C# app !
You can use character constants such as '=' and even '\"'
If you really want to know their integer value try
char c='=';
int ASCIIvalue=(int)c;
|
|
|
|
|
Hello everyone,
Here is a scenario:
Front End:
MSVS2005 - C# - DGV
Back End:
MS SQL Server2005 - Stored Procedures
On the backend the main table contains a column named "OfficeID", tinyint, and in another table named "Offices" there are three coulmns "OfficeID", tinyint (PK); "OfficeName", nchar; and "OfficeAbb", nchar.
In my SELECT stored procedure I do an INNER JOIN of "OfficeID" columns in these two tables and display the OfficeAbb string on my front end DataGridView when I call the SELECT stored procedure instead of that tinyint stored in the main table.
This works great and DGV displays the Office Abbreviation based on the tinyint stored in the OfficeID column of the main table.
However, when I try to call my UPDATE stored procedure to update the main table I get "Failed to convert parameter value from a String to a Byte" because the DataSet now holds that two letter string office abbreviation and apparently the DataAdapter is not smart enough to lookup the Offices table and replace the string with the OfficeID tinyint for me.
I guess I either have to use some method of the DataAdapter to instruct it to translate the string into the tinyint based on the Office table values or to change the UPDATE stored procedure to where it would accept the string and than do the value translation for me. I suspect both options are possible but was unable to Google this out despite this being such a common scenario.
Any help is appreciated.
Thanks for reading,
Dean
|
|
|
|
|
I have been asked to develop an executable that will be called by a VBscript located on a fileserver (the executable will be located there too). The application needs to check to see if a file exists in a folder. If it does then it needs to read the file to see if a particular line exists and change it. Since the script runs under the user's login and the file is in their C:\Windows directory (they don't have rights to edit anything in this folder) the executable will need to run as Domain Admin in order to edit the file. I am sure I can determine if the file exists and read it, but I am not sure about how to editi it using different credentials. Could I get some pointers as to how to go about doing this?
Thanks,
Mike Donner
Email me at mike_donner@saaerospace.com
|
|
|
|
|
hello frnds
i have designed a window form usin graphics in c#.
now i want to save it as my screensaver
please help me and suggest me wat to do and how
thanks
|
|
|
|
|
IIRC a screen saver is no more than an EXE file that got renamed to an .SCR extension;
after that you can (with or without copying it to a more appropriate folder)
select it thru the Display Properties' ScreenSaver tab.
|
|
|
|
|
|
hi
i want to know how to determine that .NetFrameWork has been installed on the target system or not (via registry keys or ....) ?
and also i want to detrimine version of frameWork that installed on the system. thanks
|
|
|
|
|
As a C# question: write any C# program, if it runs, there is at least one
.NET available; if you get a weird error message, the .NET version you built
against is not available.
Search CodeProject for "Framework version" and you will find some good articles[^].
|
|
|
|
|
Hi!
Several approaches look at the registry: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP has a subkey for each installed version of the framework, along with further information (for example if a service pack is installed or not).
Regards,
mav
--
Black holes are the places where God divided by 0...
|
|
|
|
|
A bit late but as another suggestion you could look at the file mscoree.dll in your system32 directory. This files version indicates the version installed on your machine.
|
|
|
|
|
Hi,
This is a splitoff from my previous thread, but since this one is pretty narrow, I decided to give it separate thread... hope that this is ok with admins.
Anyhow... I have a .DLL i compiled, and added as a reference to a C++ project in .NET. Now I need to be able to access its members somehow. Both library and its namespace are called HyTest, however HyTest:: or HyTest. yeild nothing. Is there a specific way to access members of a DLL (written in C#) compiled in .NET?
wbr,
Victor
|
|
|
|
|
Hi Victor,
Whether you refer to a VB.NET, a C#.NET or a managed C++ DLL makes no difference;
from the outside you almost cant tell what language was used to build the DLL !
So treat it as if it were some other managed C++ DLL.
|
|
|
|