|
If your looking for somthing that will have "math type" formulas... your probably biting off more then you can chew... Math parsing is ... complicated. I believe you can find a simple example app if you search codeProject.
I'd blame it on the Brain farts.. But lets be honest, it really is more like a Methane factory between my ears some days then it is anything else...
|
|
|
|
|
I want to know how can only run a single instance of my application using C# and Win API and bring the application to front if user tried to run another instance?
|
|
|
|
|
|
There's loads of examples of this around - this is the code I use (WinForms) which is adapted from code I found somewhere (can't remember where to give credit )
using System;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Threading;
using System.Windows.Forms;
namespace YourNamespace
{
internal static class SingleInstance
{
#region Fields
private static Form applicationForm = null;
private static string assemblyGuid = null;
private static int message = 0;
private static Mutex mutex = null;
#endregion
#region Properties
private static string AssemblyGuid
{
get
{
if (assemblyGuid == null)
{
object[] attributes = Assembly.GetEntryAssembly().GetCustomAttributes(typeof(GuidAttribute), false);
if (attributes.Length != 0)
assemblyGuid = ((GuidAttribute)attributes[0]).Value;
else
assemblyGuid = string.Empty;
}
return assemblyGuid;
}
}
public static int Message
{
get
{
if (message == 0)
message = NativeMethods.RegisterWindowMessage(String.Format("WM_SHOWFIRSTINSTANCE|{0}", AssemblyGuid));
return message;
}
}
#endregion
#region Methods
public static void Run(Form mainForm)
{
Run(mainForm, false);
}
public static void Run(Form mainForm, bool globalMutex)
{
if (mainForm != null)
{
if (Start(globalMutex))
{
try
{
applicationForm = mainForm;
Application.Run(applicationForm);
}
catch (Exception e)
{
MessageBox.Show(e.Message);
}
Stop();
}
}
}
public static void ShowToFront()
{
if (applicationForm != null)
{
NativeMethods.SetWindowPos(applicationForm.Handle, new IntPtr(-1), 0, 0, 0, 0, NativeMethods.SWP_NOMOVE | NativeMethods.SWP_NOSIZE);
NativeMethods.SetWindowPos(applicationForm.Handle, new IntPtr(-2), 0, 0, 0, 0, NativeMethods.SWP_NOMOVE | NativeMethods.SWP_NOSIZE);
NativeMethods.ShowWindow(applicationForm.Handle, NativeMethods.SW_SHOWNORMAL);
NativeMethods.SetForegroundWindow(applicationForm.Handle);
}
}
private static bool Start()
{
return Start(false);
}
private static bool Start(bool globalMutex)
{
bool createdNew = false;
string name = null;
if (globalMutex)
name = String.Format("Global\\{0}", AssemblyGuid);
else
name = string.Format("Local\\{0}", AssemblyGuid);
Mutex thisMutex = new Mutex(true, name, out createdNew);
if (createdNew)
mutex = thisMutex;
else
NativeMethods.PostMessage(
(IntPtr)NativeMethods.HWND_BROADCAST,
Message,
IntPtr.Zero,
IntPtr.Zero);
return createdNew;
}
private static void Stop()
{
mutex.ReleaseMutex();
}
#endregion
private static class NativeMethods
{
#region Constants
public const int HWND_BROADCAST = 0xffff;
public const int SW_SHOWNORMAL = 1;
public const int SWP_NOSIZE = 0x0001;
public const int SWP_NOMOVE = 0x0002;
#endregion
#region Methods
[DllImport("user32")]
public static extern bool PostMessage(
IntPtr hWnd,
int Msg,
IntPtr wParam,
IntPtr lParam);
[DllImport("user32")]
public static extern int RegisterWindowMessage(
string lpString);
[DllImport("user32.dll")]
public static extern bool SetForegroundWindow(
IntPtr hWnd);
[DllImport("user32.dll")]
public static extern bool SetWindowPos(
IntPtr hWnd,
IntPtr hWndInsertAfter,
int X,
int Y,
int cx,
int cy,
int uFlags);
[DllImport("user32.dll")]
public static extern bool ShowWindow(
IntPtr hWnd,
int nCmdShow);
#endregion
}
}
} A small modification to Program.cs
using System;
using System.Windows.Forms;
namespace YourNamespace
{
internal static class Program
{
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
SingleInstance.Run(new FormMain());
}
}
} Then override WndProc in the main form to receive the message so you can bring it to the front
protected override void WndProc(ref Message message)
{
if (message.Msg == SingleInstance.Message)
SingleInstance.ShowToFront();
base.WndProc(ref message);
}
Dave
BTW, in software, hope and pray is not a viable strategy. (Luc Pattyn) Why are you using VB6? Do you hate yourself? (Christian Graus)
|
|
|
|
|
Good afternoon.
I was wondering if there was a better was to check for duplicate numbers in an array and if it is not in the array, put it in.
This is what I have so far:
int[] numbers = new int[1000];
private bool RndDuplicate(int intRnd)
{
int index = Array.BinarySearch(numbers, 0, numbers.Length, intRnd);
if (index > 0)
{
return true;
}
else
{
for (int i = 0; i < numbers.Length; i++)
{
if (numbers[i].ToString() == "")
{
numbers[i] = intRnd;
break;
}
}
return false;
}
}
Thank you, WHEELS
|
|
|
|
|
Wheels012 wrote: numbers[i].ToString() == ""
This will always be false.
|
|
|
|
|
How do you check for empty spots (elements?) in a one dimensioal array?
WHEELS
|
|
|
|
|
You can't, an array never has empty spots, it just has entries with the default value, which is 0 (zero) for int. But you can't see the difference between a zero that is there because you never put anything in that place and a zero that you put there.
|
|
|
|
|
Go ahead and univote it. That won't change the truth.
|
|
|
|
|
Some people lack the wisdom to recognize the help they are getting...
|
|
|
|
|
Wheels012 wrote: int[] numbers = new int[1000];
where is this magic 1000 coming from? that is bad code.
Wheels012 wrote: numbers[i].ToString() == ""
and which number will ever have a ToString() result of ""?
the normal approach would be based on a HashSet, not an array.
|
|
|
|
|
I am pretty new to C# and don't know what a HashSet is, but I will look it up. Originally I had the array declaration in the method and set as the numbe rof items on a list, but I thought that would clear the array everytime the method was called.
I believe the find is working well, but I need to load the array with a number (index of list) if it is not currently in there.
WHEELS
|
|
|
|
|
the problem with arrays of integers is, you don't have any "empty" positions, the array initially is filled with zeroes, which could also be valid inputs. the solution is to use some "elastic" collection, that grows when things get added (and even shrinks when things get removed again).
Wheels012 wrote: Originally I had the array declaration in the method ... that would clear the array everytime
correct, whatever you use it should be initialized only once.
Wheels012 wrote: I will look it up
good.
you may learn your code could shrink dramatically...
|
|
|
|
|
Luc Pattyn wrote: HashSet
That's what I was going to suggest as well.
|
|
|
|
|
You can try numbers.Contains(intRnd). Hope this helps.
Good luck!
|
|
|
|
|
I believe my find is working alright, but I have to figure out how to load a number in the array if it is not in there.
WHEELS
|
|
|
|
|
I have an idea of how you can solve you're problem, below are the steps:
Objective: What do we know? We know that you are looking for 2 identical numbers always. If there is only 1 number, then add his duplicate.
Solution:
Supose the number we are looking for his duplicate is X, the first number of the array.
1. sort the array
2. ask for the neighbour of the number X, at right!
if duplicate is at right
increment index to the next X number (skip the duplicate we found!)
else
append the number to the array and repeat step 1
3. repeat until the end of the array.
This is the pseudocode of the solution I've taught.
Hope this helps.
Cheer's,
Alex Manolescu.
|
|
|
|
|
You cannot add to an array. You're going to have to use a list. If you don't know the difference between an array and a list, use google.
.45 ACP - because shooting twice is just silly ----- "Why don't you tie a kerosene-soaked rag around your ankles so the ants won't climb up and eat your candy ass..." - Dale Earnhardt, 1997 ----- "The staggering layers of obscenity in your statement make it a work of art on so many levels." - J. Jystad, 2001
|
|
|
|
|
John Simmons / outlaw programmer is right!
If you know the number of elements in you're array, you can create an array of dimension = elements x 2 (for the duplicates).
If you don't know the number of elements then you need to use another data structure, for example: a linked list!
Cheer's,
Alex Manolescu.
|
|
|
|
|
Alex Manolescu wrote: you can create an array of dimension = elements x 2 (for the duplicates).
But you would only do that if you're a retard, or completely new at programming.
Alex Manolescu wrote: If you don't know the number of elements then you need to use another data structure, for example: a linked list!
Just use a List<t> object. It lets you add/remove items, and even sort them. Jeeze!
.45 ACP - because shooting twice is just silly ----- "Why don't you tie a kerosene-soaked rag around your ankles so the ants won't climb up and eat your candy ass..." - Dale Earnhardt, 1997 ----- "The staggering layers of obscenity in your statement make it a work of art on so many levels." - J. Jystad, 2001
|
|
|
|
|
John Simmons / outlaw programmer wrote: Jeeze!
I've just replay my opinion. I've taught I could help to understand better the idea.
No need to involve Jesus here!
Cheer's,
Alex Manolescu.
|
|
|
|
|
Wheels012 wrote: Array.BinarySearch(numbers, 0, numbers.Length, intRnd);
It looks like you're just throwing random numbers (trying to, anyway) onto the end of the array, so how is this supposed to work if numbers is unsorted?
Like others have said, use a List and when adding to it insert items at their proper index to keep it sorted, or use a hash table.
|
|
|
|
|
I would definitely use a List(dynamic array) for what you want.
List<int> numbers = new List<int>();
private bool RndDuplicate(int intRnd)
{
if (numbers.Contains(intRnd))
return true;
else
{
numbers.Add(intRnd);
return false;
}
}
|
|
|
|
|
way too much code, and too slow for large sets.
HashSet set=new HashSet();
private bool RndDuplicate(int intRnd) {return !set.Add(intRnd);}
|
|
|
|
|
Wow nice one!
Thanks!
|
|
|
|