|
It's hard to help with a code sample, but here's some code from a quick form I threw together which I hope shows how to do what you want.
using System;<br />
using System.Drawing;<br />
using System.Collections;<br />
using System.ComponentModel;<br />
using System.Windows.Forms;<br />
using System.Data;<br />
<br />
namespace ReferenceAReference<br />
{<br />
public class Form1 : System.Windows.Forms.Form<br />
{<br />
private MyCustomObjectCollection myCustomObjectCollection;<br />
private System.Windows.Forms.Button button1;<br />
private System.Windows.Forms.TextBox textBox1;<br />
<br />
private System.ComponentModel.Container components = null;<br />
<br />
public Form1()<br />
{<br />
InitializeComponent();<br />
this.myCustomObjectCollection = new MyCustomObjectCollection();<br />
<br />
<br />
for(int x=0; x < 3; x++)<br />
{<br />
for(int y=0; y < 7; y++)<br />
{<br />
TextBox tb = new TextBox();<br />
tb.Location = new Point(8 + (x*108), 8 + (y*24));<br />
this.Controls.Add(tb);<br />
this.myCustomObjectCollection.Add(new MyCustomObject(tb, null));<br />
}<br />
}<br />
}<br />
<br />
protected override void Dispose( bool disposing )<br />
{<br />
if( disposing )<br />
{<br />
if (components != null) <br />
{<br />
components.Dispose();<br />
}<br />
}<br />
base.Dispose( disposing );<br />
}<br />
<br />
#region Windows Form Designer generated code<br />
private void InitializeComponent()<br />
{<br />
this.button1 = new System.Windows.Forms.Button();<br />
this.textBox1 = new System.Windows.Forms.TextBox();<br />
this.SuspendLayout();<br />
this.button1.Location = new System.Drawing.Point(112, 240);<br />
this.button1.Name = "button1";<br />
this.button1.Size = new System.Drawing.Size(112, 23);<br />
this.button1.TabIndex = 0;<br />
this.button1.Text = "Fill TextBoxes";<br />
this.button1.Click += new System.EventHandler(this.button1_Click);<br />
this.textBox1.Location = new System.Drawing.Point(8, 240);<br />
this.textBox1.Name = "textBox1";<br />
this.textBox1.TabIndex = 1;<br />
this.textBox1.Text = "Test String";<br />
this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);<br />
this.ClientSize = new System.Drawing.Size(464, 266);<br />
this.Controls.AddRange(new System.Windows.Forms.Control[] {<br />
this.textBox1,<br />
this.button1});<br />
this.Name = "Form1";<br />
this.Text = "Form1";<br />
this.ResumeLayout(false);<br />
<br />
}<br />
#endregion<br />
<br />
[STAThread]<br />
static void Main() <br />
{<br />
Application.Run(new Form1());<br />
}<br />
<br />
private void button1_Click(object sender, System.EventArgs e)<br />
{<br />
foreach(MyCustomObject o in this.myCustomObjectCollection)<br />
{<br />
o.TextBox.Text = this.textBox1.Text;<br />
}<br />
}<br />
}<br />
<br />
public class MyCustomObject<br />
{<br />
private System.Windows.Forms.TextBox textBox;<br />
private object someObject;<br />
<br />
public System.Windows.Forms.TextBox TextBox<br />
{<br />
get { return this.textBox; }<br />
set { this.textBox = value; }<br />
}<br />
<br />
public object SomeObject<br />
{<br />
get { return this.someObject; }<br />
set { this.someObject = value; }<br />
}<br />
<br />
public MyCustomObject(System.Windows.Forms.TextBox textBox, object someObject)<br />
{<br />
this.textBox = textBox;<br />
this.someObject = someObject;<br />
}<br />
}<br />
<br />
<br />
public class MyCustomObjectCollection : CollectionBase<br />
{<br />
public MyCustomObject Add(MyCustomObject value)<br />
{<br />
base.List.Add(value as object);<br />
return value;<br />
}<br />
<br />
public void AddRange(MyCustomObject[] values)<br />
{<br />
foreach(MyCustomObject item in values)<br />
Add(item);<br />
}<br />
<br />
public void Remove(MyCustomObject value)<br />
{<br />
base.List.Remove(value as object);<br />
}<br />
<br />
public void Insert(int index, MyCustomObject value)<br />
{<br />
base.List.Insert(index, value as object);<br />
}<br />
<br />
public bool Contains(MyCustomObject value)<br />
{<br />
foreach(object o in base.List)<br />
if (value.Equals(o))<br />
return true;<br />
return false;<br />
}<br />
<br />
public bool Contains(MyCustomObjectCollection values)<br />
{<br />
foreach(MyCustomObject t in values)<br />
{<br />
if (Contains(t))<br />
return true;<br />
}<br />
<br />
return false;<br />
}<br />
<br />
public MyCustomObject this[int index]<br />
{<br />
get { return (base.List[index] as MyCustomObject); }<br />
set { base.List[index] = value; }<br />
}<br />
<br />
public int IndexOf(MyCustomObject value)<br />
{<br />
return base.List.IndexOf(value);<br />
}<br />
}<br />
}
|
|
|
|
|
Thanks for that. I've compared it against my own code, and yes, they're extremely similar. Have you tried to run yours yet and see if it's making copies instead of references?
Because it doesn't allow me to reference a reference of a textbox and let modifications to the textbox ripple through to the original control!!
It's all very bizarre, and I'm throwing the toys out of my pram right now.
|
|
|
|
|
The code I pasted is a demos the concept, and yes it works here - try copying & pasting it to a new form and give it a try.
|
|
|
|
|
It has been copied to a new form. Sorry, it's not working here.
|
|
|
|
|
If that's the case, I can understand why you're throwing your toys out of the pram right now. Without exagerration, I've coded this exact style of reference literally dozens if not hundreds of times, but notwithstanding this I compiled it and ran it by our beta test team.
It was ran on 27 different beta testing systems, and all of them ran it without fault. The only conclusion I can come to at this stage is that something is frazzled on your system, or if you put this in your existing project, something is frazzled in it.
If you can, try it again on a different system, preferably with a fresh OS & .Net framework install. If it fails get back to me because the fault your seeing could effect literally thousands of our clients and we'd certainly need to get to the bottom of it.
|
|
|
|
|
Mmmmmmmmmm, this is interesting.
My two development machines are .NET framework 1.0. Your code, and my code do not work on it.
Move the same two lots of code onto a machine with .NET 1.1 on it, and hey presto your code works. Mine sadly does not - this however I will put down to duff coding.
But I find it had to believe that there's significant enough difference between the two versions for something as fundamental as this to act differently. My range of machines to test on is limited to these three for the moment. But it's definitely food for thought.
Would you have been running on 1.1 by any chance?
|
|
|
|
|
I originally compiled it on framework 1.0, and the subsequent tests were run on 1.0, 1.0 SP1, 1.0 SP2 and 1.1, with varying OS's. I have just now compiled it on framework 1.1, and it works fine on my dev machines (I didn't send it out for beta testing again).
Just to be clear, what should be happening is that any text located in textBox1 should be copied to each TexBox in the collection when button1 is clicked.
Like I noted previously, I have coded far deeper references than this that are in production systems, without problems.
Maybe there's a problem with the way your system/s are compiling the code? I know that's a bizarre scenario, but this is a bizarre behavior!
I you like, I can send you a compliled version for testing, just send me an email address to use.
|
|
|
|
|
You say you're updating text in a TextBox? Is this happening in a separate thread? In any case, you should invoke Control.Refresh() or Control.Update() on the control to get the value to be repainted, expecially if changing the text in a separate thread (since UI changes are supposed to be done in the main UI thread and not doing so results in "onforeseen" errors.
Have you actually stepped through this in the debugger and made sure that the changes are correct, assuring that the references are equal? You could also use Object.Equals() on the two references to see if the references are equal (instead of if the objects are equal).
-----BEGIN GEEK CODE BLOCK-----
Version: 3.21
GCS/G/MU d- s: a- C++++ UL@ P++(+++) L+(--) E--- W+++ N++ o+ K? w++++ O- M(+) V? PS-- PE Y++ PGP++ t++@ 5 X+++ R+@ tv+ b(-)>b++ DI++++ D+ G e++>+++ h---* r+++ y+++
-----END GEEK CODE BLOCK-----
|
|
|
|
|
It's all happening in the same thread, yes the debugger shows copies are made when added into the collection, 'no' I don't know what's going on, 'yes' I'm throwing my toys out of the pram.
All I want to do, is bind textbox's to member variables in a class. And I just want the member variables updated each time the controls .text property is changed - preferably via an event.
It's sounds simple enough - but I can't manage it.
|
|
|
|
|
What collection class are you using? I do this quite a bit in our application using provided classes and custom classes and have never had problems. So long as I add the TextBox object's reference to the collection itself, it's no big deal.
Are you by change passing a reference to the string in TextBox.Text ?
Also, what you're describing is property data-binding. You can bind properties of objects to properties of other objects, or even to collections of objects (happens a lot in ASP.NET). You could use textBox1.DataBindings.Add("Text", this, "Text") .
If the Text property of your control is supposed to modify the TextBox 's Text property, why not just do this?
public class MyControl : UserControl
private TextBox textBox1;
public string Text
{
get { return this.textBox1.Text; }
set { this.textBox1.Text = value; }
}
}
...although maybe I'm not understanding you right.
-----BEGIN GEEK CODE BLOCK-----
Version: 3.21
GCS/G/MU d- s: a- C++++ UL@ P++(+++) L+(--) E--- W+++ N++ o+ K? w++++ O- M(+) V? PS-- PE Y++ PGP++ t++@ 5 X+++ R+@ tv+ b(-)>b++ DI++++ D+ G e++>+++ h---* r+++ y+++
-----END GEEK CODE BLOCK-----
|
|
|
|
|
Is it possible to obtain a system-wide cursor status? I've tried using Cursor.current.tostring() but it only returns the status of the cursor within the application running. This means that if the cursor status is updated OUTSIDE of the application, the status is not updated at all.
|
|
|
|
|
That's how things are. I found this out a while back while using GetCursor() in Win32. There might be an easy way around this, but I don't know of one.
"Blessed are the peacemakers, for they shall be called sons of God." - Jesus
"You must be the change you wish to see in the world." - Mahatma Gandhi
|
|
|
|
|
After some extensive digging, i found out that to get the cursor "image" or icon, we need to use GetCursorInfo() but i don't know how to write the codes (particularly the dllimport part) and get it working in C#. Does anyone have any ideas?
|
|
|
|
|
//----------------------------------------------------------------------------
// 4.2 How to Implement Functors
// abstract base class
class TFunctor
{
public:
// two possible functions to call member function. virtual cause derived
// classes will use a pointer to an object and a pointer to a member function
// to make the function call
virtual void operator()(const char* string)=0; // call using operator
virtual void Call(const char* string)=0; // call using function
};
// derived template class
template <class tclass=""> class TSpecificFunctor : public TFunctor {
private:
void (TClass::*fpt)(const char*); // pointer to member function
TClass* pt2Object; // pointer to object
public:
// constructor - takes pointer to an object and pointer to a member and stores
// them in two private variables
TSpecificFunctor(TClass* _pt2Object, void(TClass::*_fpt)(const char*))
{ pt2Object = _pt2Object; fpt=_fpt; };
// override operator "()"
virtual void operator()(const char* string)
{ (*pt2Object.*fpt)(string);}; // execute member function
// override function "Call"
virtual void Call(const char* string)
{ (*pt2Object.*fpt)(string);}; // execute member function
};
//----------------------------------------------------------------------------
// 4.3 Example of How to Use Functors
// dummy class A
class TClassA{
public:
TClassA(){};
void Display(const char* text) { cout << text << endl; };
/* more of TClassA */
};
// dummy class B
class TClassB{
public:
TClassB(){};
void Display(const char* text) { cout << text << endl; };
/* more of TClassB */
};
// main program
int main(int argc, char* argv[])
{
// 1. instantiate objects of TClassA and TClassB
TClassA objA;
TClassB objB;
// 2. instantiate TSpecificFunctor objects ...
// a ) functor which encapsulates pointer to object and to member of TClassA
TSpecificFunctor<tclassa> specFuncA(&objA, TClassA::Display);
// b) functor which encapsulates pointer to object and to member of TClassB
TSpecificFunctor<tclassb> specFuncB(&objB, &TClassB::Display);
// 3. create array with pointers to TFunctor, the base class and ...
TFunctor** vTable = new TFunctor*[2];
// ... assign functor addresses to the function pointer array
vTable[0] = &specFuncA;
vTable[1] = &specFuncB;
// 4. use array to call member functions without the need of an object
vTable[0]->Call("TClassA::Display called!"); // via function "Call"
(*vTable[1]) ("TClassB::Display called!"); // via operator "()"
// 5. release
delete[] vTable;
// hit enter to terminate
cout << endl << "Hit Enter to terminate!" << endl;
cin.get();
return 0;
}
Can you tell me the underlined sentences' meaning?
Thank you!
|
|
|
|
|
|
The problems are:
1.virtual void operator()(const char* string)=0; // call using operator
2.template class TSpecificFunctor : public TFunctor
//TFunctor is a class
3.TSpecificFunctor specFuncA(&objA, TClassA::Display);
4.TFunctor** vTable = new TFunctor*[2];
Can you tell me their meaning?
Thank you again
The following codes you can refer:
// This code was compiled and tested with Borland C++ Builder 5.0. Let me know
// if there is something I should mention for the use with other compilers.
#pragma hdrstop // Borland C++ Builder specific
#pragma argsused // do.
#include // due to: cout
// abstract base class
class TFunctor
{
public:
// two possible functions to call member function. virtual cause derived
// classes will use a pointer to an object and a pointer to a member function
// to make the function call
virtual void operator()(const char* string)=0; // call using operator
virtual void Call(const char* string)=0; // call using function
};
// derived template class
template class TSpecificFunctor : public TFunctor
{
private:
void (TClass::*fpt)(const char*); // pointer to member function
TClass* pt2Object; // pointer to object
public:
// constructor - takes pointer to an object and pointer to a member and stores
// them in two private variables
TSpecificFunctor(TClass* _pt2Object, void(TClass::*_fpt)(const char*))
{ pt2Object = _pt2Object; fpt=_fpt; };
// override operator "()"
virtual void operator()(const char* string)
{ (*pt2Object.*fpt)(string);}; // execute member function
// override function "Call"
virtual void Call(const char* string)
{ (*pt2Object.*fpt)(string);}; // execute member function
};
//-----------------------------------------------------------------------------------------
// 4.3 Example of How to Use Functors
// dummy class A
class TClassA{
public:
TClassA(){};
void Display(const char* text) { cout << text << endl; };
/* more of TClassA */
};
// dummy class B
class TClassB{
public:
TClassB(){};
void Display(const char* text) { cout << text << endl; };
/* more of TClassB */
};
// main program
int main(int argc, char* argv[])
{
// 1. instantiate objects of TClassA and TClassB
TClassA objA;
TClassB objB;
// 2. instantiate TSpecificFunctor objects ...
// a ) functor which encapsulates pointer to object and to member of TClassA
TSpecificFunctor specFuncA(&objA, TClassA::Display);
// b) functor which encapsulates pointer to object and to member of TClassB
TSpecificFunctor specFuncB(&objB, &TClassB::Display);
// 3. create array with pointers to TFunctor, the base class and ...
TFunctor** vTable = new TFunctor*[2];
// ... assign functor addresses to the function pointer array
vTable[0] = &specFuncA;
vTable[1] = &specFuncB;
// 4. use array to call member functions without the need of an object
vTable[0]->Call("TClassA::Display called!"); // via function "Call"
(*vTable[1]) ("TClassB::Display called!"); // via operator "()"
// 5. release
delete[] vTable;
// hit enter to terminate
cout << endl << "Hit Enter to terminate!" << endl;
cin.get();
return 0;
}
|
|
|
|
|
Aleon666 wrote:
virtual void operator()(const char* string)=0; // call using operator
This is an abstract virtual function. The class containing an abstract virtual function cannot be instantiated, and is intended to be a base class.
Aleon666 wrote:
template class TSpecificFunctor : public TFunctor
I guess this should look like this:
template<class TClass> class TSpecificFunctor : public TFunctor
This is a declaration of a template class. I think you better read on templates in MSDN.
Aleon666 wrote:
TSpecificFunctor specFuncA(&objA, TClassA::Display);
I again guess it should be:
TSpecificFunctor<TClassA> specFuncA(&objA, TClassA::Display);
This line creates an instance of TSpecificFunctor object, passing TClassA as a template argument, and (&objA, TClassA::Display) as constructor arguments.
Aleon666 wrote:
TFunctor** vTable = new TFunctor*[2];
This creates an array which contains two pointers to TFunctor objects. This array is then initialized with two created functors: specFuncA and specFuncB .
HTH
Alexandre Kojevnikov
MCAD charter member
Leuven, Belgium
|
|
|
|
|
|
Hi! Is it possible for a method to return a struct? like:
Thanks!
If not, how do i make a method return data with multiple data types?
Thanks again!
"To teach is to learn twice"
|
|
|
|
|
daljv wrote:
Is it possible for a method to return a struct?
Yes
struct Data
{
int i;
string bar;
}
public Data DoStuff()
{
Data d = new Data();
d.i = 1;
d.bar = "Hello";
return d;
} Something like that will work
James
"I despise the city and much prefer being where a traffic jam means a line-up at McDonald's"
Me when telling a friend why I wouldn't want to live with him
|
|
|
|
|
You beat me to it by a minute
*goes back to work*
|
|
|
|
|
But yours will compile
James
"I despise the city and much prefer being where a traffic jam means a line-up at McDonald's"
Me when telling a friend why I wouldn't want to live with him
|
|
|
|
|
hehehe..
|
|
|
|
|
While your example struct seems to be missing, the answer is yes. A method can return void or any object you want it to - naturally this includes your own structs and classes.
In this example I'll create a struct to hold an error message (MyError) and use MyMethod to return it:
public struct MyError<br />
{<br />
public bool HasErrors;<br />
public string ErrorMessage;<br />
<br />
public MyError(bool hasErrors, string errorMessage)<br />
{<br />
HasErrors = hasErrors;<br />
ErrorMessage = errorMessage;<br />
}<br />
}
and now a method that returns it:
public class MyClass<br />
{<br />
public MyError CheckForErrors(bool someCondition)<br />
{<br />
if(!someCondition)<br />
{<br />
return new MyError(true, "Errors ocurred");<br />
}<br />
else<br />
{<br />
return new MyError(false, "She's Apples Mate");<br />
}<br />
}<br />
}
|
|
|
|
|
lol, leave it to me to forget the important things, like visibility modifiers
James
"I despise the city and much prefer being where a traffic jam means a line-up at McDonald's"
Me when telling a friend why I wouldn't want to live with him
|
|
|
|