|
What? Can you try explaining a little better?
To access a static member, first make sure the access modifier allows it. It should be public for all code to access it, protected for derivative classes to access it, internal for code in the same assembly to access it, and protected internal for code in the same assembly or derivative code in any assembly to access it. If you're not specifying an access modifier, than members default to private.
Then, just access the member using the Type - not the instance:
MyClass.MyStaticMethod(); If you're calling a static method or getting/setting a static field or property in defined on the same class in which your code is currently executing, you don't have to specify the class name, though I personally find it easier to read.
If you're trying to access instance data through a static member (bad idea), then your instance must get/set itself as a static member like so:
public class MyClass
{
private static object syncRoot = new object();
public MyClass()
{
if (theInstance == null)
lock (syncRoot)
if (theInstance == null)
theInstance = this;
}
private static MyClass theInstance;
public static MyClass TheInstance
{
get { return theInstance; }
}
}
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
Or the instance could pass itself as a parameter to a static method, but there's no reason to do that instead of creating an instance method. I'm interested to see more information from the poster.
Regards,
Jeff Varszegi
EEEP!
|
|
|
|
|
By definition, no you can't use a Static member to access instance data. Reason being, static members are not associated with ANY instance. They can be used without instantiating an object from the class. Since they are never instantiated, they are also never associated with any other instance and, therefore, can't access instance data.
RageInTheMachine9532
|
|
|
|
|
... unless, that is, there's a static handle to an instance. This question smacks so much of misguided design that I'm interested to see more information from the poster.
Regards,
Jeff Varszegi
EEEP!
|
|
|
|
|
Hi,
I've been trying out stuff in C#, and got to the following problem:
I need to create a list in C#, and send it to a C++ dll together with another value. The C++ dll will add the value to the list.
So, when this concludes I'll have the updated list in my C# program.
This cause a few questions:
1. Is there a list structure in C# (or I'll need to use ArrayList).
2. How can I marshall the list in C++ to anything in C#?
Thanks
|
|
|
|
|
Any implementation of IList is a list (though arrays - which implicitly inherit from System.Array - are static). The problem is marshalling. You cannot just pass the IList to C++ and expect it to work, especially when there's no such implementation in C++.
What list are you using? An STL list ? That determines how you marshal an IList from managed to unmanaged code, and vice versa.
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
yep, I understood that my problem is marshaling.
The problem I can't find anywhere an example for this.
My list is an STL list.
|
|
|
|
|
I think it will be pretty safe to say that it is NOT possible to marshal an STL list or anything STL for that matter. I mean templates are simply not supported in C# or VB.NET(they will be supported in C# 2.0). If you can modify your C++ source code, you should look into using a SAFEARRAY or a c-style array for calls that will be P/Invoked. Or you should look into writing a COM wrapper for you C++ class.
|
|
|
|
|
First of all, thank you for your answer.
Secondly, can you think of a data structure that can be marshaled?
List is not a must...
|
|
|
|
|
Is it possible to generate a unique number from a string of say 50-100 characters? Is that what a "hash" is? If so, how do you do it?
NATHAN RIDLEY
Web Application Developer
email: nathan @ netlab.com.au
[remove the spaces before and after the @ symbol]
|
|
|
|
|
Hello!
I'm not a guru but i think MD5 encryption is a solution for this case
Bye
|
|
|
|
|
While it's not guaranteed to be unique, it is mathematically impropable (not impossible) to get the same hash.
You can generate a digest over your string like so:
public string Digest(string value)
{
if (value == null) throw new ArgumentNullException("value");
byte[] buffer = Encoding.Unicode.GetBytes(value);
MD5 md5 = MD5.Create();
byte[] hash = md5.ComputeHash(buffer);
return ConvertToHex(hash);
}
public string ConvertToHex(byte[] buffer)
{
if (buffer == null) throw new ArgumentNullException();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < buffer.Length; i++)
sb.AppendFormat("{0:X2}", buffer[i]);
return sb.ToString();
}
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
Hash function definition
When people talk about hashing data, they're passing it through a hash function. Hash functions are one-way functions at least in the sense that data over an unconstrained range may be made to fit into a constrained range; however, it's sometimes possible to figure out possible input values from some output. MD5 is an often-used hashing algorithm. The single most popular use for hashing, in my experience, is to store passwords in a somewhat secure way. Many servers don't store a plain-text version of a password, or can be configured that way; instead, they store the hashed version, and when some client requests authentication, they take the passed password, hash it, and compare it to the hashed version.
Regards,
Jeff Varszegi
EEEP!
|
|
|
|
|
Thanks guys for the answers. Very helpful!
NATHAN RIDLEY
Web Application Developer
email: nathan @ netlab.com.au
[remove the spaces before and after the @ symbol]
|
|
|
|
|
You're welcome!
Regards,
Jeff Varszegi
EEEP!
|
|
|
|
|
hello,
i'm using a dataview to sort my datagrid. My datagrid has a column like this:
DataGridColumnStyle ColLib5 = new DataGridTextBoxColumn();<br />
ColLib5.MappingName = "loadorder";<br />
ColLib5.HeaderText = "Loadorder";<br />
ColLib5.Width = 80;<br />
ts1.GridColumnStyles.Add(ColLib5);<br />
dtgLibrary.TableStyles.Add(ts1);
But when i sort the column, he sorts it like this
1
10
2
3
So not like numbers.
How can i change this?
Thx in advance.
|
|
|
|
|
If you use DataView , numeric fields sort correctlly, your code doesn't show any DataView.
DataView myDataView = DataTable1.DefaultView;
myDataView.Sort = "myColumnName";
Mazy
"One who dives deep gets the pearls,the burning desire for realization brings the goal nearer." - Babuji
|
|
|
|
|
yes that's what i'm doing but he sorts it wrong because he seems to think the column isn't numeric :-s
|
|
|
|
|
The DataColumn.DataType must also be set to a numeric Type . If you create a typed DataSet using either VS.NET or the xsd.exe .NET Framework SDK utility, this is done automatically for you if the XML schema declared a numeric type. Otherwise, your numbers are treated like text, which would be sorted as you're seeing now.
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
i believe it worked before i started using this:
DataGridColumnStyle ColLib5 = new DataGridTextBoxColumn();<br />
ColLib5.MappingName = "loadorder";<br />
ColLib5.HeaderText = "Loadorder";<br />
ColLib5.Width = 80;<br />
ts1.GridColumnStyles.Add(ColLib5);<br />
dtgLibrary.TableStyles.Add(ts1);
I thought maybe because of the DataGridColumnStyle ColLib5 = new DataGridTextBoxColumn(); he thinks it's not numeric. Is there a way to change it?
|
|
|
|
|
Like I said, you have to set the DataColumn.DataType to a Int32 or some other numeric Type. What you're doing there is just defining a column style, not the definition of the column.
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
I have seen a few programs that have great visual effects for the taskbar tray. For instance, when you minimize the main window the window creates trails down to the taskbar tray icon to remind the user where to find the program later. Since the program that I'm writing is residing with the taskbar tray icons I would like to incorporate this effect. Does anyone know how to accomplish this?
The next effect that I'm hoping to achieve can be observed by Norton Anti-virus users. It is an effect where a scrolling window appears above the tray icon informing the user that virus definitions have been updated. I have a very unique application for this effect and I have decided that I must incorporate it. Anybody have a clue on how to achieve that neet effect?
thanks for any clues!
Eli
|
|
|
|
|
For the first part of the question, DrawAnimatedRects . See also http://www.codeproject.com/gdi/drawanimated.asp[^]. Obviously you'll have to use a P/Invoke declaration. Here's some code I cooked up:
[StructLayout(LayoutKind.Sequential)]
private struct RECT
{
int left;
int top;
int right;
int bottom;
public static RECT FromLTRB( int l, int t, int r, int b )
{
RECT rc = new RECT();
rc.left = l;
rc.top = t;
rc.right = r;
rc.bottom = b;
return rc;
}
public static RECT FromRectangle( Rectangle r )
{
return FromLTRB( r.Left, r.Top, r.Right, r.Bottom );
}
}
private const int IDANI_CAPTION = 3;
[DllImport("user32.dll")]
private static extern bool DrawAnimatedRects( HandleRef hwnd, int idAni,
[In] ref RECT lprcFrom, [In] ref RECT lprcTo);
private void OnClosing(object sender, System.ComponentModel.CancelEventArgs e)
{
if ( exiting )
return;
e.Cancel = true;
Rectangle boundsRect = Screen.PrimaryScreen.Bounds;
RECT rcFrom = RECT.FromRectangle( Bounds );
RECT rcTo =
RECT.FromLTRB(
boundsRect.Right - 16,
boundsRect.Bottom - 16,
boundsRect.Right,
boundsRect.Bottom );
DrawAnimatedRects( new HandleRef( this, Handle ), IDANI_CAPTION, ref rcFrom, ref rcTo );
Visible = false;
}
private void OnNotifyIconClick(object sender, System.EventArgs e)
{
if ( Visible )
return;
Rectangle boundsRect = Screen.PrimaryScreen.Bounds;
RECT rcTo = RECT.FromRectangle( Bounds );
RECT rcFrom =
RECT.FromLTRB(
boundsRect.Right - 16,
boundsRect.Bottom - 16,
boundsRect.Right,
boundsRect.Bottom );
DrawAnimatedRects( new HandleRef( this, Handle ), IDANI_CAPTION, ref rcFrom, ref rcTo );
Visible = true;
}
private void exit_Click(object sender, System.EventArgs e)
{
exiting = true;
Close();
}
private bool exiting; If you wanted to be really keen, you could try to find out where the task bar actually is, rather than just assuming the bottom of the primary screen as I've done here. See http://vbnet.mvps.org/index.html?code/screen/shappbarmessage.htm[^].
Stability. What an interesting concept. -- Chris Maunder
|
|
|
|
|
Heres a quick question, I think I already know what the answer will be (not possible for XYZ reasons), but there is no harm in asking.
Lets say I have a class that contains alot methods I would like the class to log when each of these methods is called and completes.
Normally I would do this by calling a custom AddToLog(string message) codefunction but i am curious to find out if it is possible for the class to perform this on its own (so that I dont have to swap the code with calls to AddToLog()).
To take this concept one step further would it be possible to autolog each line of code.
In the end you would end up with a log something like this
[DATETIME] - Method1() - IN
[DATETIME] - Method1() - string str1 = "hello"; - Line 134
[DATETIME] - Method1() - str1 = method2(str1); - Line 135
[DATETIME] - Method2() - IN
[DATETIME] - Method2() - return str + " world"; - line 267
[DATETIME] - Method2() - OUT
[DATETIME] - Method1() - MessageBox.Show(str1) - Line 136
[DATETIME] - Method1() - OUT
post.mode = postmodes.signature;
SELECT everything FROM everywhere WHERE something = something_else;
> 1 Row Returned
> 42
|
|
|
|
|
MrEyes wrote:
i am curious to find out if it is possible for the class to perform this on its own
No... The reason for this is the HUGE performance hit this would incur outputting a log entry on every line of code or even just function entry and exit.
I would also not recommend adding the AddToLog thing to everything. Instead, use the Debug class Write methods and Assert. The reason for this is the Debug functions are removed when compiling a Release version of your code, and therefore won't affect the performance of the final .EXE.
RageInTheMachine9532
|
|
|
|