|
Hello all,
I'll start by saying the dreaded words: I am a newbie.
Started using visual studio .NET recently and I just can't seem to do anything with it. I am used to visual studio 6 c++ and I'm having difficulty with the transition.
Under .NET I have creeated a rich text box that I would like to use to display a string of text. The difficulty arises because each character within the string can have different formatting applied (bold, italic, underline). So I would like to simply step through each character within the string and output them one-by-one.
My C++ brain tells me that I would like to simply use a for_each, like this:
<br />
string s = "Hello I am a test string";<br />
for_each(s.begin(), s.end(), printValue);<br />
So can anyone explain what would be different when implementing the above functionality within .NET,
or can I still somehow write the same C++ that I am used to?
Just to give an idea, here is a code snippet
<br />
private: System::String *text_string;<br />
<br />
private: System::Void outputToScreen()<br />
{<br />
this->text_string = S"Hello I am a test string...";<br />
<br />
}<br />
Even links to relevant API support documentation would be great
Thanks for your help.
|
|
|
|
|
richiebaby wrote: Started using visual studio .NET
Witch one: 2003 or 2005. I will use 2005 syntax for samples.
richiebaby wrote: My C++ brain tells me that I would like to simply use a for_each, like this:
Your sample is wrong.
String has simular behaver like CString.
using namespace System;
using namespace System::Collections;
int main(array<System::String ^> ^args)
{
String ^s = gcnew String("Hello, I am a test String");
array <Char> ^sChars = s->ToCharArray();
IEnumerator ^myEnum = sChars->GetEnumerator();
while (myEnum->MoveNext())
{
String ^ss = (myEnum->Current->ToString());
Console::WriteLine("-{0}-", ss);
}
return 0;
}
|
|
|
|
|
Hi
Thanks for your help, but I'm afraid that I need a little more guidance.
First the answer to your question: I am using .NET 2003.
Some more info: I started a new Windows form project, I then proceeded to create a RichTextBox on the form. So setting the text is easy but I am trying change the font of individual characters within the RichTextBox(don't know if the best solution is to use RichTextBox or not).
So I figured that I would go through each char within the string, apply a font and append to the contents of the RichTextBox (not even sure if possible).
The trouble is I can't seem to get to grips with the .NET framework, I find it harder than good old C++.
Straight away I am slightly lost with your sample code, how can I take your suggested code and import it into the code that .NET has produced for me. Bearing in mind I am not within the main method but within a new that I have created.
For instance, if I have an empty method called outputToScreen(), how can I even start to use your suggested code.
<br />
private: System::Void outputToScreen()<br />
{<br />
<br />
}<br />
If I write:
<br />
private: System::Void outputToScreen(array ^args)<br />
{<br />
}<br />
Then I get "error C6201: syntax error : identifier 'array'"
These are probably dumb question but i am trying to learn, so...
Thank you.
|
|
|
|
|
richiebaby wrote: Thanks for your help, but I'm afraid that I need a little more guidance
Sure, that's whay we are here.
richiebaby wrote: First the answer to your question: I am using .NET 2003.
It was a long time ago when i used VS2003.
Some syntax diffrences betwen VS2003 and VS2005 (List is incomplete
VS2003 VS2005
new gcnew
__gc (In gc container, you don't use it)
* (pointer def.) ^
(String *sArray = new String __gc *[10]; array (defin. for ar.)
VS2003 using managed c++(obsolete syntax). VS2005 is using newer syntax called C++/CLI. Currently i have vs2005 installed, so i can't garanity, that my code is bug free.
richiebaby wrote: Straight away I am slightly lost with your sample code, how can I take your suggested code and import it into the code that .NET has produced for me. Bearing in mind I am not within the main method but within a new that I have created.
you can use it as find the position. But it is VS2005 syntax, i forgot how it look like in VS2003.
richTextBox1->Text = "Hello, World.";
richTextBox1->Select(7,5);
richTextBox1->SelectionFont = new System::Drawing::Font("Tahoma", 12, FontStyle::Bold);
richTextBox1->SelectionColor = System::Drawing::Color::Blue;
richTextBox1->DeselectAll();
You can sceep command Select(int, int), SelectAll() and DeselectAll(), if you intend to select a text with a mouse.
richiebaby wrote: The trouble is I can't seem to get to grips with the .NET framework, I find it harder than good old C++.
Because you are used to. I couldn't learn c++ (MFC and Win32) is due to an problems with converting from one to another parameter. In .NET i could Use like String::ToInt32(S"666");
|
|
|
|
|
After a bit of hacking I have found a working solution.
Many thanks to the person who posted their code.
Here is a copy of what I was trying to achieve
<br />
private: System::Void outputToScreen()<br />
{<br />
textBox->Clear();<br />
<br />
System::String *temp_text_string;<br />
<br />
text_string = S"Hello I am a test string";<br />
<br />
Array *stringArray;<br />
<br />
stringArray = text_string->ToCharArray();<br />
<br />
IEnumerator *myEnum = stringArray->GetEnumerator();<br />
<br />
while (myEnum->MoveNext())<br />
{<br />
temp_text_string = (myEnum->Current->ToString());<br />
<br />
textBox->SelectionFont = new System::Drawing::Font( "Arial",12,FontStyle::Italic );<br />
<br />
textBox->SelectedText = temp_text_string;<br />
} <br />
<br />
}<br />
So there we have it, I am much happier now that I have something to work on.
I know it's ugly but I'm happy seeing as I've only used .NET for less than 48 hours.
Thanks again
|
|
|
|
|
I have this very wierd error message in Visual C++ Express 2005:
1>.\UIEvents.cpp(252) : error C2860: 'void' cannot be an argument type, except for '(void)'
1> This diagnostic occurred while importing type 'VLCWPF::SkinInterface::PlaylistItem ' from assembly 'VLCWPF, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. Here's the offending code:
InputItem *inputitem = item->get_InputItem(); What's most wierd to me is that I can't find anywhere where this mysterious void could be coming from. The class InputItem is very simple, so I can't see why it would have problems:
public class InputItem
{
public InputItem(string name, string uri, string[] inputOptions, int id, InputInterface.InputType inputType)
{
this.name = name;
this.uri = uri;
this.inputOptions = inputOptions;
this.id = id;
this.inputType = inputType;
}
public InputItem(string name, string uri) :
this(name, uri, null, 0, InputInterface.InputType.Unknown)
{
}
public string Name
{
get { return name; }
set { name = value; }
}
public string Uri
{
get { return uri; }
set { uri = value; }
}
protected string name;
protected string uri;
protected string[] inputOptions;
protected int id;
protected InputInterface.InputType inputType;
}
Can anyone make any suggestions? I can't figure out for the life of me what could cause this.
Joel Holdsworth
|
|
|
|
|
First of all, your InputItem class looks like C#. Assuming the class is located in a C# assembly, your problematic code should look like something like this:
InputItem ^inputitem = item->get_InputItem();
The "*" is for unmanaged code.
|
|
|
|
|
George L. Jackson wrote: The "*" is for unmanaged code.
And for old Managed c++
|
|
|
|
|
I almost forgot! The "get_" in "item->get_InputItem()" may also be a problem!
|
|
|
|
|
You're using 2 different languages here. I don't know that C# has a dereference operator, except in unsafe blocks.
Thanks,
John
|
|
|
|
|
Hi All,
I am using VC++ 2005 Express and SQL Server express. The database MyDB has shown in the Data Sources panel after applying "add new data source" steps. In the MYDB, there is a table called "MyTable", which is also shown in Data Sources panel. How do I transfer data from MyTable to a DataTable ("dtTable")? I tried following codes but it didn't work.
SqlDataAdapter^ sqlAdapter;
DataTable^ dtTable;
sqlAdapter = gcnew sqlDataAdapter("select * from MyTable", "MyDB");
dtTable = gcnew DataTable("dtTable");
sqlAdapter->Fill(dtTable);
Any suggestions? Thanks in advance.
Kevin
|
|
|
|
|
I don't see any connection string or code to talk to the database!
|
|
|
|
|
Thanks George. I thought that, when a database was shown in the Data Sources panel, the connection codes were implied. I'll add connection codes and try again.
Kevin
|
|
|
|
|
Hi,
I do have the following structure in vc++
public ref struct structExample
{
int a;
char b;
float c;
};
i need to copy the array of bytes value into this structure,
Generally if the structure is not a managed type we use "memcpy()" to copy the contents into the structure.
Similarly how can be done this ,in case of managed structures
Thanks in advance
Sangeetha
|
|
|
|
|
Hi,
basically the BitConverterClass should meet your requirements. But most likely there is a more elegant way to do this.
e.g.
structExample^ strEx = gcnew structExample();
strEx->a = BitConverter::ToInt32(byteArray,indexofyourinteger);
regards Tobias
|
|
|
|
|
I need to copy the array elements into the structure on a whole at a stretch as "memcpy()" does in ummanaged code, since I do have 100 elements/members in the structure.
|
|
|
|
|
Well you can either use serialize/deserialize on your struct or you could actually use one of these methods:
Marshal::PtrToStructure(...);<br />
Marshal::StructureToPtr(...);
Please note that those methods marshal data from a managed object to an unmanaged block of memory and vice versa. Further information is also provided here:
http://www.dotnet247.com/247reference/msgs/57/289239.aspx[^]
regards Tobias
|
|
|
|
|
Hi,
I want to raise an event from my code in vc++.
while raising the event i need to check for the null.
Basically to know whether some one has registered for this event . How the event can be checked for the Null value.
if it is not checked System::NullReference Exception is thrown
thanks in advance,
Sangeetha
|
|
|
|
|
try if ( event == nullptr )
rgds...mil10.
|
|
|
|
|
This gives the error as follows
error C3918: usage requires 'event' to be a data member
Regards
Sangeetha
|
|
|
|
|
seems u have no declared the evenet object properly. Please post the code.
rgds...mil10.
|
|
|
|
|
|
Here is the sample explaining why i need to check for a null.
Example:
public void delegate MyEventHandler();
public ref class MyClass
{
int i = 0;
public event MyEventHandler ^ MyEvent;
public SampleFunction
{
if(MyEvent!= nullptr) //raises C3918
{
MyEvent();
}
else
{
throw exp;
}
}
}
NOTE : I do register this event in some other class on certain conditions . So if it is not registered i need to throw it as a exception.
So it would be beeter if i check it for a null.
How can be this be done
Regards
Sangeetha
-- modified at 1:05 Monday 3rd April, 2006
|
|
|
|
|
hi,
As mentioned in those forums, it is impossible to check an event against nullptr in c++/cli but you could actually use a public delegate as data member instead.
regards Tobias
|
|
|
|
|
Hi,
immediately after telling you to use a delegate i found myself confronted with a similar problem.
Though i had to find a solution for myself as well. Basically in my case, i need to check a remote event for any dead delegates which are still connected to it. Otherwise it will end up in a remoting exception each time i'll raise the event. So i did the following:
public delegate void SensorUpdatedEventHandler (Object^, UpdateEventArgs^);
public ref class SensorWebLink : ...
{
...
SensorWeblink()
{
_RemotelyInvokedDelegates = nullptr;
}
...
...
private:
static SensorUpdatedEventHandler^ _RemotelyInvokedDelegates;
public:
event SensorUpdatedEventHandler^ SensorUpdatedEvent
{
void add(SensorUpdatedEventHandler^ pDelegate)
{
_RemotelyInvokedDelegates += pDelegate;
}
void remove(SensorUpdatedEventHandler^ pDelegate)
{
_RemotelyInvokedDelegates -= pDelegate;
}
void raise(Object^ pObject, UpdateEventArgs^ pEvtArgs)
{
if (_RemotelyInvokedDelegates)
{
_RemotelyInvokedDelegates->Invoke(pObject, pEvtArgs);
}
}
};
void RaiseSensorUpdatedEvent (UpdateEventArgs^ pEvtArgs);
};
void SensorWebLink::RaiseSensorUpdatedEvent(UpdateEventArgs^ pEvtArgs)
{
if(_RemotelyInvokedDelegates == nullptr)
{
Console::WriteLine("No listeners");
}
else
{
Console::WriteLine("Number of Listeners: {0}",_RemotelyInvokedDelegates->GetInvocationList()->Length);
SensorUpdatedEventHandler^ temporaryHandler = nullptr;
for each( Delegate^ del in _RemotelyInvokedDelegates->GetInvocationList())
{
try
{
temporaryHandler = (SensorUpdatedEventHandler^) del;
temporaryHandler(this, pEvtArgs);
}
catch( Exception^ e )
{
Console::WriteLine( e->ToString() );
_RemotelyInvokedDelegates -= temporaryHandler;
}
}
}
} Btw. I had this idea after reading this msdn article:
http://msdn2.microsoft.com/en-US/library/5f3csfsa(VS.80).aspx[^]
cheers Tobias
|
|
|
|