|
Thanks for the info. I didn't know that!
Hogan
|
|
|
|
|
If you install the file in the same folder, or below, as the exe then you can reference it from there.
InstallDir: d:\MyApp
File path: myfile.txt
InstallDir: d:\MyApp\Files
File path: /files/myfile.txt
only two letters away from being an asset
|
|
|
|
|
How about looking at Application.StartupPath, or Path.GetDirectoryName(Assembly.GetExecutingAssembly.Location).
|
|
|
|
|
Hi,
I am a bit surprised by the answers so far.
For starters you cant hard code C: or D: or whatever.
C: does not even have to exist; I have seen systems that boot and run from D:
Second, you cant use CurrentDirectory, as Dave pointed out.
You can not even use it if you store its startup value,
since one may start an app with its CD preset to whatever value one chooses
(try creating a desktop link, and watch its properties).
third, wherever the app (the exe file) is located, you are not guaranteed that
you can write to that folder. Unless your normal use is only reading that file,
you should choose another place.
The easy way out is by using the special folders, as can be found in
the Environment.SpecialFolder enumeration; you will find some that are
user-independent, others are user-specific.
So I suggest reading up on that class.
|
|
|
|
|
Dear All
Regards!
I found what i want on the link
http://www.codeproject.com/useritems/DrawToolsRedux.asp
but i want the above DrawToolsRedux in OpenGl, i mean that for all drawing part using OepnGL instead CSharp Drawing.
so kindly any 1 who convert the above DrawToolsReduc into OpenGl.
Regrds
David
david
|
|
|
|
|
Hi,
I'm working on inter-process communication between a C++ application and a C# application. I want to transfer string data between them. I'm being blocked by a problem: I don't know how to intercept data (sent from my C++ app) in my C# app. I read I can use GetMessage function, but I dont know how. Here is how I send data from my C++ app to my C# one:
LRESULT copyDataResult;
//CWnd *pOtherWnd = CWnd::FindWindow(NULL, m_otherAppHeader.GetBuffer(m_otherAppHeader.GetLength()));
CWnd *pOtherWnd = CWnd::FindWindow(NULL, "EC");
m_otherAppHeader.ReleaseBuffer();
if (pOtherWnd) {
// Say that we fount ExperienceCreator window
AfxMessageBox("ExperienceCreator is opened.");
COPYDATASTRUCT cpd;
cpd.dwData = 0;
CString txt;
c_TxText.GetWindowText(txt);
cpd.cbData = txt.GetLength() + 1 ;
cpd.lpData = (void*)txt.GetBuffer(txt.GetLength() +1);
copyDataResult = pOtherWnd->SendMessage(WM_COPYDATA,
(WPARAM)AfxGetApp()->m_pMainWnd->GetSafeHwnd(),(LPARAM)&cpd);
txt.ReleaseBuffer();
// copyDataResult has value returned by other app
AfxMessageBox("Info has been sent to ExperienceCreator");
} else {
//AfxMessageBox("Unable to find other application.");
AfxMessageBox("Unable to find EC.");
}
Can you please help me for this problem ?
Thanks.
p.f. Goudjo-Ako
Bringing our energy together !
|
|
|
|
|
Just curious why would you want to send a string message between the applications? Sending windows messages would be much more standard way of communicating between applications.
Ben
|
|
|
|
|
You're right. I didn't explain myself correctly.
What I want to do is send string data using windows messages.
Thanks !
p.f. Goudjo-Ako
Bringing our energy together !
|
|
|
|
|
|
Thanks Kubben !
Pat.
p.f. Goudjo-Ako
Bringing our energy together !
|
|
|
|
|
Hello
I've seen your article but I still do not understand How can I intercept a message into one c# application the message will be send from another csharp application using user32.dll API
[DllImport("user32.dll")]
static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, [MarshalAs(UnmanagedType.LPStr)] string lParam);
|
|
|
|
|
First I need to ask why you want to use sendmessage to communicate between to applications. There are better ways of doing this.
Ben
|
|
|
|
|
Hello
Thank for your reply
No particular reason I just need the best way to send string parameter from one running .NET app to another running one
The second should trigger an event when receiving a message
|
|
|
|
|
Well,
If you just want it to trigger an event in the second app, they my article should work ok. Windows message won't allow you to pass a string in. So if the string it self is important you will have to do something different. If the string has certain characters that should cause something to trigger in the second app, you can just check for those in the first app and then send a windows message.
Let me know if the string is important to the second app or not.
Ben
|
|
|
|
|
Hello Kubben
Yes the string is important
APP A (.NET) is running
APP A require a Form from APP B (.NET) To show user "abc"
So I check if APP B is already running
If NO : I launch it using Process.Start("APP B","abc");
If YES : I want to trigger an event for APP B to show user "abc"
|
|
|
|
|
Well,
You can try using FindWindow to get the second app windows handle. Then you should be able to send a string to it.
There are some examples out there.
I found this one:
http://social.msdn.microsoft.com/forums/en-US/vbinterop/thread/62d0c25f-dadb-4b24-9679-f9f75717456c/
Hopefully, that helps.
Ben
|
|
|
|
|
Thank you
I'll let you now
|
|
|
|
|
hi
i want to show the autogenerated delete button in grid view on some selected rows can anybody help me
|
|
|
|
|
If you only want to show a delete button on certain rows of the gridview you should probably create a template button column that has a delete button. Set the visible = false, then you can in the template you can set the visible property based off some info in the datarow that you are displaying in that row.
The code might be something like:
<asp:TemplateField>
<ItemTemplate>
<asp:Button ID="btnDelete" runat="server" CommandName="Delete" Text="Delete" Visible='<%# Convert.ToBoolean(DataBinder.Eval(Container.DataItem,"ShowDelete").ToString() == "Yes") %>' />
</ItemTemplate>
This of course assumes that you have a column called ShowDelete and it will contain Yes when you want to show the delete button. So you would probably have to change that part.
Ben
|
|
|
|
|
Hi,
You can use DataGridView control on a windowform.
1) Select the DataGridView control and right click on it.
2) Select the "Add Column"/"Edit Column" option from from the popup menu to define and modify the column types.
3) In the dialog you can define the column. Also you can set the "ColumnType" property as "DataGridViewButtonColumn" for the column you want to display a Delete Button.
4) Please note that you can make these buttons conditionally in-visible.
Manoj
Never Gives up
|
|
|
|
|
hi
i want to show the autogenerated delete button in grid view on some selected rows can anybody help me
|
|
|
|
|
I want to write an application which deletes SMS(System Management Server) client log files....
Any one here could provide me with a logic to write such application....or to provide me with an example...
Thanks a lot
|
|
|
|
|
Hello everybody!
I'm working on an application which has UserControls (GUI pages) with TabControls on it.
This TabControls are Usercontrols derived from Windows.Forms.TabControl.
Same to TabPage.
The TabPage class has a "Visible" property which removes the TabPage from TabControl.TapPages property, if it's set to false.
This Visible property is refreshed over an userdefined binding mechanism.
This means if I change my page, the Visible property of the TabPages will be refreshed.
On default the SelectedIndex property of the TabControl is set to "0".
Now what's my problem:
I allways had strange visual effects as the TabPages where removed from the Collection.
I saw the different TabPages flickering until all the TabPages where removed.
Thank's to Lutz Roeder's reflector I found out that the framework is forcing the SelectedIndex property after removing the tabpage.
public override void Remove(Control value)
{
base.Remove(value);
if (value is TabPage)
{
int index = this.owner.FindTabPage((TabPage) value);
if (index != -1)
{
this.owner.RemoveTabPage(index);
this.owner.SelectedIndex = Math.Max(index - 1, 0);
}
this.owner.UpdateTabSelection(false);
}
} I now whant to find a solution which prevents the SelectedIndex property to change when removing a TabPage.
What I was thinking of:
As the SelectedIndex property is not virtual I'm not able to override it in my TabControl class.
Maybe I could inherit a TabPageCollection class, for my TabPages property of TabControl class, which overrides the "Remove" method. And after that ????
Thanks for your time.
All the best,
Martin
|
|
|
|
|
hi friends....
I have got a problem regarding loading of multiple assemblies, actually its required for an editor which implements the intellisenseas in vb or dotnet.
for that it is required to load that assembly whose sub-classes are required to be loaded into the list box after pressing dot.
for example in the code given below i have given the path of System.dll assembly file, now all the sub class of System.Data are automatically displayed in list box but if i need to load more than one assmbly i.e 5-6 assemblies how should i do that.
source code
private void readAssembly()
{
this.treeViewItems.Nodes.Clear();
namespaces = new Hashtable();
Type [] assemblyTypes = assembly.GetTypes();
this.treeViewItems.Nodes.Clear();
// Cycle through types
foreach (Type type in assemblyTypes)
{
if ( type.Namespace != null )
{
if ( namespaces.ContainsKey(type.Namespace) )
{
// Already got namespace, add the class to it
TreeNode treeNode = (TreeNode) namespaces[type.Namespace];
treeNode = treeNode.Nodes.Add(type.Name);
this.addMembers(treeNode,type);
if ( type.IsClass )
{
treeNode.Tag = MemberTypes.Custom;
}
}
else
{
// New namespace
TreeNode membersNode = null;
if ( type.Namespace.IndexOf(".") != -1 )
{
// Search for already existing parts of the namespace
nameSpaceNode = null;
foundNode = false;
this.currentPath = "";
searchTree(this.treeViewItems.Nodes,type.Namespace,false);
// No existing namespace found
if ( nameSpaceNode == null )
{
// Add the namespace
string[] parts = type.Namespace.Split('.');
TreeNode treeNode = treeViewItems.Nodes.Add(parts[0]);
string sNamespace = parts[0];
if ( !namespaces.ContainsKey(sNamespace) )
{
namespaces.Add(sNamespace,treeNode);
}
for (int i=1;i < parts.Length;i++)
{
treeNode = treeNode.Nodes.Add(parts[i]);
sNamespace += "." +parts[i];
if ( !namespaces.ContainsKey(sNamespace) )
{
namespaces.Add(sNamespace,treeNode);
}
}
membersNode = treeNode.Nodes.Add(type.Name);
}
else
{
// Existing namespace, add this namespace to it,
// and add the class
string[] parts = type.Namespace.Split('.');
TreeNode newNamespaceNode = null;
if ( !namespaces.ContainsKey(type.Namespace) )
{
newNamespaceNode = nameSpaceNode.Nodes.Add(parts[parts.Length-1]);
namespaces.Add(type.Namespace,newNamespaceNode);
}
else
{
newNamespaceNode = (TreeNode) namespaces[type.Namespace];
}
if ( newNamespaceNode != null )
{
membersNode = newNamespaceNode.Nodes.Add(type.Name);
if ( type.IsClass )
{
membersNode.Tag = MemberTypes.Custom;
}
}
}
}
else
{
// Single root namespace, add to root
membersNode = treeViewItems.Nodes.Add(type.Namespace);
}
// Add all members
if ( membersNode != null )
{
this.addMembers(membersNode,type);
}
}
}
}
}
///
/// Adds all members to the node's children, grabbing the parameters
/// for methods.
///
/// <param name="treeNode" />
/// <param name="type" />
private void addMembers(TreeNode treeNode,System.Type type)
{
// Get all members except methods
MemberInfo[] memberInfo = type.GetMembers();
for (int j=0;j < memberInfo.Length;j++)
{
if ( memberInfo[j].ReflectedType.IsPublic && memberInfo[j].MemberType != MemberTypes.Method )
{
TreeNode node = treeNode.Nodes.Add(memberInfo[j].Name);
node.Tag = memberInfo[j].MemberType;
}
}
// Get all methods
MethodInfo[] methodInfo = type.GetMethods();
for (int j=0;j < methodInfo.Length;j++)
{
TreeNode node = treeNode.Nodes.Add(methodInfo[j].Name);
string parms = "";
ParameterInfo[] parameterInfo = methodInfo[j].GetParameters();
for (int f=0;f < parameterInfo.Length;f++)
{
parms += parameterInfo[f].ParameterType.ToString()+ " " +parameterInfo[f].Name+ ", ";
}
// Knock off remaining ", "
if ( parms.Length > 2 )
{
parms = parms.Substring(0,parms.Length -2);
}
node.Tag = parms;
}
}
///
/// Searches the tree view for a namespace, saving the node. The method
/// stops and returns as soon as the namespace search can't find any
/// more items in its path, unless continueUntilFind is true.
///
/// <param name="treeNodes" />
/// <param name="path" />
/// <param name="continueUntilFind" />
private void searchTree(TreeNodeCollection treeNodes,string path,bool continueUntilFind)
{
if ( this.foundNode )
{
return;
}
string p = "";
int n = 0;
n = path.IndexOf(".");
if ( n != -1)
{
p = path.Substring(0,n);
if ( currentPath != "" )
{
currentPath += "." +p;
}
else
{
currentPath = p;
}
// Knock off the first part
path = path.Remove(0,n+1);
}
else
{
currentPath += "." +path;
}
for (int i=0;i < treeNodes.Count;i++)
{
if ( treeNodes[i].FullPath == currentPath )
{
if ( continueUntilFind )
{
nameSpaceNode = treeNodes[i];
}
nameSpaceNode = treeNodes[i];
// got a dot, continue, or return
this.searchTree(treeNodes[i].Nodes,path,continueUntilFind);
}
else if ( !continueUntilFind )
{
foundNode = true;
return;
}
}
}
///
/// Searches the tree until the given path is found, storing
/// the found node in a member var.
///
/// <param name="path" />
/// <param name="treeNodes" />
private void findNode(string path,TreeNodeCollection treeNodes)
{
for (int i=0;i < treeNodes.Count;i++)
{
if ( treeNodes[i].FullPath == path )
{
this.findNodeResult = treeNodes[i];
break;
}
else if ( treeNodes[i].Nodes.Count > 0 )
{
this.findNode(path,treeNodes[i].Nodes);
}
}
}
///
/// Called when a "." is pressed - the previous word is found,
/// and if matched in the treeview, the members listbox is
/// populated with items from the tree, which are first sorted.
///
/// <returns>Whether an items are found for the word
private bool populateListBox()
{
bool result = false;
string word = this.getLastWord();
//System.Diagnostics.Debug.WriteLine(" - Path: " +word);
if ( word != "" )
{
findNodeResult = null;
findNode(word,this.treeViewItems.Nodes);
if (this.findNodeResult != null )
{
this.listBoxAutoComplete.Items.Clear();
if ( this.findNodeResult.Nodes.Count > 0 )
{
result = true;
// Sort alphabetically (this could be replaced with
// a sortable treeview)
MemberItem[] items = new MemberItem[this.findNodeResult.Nodes.Count];
for (int n=0;n < this.findNodeResult.Nodes.Count;n++)
{
MemberItem memberItem = new MemberItem();
memberItem.DisplayText = this.findNodeResult.Nodes[n].Text;
memberItem.Tag = this.findNodeResult.Nodes[n].Tag;
if ( this.findNodeResult.Nodes[n].Tag != null )
{
System.Diagnostics.Debug.WriteLine(this.findNodeResult.Nodes[n].Tag.GetType().ToString());
}
items[n] = memberItem;
}
Array.Sort(items);
for (int n=0;n < items.Length;n++)
{
int imageindex = 0;
if ( items[n].Tag != null )
{
// Default to method (contains text for parameters)
imageindex = 2;
if ( items[n].Tag is MemberTypes)
{
MemberTypes memberType = (MemberTypes) items[n].Tag;
switch ( memberType )
{
case MemberTypes.Custom:
imageindex = 1;
break;
case MemberTypes.Property:
imageindex = 3;
break;
case MemberTypes.Event:
imageindex = 4;
break;
}
}
}
this.listBoxAutoComplete.Items.Add(new GListBoxItem(items[n].DisplayText,imageindex) );
}
}
}
}
return result;
}
///
/// Autofills the selected item in the member listbox, by
/// taking everything before and after the "." in the richtextbox,
/// and appending the word in the middle.
///
private void selectItem()
{
if ( this.wordMatched )
{
int selstart = this.richTextBox1.SelectionStart;
int prefixend = this.richTextBox1.SelectionStart - typed.Length;
int suffixstart = this.richTextBox1.SelectionStart + typed.Length;
if ( suffixstart >= this.richTextBox1.Text.Length )
{
suffixstart = this.richTextBox1.Text.Length;
}
string prefix = this.richTextBox1.Text.Substring(0,prefixend);
string fill = this.listBoxAutoComplete.SelectedItem.ToString();
string suffix = this.richTextBox1.Text.Substring(suffixstart,this.richTextBox1.Text.Length - suffixstart);
this.richTextBox1.Text = prefix + fill + suffix;
this.richTextBox1.SelectionStart = prefix.Length + fill.Length;
}
}
///
/// Searches backwards from the current caret position, until
/// a space or newline is found.
///
/// <returns>The previous word from the carret position
private string getLastWord()
{
string word = "";
int pos = this.richTextBox1.SelectionStart;
if ( pos > 1 )
{
string tmp = "";
char f = new char();
while ( f != ' ' && f != 10 && pos > 0 )
{
pos--;
tmp = this.richTextBox1.Text.Substring(pos,1);
f = (char) tmp[0];
word += f;
}
char[] ca = word.ToCharArray();
Array.Reverse( ca );
word = new String( ca );
}
return word.Trim();
}
#endregion
private void FormMain_Load(object sender, EventArgs e)
{
readAssembly();
}
}
Raja
|
|
|
|
|
what`s wrong with this?
i got an error.
Error 1 Missing partial modifier on declaration of type 'Chat.chatc'; another partial declaration of this type exists
namespace Chat
{
//public partial class chatc : Form
class chatc
{
private static Form myForm;
static Sys.Sockets.TcpClient myTCP;
[DllImport("kernel32.dll")]
private static extern void ExitProcess(int a);
public static void Main()
{
thanks.
to know everything is to know yourself...
|
|
|
|