|
The answer is no because the the object does not have any knowledge of who holds a reference to it.
There may, however, be a way around it using weak references. The problem with that solution is that the point at which the references become null is non-deterministic.
You could also implement IDisposable and Dispose of the internals of the object when you don't need it. However, anything accessing the object would have to be able to handle the fact that the object may exist, but it has already been disposed of.
The above work arounds do not take into account the overall big picture. It would be better to know what it is you are trying to achieve. That way we could probably suggest a better solution.
|
|
|
|
|
Hi,
an object can not set itself to null.
an object is a piece of code+data, and what you use to access an object
really is a reference (often also called object, but that is not strictly correct).
Now an object cannot access its reference(s) in general, since an object is
not aware of its references.
In special cases you can do something, but that requires you get access to the
reference, typically by using the ref keyword, as in:
Nullable A=new Nullable();
a.NullifyMyRef(ref a);
a.Something();
class Nullable {
public void NullifyMyRef(object ref obj) {
obj=null;
}
}
But what is the use of all this ???
Most scenarios I can come up with are a result of bad OO practices.
The one good use I could come up with is something like the Dispose() method
that may want to nullify its own reference; the fact that it does not proves
to me once more it can not be done.
|
|
|
|
|
Matglas wrote: I need to have a object set itself to null. Is this in any way possible?
If you mean what I think you mean then the answer is no.
Do you mean something like this:
MyObject obj = new MyObject();
...
obj.DoSomeOperationThatSetsObjToNull();
Assert.IsNull(obj);
The answer is no because the the object does not have any knowledge of who holds a reference to it.
There may, however, be a way around it using weak references. The problem with that solution is that the point at which the references become null is non-deterministic.
You could also implement IDisposable and Dispose of the internals of the object when you don't need it. However, anything accessing the object would have to be able to handle the fact that the object may exist, but it has already been disposed of.
The above work arounds do not take into account the overall big picture. It would be better to know what it is you are trying to achieve. That way we could probably suggest a better solution.
|
|
|
|
|
Ok I hope my english is good enough to explain what I want to achieve.
I have a deserialized object from a xml file. This object is shown in a treeview to edit the content. I want to have the option to remove a object by clicking on it and getting it context menu. This context menu is unique for every object. I get it by a GetContextmenu method that is implementated by a Interface. The eventhandlers for each menuitem is set to a method in that object.
I hope the situation is clear. Otherwise i have to make some code to show it.
|
|
|
|
|
I think what you need is a ToParent reference for each object, and to have the parent set the specific child to null.
--
CleaKO The sad part about this instance is that none of the users ever said anything [about the problem].
Pete O`Hanlon Doesn't that just tell you everything you need to know about users?
|
|
|
|
|
I already thought so but did not directly find a way to set the parent on Deserialization. Or I have to Recursivly go through every object.
|
|
|
|
|
This is the object situation. I copyed some code, to show you. The DeletePage() needs to delete the page from the Pages property in the Document .
public class Document : ITreeView
{
public Document() { }
private PageCollection _pages = new PageCollection();
[XmlElement(ElementName = "page")]
public PageCollection Pages
{
get { return _pages; }
set { _pages = value; }
}
#region public methods
public Document Deserialize(string file)
{
}
public void Serialize(string file, Document doc)
{
}
#endregion
#region ITreeView Members
public ContextMenu GetContextMenu()
{
ContextMenu docContext = new ContextMenu();
return docContext;
}
public ObjectTreeNode GetTreeNode()
{
return new ObjectTreeNode(this, "document", 0, 0);
}
#endregion
}
public class Page : ITreeView
{
public Page() { }
#region properties
#endregion
#region ITreeView Members
public ObjectTreeNode GetTreeNode()
{
return new ObjectTreeNode(this, "page " + _pagenumber, 0, 0);
}
public System.Windows.Forms.ContextMenu GetContextMenu()
{
ContextMenu pageContext = new ContextMenu();
MenuItem delItem = new MenuItem("Delete", new EventHandler(DeletePage));
pageContext.MenuItems.Add(delItem);
return pageContext;
}
public void DeletePage(object sender, EventArgs e)
{
}
#endregion
}
|
|
|
|
|
hi,
I am having a richtextbox and in the menu item got Undo option.
the code is
UndoMenuitem()
{
if(Richtextbox1.canundo)
{
Richtextbox1.undo();
}
}
this code is undoing the all actions at a single click.
Instead of chracter by chracter.
Pls help me
With regards
prasad
|
|
|
|
|
You can't override the Undo operation on the RTB to do this. What you would have to do is roll your own Undo/Redo mechanism and use that.
Deja View - the feeling that you've seen this post before.
|
|
|
|
|
Hello,
I am new to C# threading and I am having problems accomplishing a task. To give a quick overview as to what I am trying to do: I have many user controls on a single form that each present different data. This is a small utility that displays the status of different applications and systems. Each user control, as of now, has two threads. 1 thread will update the data source and the other thread will update the user interface.
My problem is that I do not wish to lock the Form while one user control tries to update itself. I have tried two approaches.
1.) I called lock(myDataTable) and performed all updates to the datatable before the thread is called to update the user interface. This did not work until I changed my code to lock(this). I was getting threading errors where the datatable was only about 1/2 populated. When I switched over to lock(this), my gui started locking again on an update.
2.) Thread the threads (god help me). I have two methods: updateData and updateGui. I made a wrapper method called refreshAll that would create a new thread job on updateData, sleep until it was finished, and then make another threaded call to updateGui. When my timer tick event fired I would make a threaded call to refreshAll. Big surprise on this giving me weird gui hang-ups.
Sorry if this is confusing. I will re-iterate on areas if I was not clear. Any help / approaches would be much appreciated. Thanks!
|
|
|
|
|
Hello,
Have you invoked the method which refreshes the GUI?
All the best,
Martin
|
|
|
|
|
Yes:
private delegate void displayCallback();
private void display()
{
if (InvokeRequired)
{
BeginInvoke(new displayCallback(display));
return;
}
....
}
|
|
|
|
|
ATCsharp wrote: I have many user controls on a single form that each present different data. This is a small utility that displays the status of different applications and systems. Each user control, as of now, has two threads. 1 thread will update the data source and the other thread will update the user interface.
What causes an update? You have a data source that's being updated as well as a user interface, so where does the update come from?
If the updates take awhile, can you represent the progress of the update to the user (probably using a progress bar) so that the app doesn't appear stuck?
More info is needed.
|
|
|
|
|
Hi all,
i am writing an application to communicate between local and remote machine using STAF tool.
I can have a one way communcation but i want to have a both way communication. Like local machine abc.exe runs def.exe over remote machine and then remote machine goes back to local machine to ask what task to perform and then local exe says calc.exe to run and remote machine performs that.
So below is the psueudo code to achieve this but could any one help me out in converting this to C#.NET. i tried this out but i am getting exception at the moment. So here is the psuedo code
abc.exe (started by machineA)
-- STAFHandle::create("ABCApp", handle);
-- handle->submit("machineB", "PROCESS", "START COMMAND def.exe");
-- handle->submit("local", "QUEUE", "GET WAIT");
---- when the "ReadyForInput" message is received from DEFApp,
----- handle->submit("machineB", "QUEUE", "QUEUE NAME DEFApp MESSAGE Start:Calc");
---- when the "Finished" message is received from DEFApp, continue to next executable to run and queue another message to DEFApp, etc...
def.exe (started, by abc.exe, on machineB)
-- STAFHandle::create("DEFApp", handle);
-- handle->submit("machineA", "QUEUE", "QUEUE NAME ABCApp MESSAGE ReadyForInput");
-- handle->submit("lcoal", "QUEUE", "GET WAIT");
--- when the "Start" message is received from ABCApp, parse the program to run (Calc)
---- handle->submit("local", "PROCESS", "START COMMAND Calc.exe");
---- when Calc.exe completes,
----- handle->submit("machineA", "QUEUE", "QUEUE NAME ABCApp MESSAGE Finished:Calc");
//submit function is already created with parameters which submits the command to local or remote machine.
Thanks a lot.
SS
-- modified at 8:05 Monday 16th April, 2007
|
|
|
|
|
Software_Specialist wrote: i tried this out but i am getting exception at the moment.
Show us the code you got so far and tell us what exception you're getting.
It's quite hopeless to wait for someone turning your pseudo-code into running C# code. This is a forum for helping others with their problems and not doing their whole work.
"Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the Universe trying to produce bigger and better idiots. So far, the Universe is winning." - Rick Cook www.troschuetz.de
|
|
|
|
|
ok this is what i did,
ABC.EXE LOCAL MACHINE
here local machine is machine A and remote machine is machine B
static void main()
{
STAFHandle handle = new STAFHandle("MyProgram");
handle.submit("machine B", "process", "start command C:\\def.exe");
handle.submit("<machine a="">", "QUEUE", "GET WAIT");
handle.submit("machine B", "QUEUE", "Queue NAME YourProgram MESSAGE Start:calc");
}
DEF.EXE REMOTE MACHINE
here local machine is machine A and remote machine is B
static void main()
{
STAFHandle handle = new STAFHandle("YourProgram");
handle.submit("<machine a="">", "QUEUE", "QUEUE NAME MyProg MESSAGE ReadyForInput");
handle.submit("<machine b="">", "QUEUE", "GET WAIT");
handle.submit("machine B", "PROCESS", "START COMMAND Calc.exe");
handle.submit("machineA", "QUEUE", "QUEUE NAME MyProgram MESSAGE Finished:Calc");
}
so when i step over abc.exe, the moment it execute
handle.submit("machine B", "process", "start command C:\\def.exe");
i get error over remote system that def.exe has encountered a problem and needs to be closed.
SO any idea how to solve this and process, queue are services already defined in STAF
Thanks
|
|
|
|
|
Better to try convertors available free to download, But doest guarantees the bug free code.
Hello Forum
Always be in touch to help about the topic ASP.NET
|
|
|
|
|
Not a good idea as its only a small piece of psuedo code. And i guess to convert you need a running applciation.
Anyway Thanks
SS
|
|
|
|
|
Hi,
I would like to write a .Net Assembly that should run as a scheduled
task in windows. I dont need any user interface. What kind of project I need to create in Visual Studio for this solution? Please help and also any samples would be helpful too.
Thanks in adv.
|
|
|
|
|
You probably want to create a window service. A windows service will run even when no one is logged into the computer, which is often desired when you have scheduled tasks. You do have to run the installutil to install a .net windows service, so that can be a little complicated. You also need a login and password for the service to run as.
I wrote an article that has a windows service in the sample code.
http://www.codeproject.com/dotnet/OpenFiles.asp[^]
It isn't a scheduler windows service it just checks things on a timer, still it can give you an idea what what a windows service looks like.
Usually you need to add a timer control to the windows service to get a scheduler to work anyway. If you know what time you want the schedule task to run you se the timers elapse time to be the correct amount of milli seconds before the event should run. Then the timers elapsed method will fire. Once that method is over at the end you should re-set the elapsetime to the proper amount of time before it should run again.
Well, I hope that helps.
Ben
|
|
|
|
|
hello folks
i'm trying to create a class diagram,in VS 2005 but the option to add Class Diagram from Add New Item is missing. how can i add a class diagram template into my project??
reply soon
awaiting all replies
Sair
|
|
|
|
|
hello saira, well according to me the class diagram about which u r asking is not added by going to Add item.
But Try this one hope this helps you.
Right click to ur project name in solution explorer and than there comes an option "View Clss Diagram" clik it, u will get what u r looking for.
reply
Hello Forum
Always be in touch to help about the topic ASP.NET
|
|
|
|
|
thanks fo the reply sulabh, but i don't get that option either.
Any other suggestion???
can i include this option from some hidden source maybe??
|
|
|
|
|
Hi saira, first off all tell me what application u r using in vs2005.
Actually i m working over same platform in windows application.
reply
Hello Forum
Always be in touch to help about the topic ASP.NET
|
|
|
|
|
i'm working in C# on a window based application.
|
|
|
|
|