|
Hi Jason,
I doubt the first parameter is an output parameter.
To me LPVOID is the same as "void* ", i.e. pointer to something however I will not tell you what.
So it expects the address of an existing buffer, which is quite good actually, that way you can have the managed world allocate a buffer, pass it to the native camera code to get it filled, then use its content in the managed world.
There are basically two ways to allocate a buffer and pass its address:
1. using the fixed keyword
2. using the GCHandle class (get a handle, get a pointer, use, release)
1. is easier, 2. has more functionality (which one would need if the pointer needs to remain valid after the native function returns, e.g. when doing asynchronous stuff).
So I suggest you read up on "fixed" and drop the "out" from your native function's prototype.
Luc Pattyn [Forum Guidelines] [My Articles]
- before you ask a question here, search CodeProject, then Google
- the quality and detail of your question reflects on the effectiveness of the help you are likely to get
- use the code block button (PRE tags) to preserve formatting when showing multi-line code snippets
modified on Saturday, March 14, 2009 12:44 PM
|
|
|
|
|
So...
[DllImport( "DCamLIB.dll" )]
private unsafe static extern bool DcamCapture( int* imageBuffer, Int32 bufferSize );
public unsafe void Capture( Int32 bufferSize )
{
fixed ( int* ImageBuffer = new int[ bufferSize ] )
{
if ( !DcamCaptureReverseX( ImageBuffer, bufferSize ) )
{
throw new DCamLIBException( this );
}
}
}
If I needed to save the image to disk I would need to do so inside the fixed statement?
I need to do this so the garbage collector is not relocating a movable variable? The variable is essentially "pinned" during the fixed statement?
|
|
|
|
|
Hi,
1.
yes "fixed" is one way to pin down something, for as long as you are inside its code block.
2.
it is strange to see a Capture() method without any outputs. You should either provide a "string filename" parameter if you want it to save to disk, or return something "... int[] Capture(...)" if you want your app to work on it.
I would suggest something along these lines (note the use of "code block" button resulting in PRE tags which gives a monospaced font and preserves formatting):
public unsafe int[] Capture( Int32 bufferSize ) {
int[] buf = new int[ bufferSize ];
fixed ( int* ImageBuffer = buf ) {
if ( !DcamCaptureReverseX( ImageBuffer, bufferSize ) ) throw new DCamLIBException( this );
}
return buf;
}
3.
Once the native world is done with your buffer, it does not need the pinning; and the managed code can operate on it without restrictions, e.g. save it to disk.
4.
remarks:
- it is unusual, and probably not so good, to have exceptions without a string argument, passing some message in.
- there would be no need to zero out the buffer, managed arrays are always zero-filled automatically upon creation; the CLR designers have chosen to do so, in order to eliminate random behavior when you forget to fill it up and start using whatever happens to be there.
5.
are you sure int[] is right? that indicates 32 bit per pixel; would be fine for color images, and probably overkill (and memory waste) for grayscale. Some native C/C++ systems have 16-bit int, in managed languages int is 32-bit.
Luc Pattyn [Forum Guidelines] [My Articles]
- before you ask a question here, search CodeProject, then Google
- the quality and detail of your question reflects on the effectiveness of the help you are likely to get
- use the code block button (PRE tags) to preserve formatting when showing multi-line code snippets
|
|
|
|
|
[DllImport( "DCamLIB.dll" )]
private unsafe static extern bool DcamCapture( int* imageBuffer, Int32 bufferSize );
public unsafe void CaptureReverseX( Int32 bufferSize )
{
fixed ( int* buf = new int[ bufferSize ] )
{
if ( !DcamCapture( buf, bufferSize ) )
{
throw new DCamLIBException( this );
}
}
}
I am consuming an existing unmanaged 3rd party dll. I have the doc on it, I have all other functions implemented and working except for this one.
The following is the complete example code:
void CC9266SmpDlg::OnBtnCapture()
{
DWORD dwRetStatus = DCAM_WAITSTATUS_UNCOMPLETED;
WORD* pDataBuff = NULL;
int nWidth, nHeight, nImageSize;
nWidth = nHeight = nImageSize = 0;
DcamInitialize();
DcamOpen();
DcamSetDriveMode( DCAM_CCDDRVMODE_OPERATION, 3000 );
DcamSetGain( 1 );
DcamSetOffset( 10 );
DcamSetBinning( DCAM_BINNING_1X1 );
DcamSetCCDType( DCAM_CCD_TYPE0 );
DcamSetTriggerPolarity( DCAM_TRIGPOL_NEGATIVE );
DcamSetTriggerMode( DCAM_TRIGMODE_EXT_LEVEL1 );
DcamGetImageSize( &nWidth, &nHeight );
nImageSize = nWidth * nHeight;
pDataBuff = new WORD[ nImageSize ];
if( pDataBuff != NULL )
{
memset( pDataBuff, '\0', nImageSize );
DcamCaptureReverseX( pDataBuff, nImageSize * 2 );
while( TRUE )
{
DcamWait( &dwRetStatus, 0 );
if( dwRetStatus == DCAM_WAITSTATUS_COMPLETED )
{
break;
}
}
}
else
{
DcamClose();
DcamUninitialize();
return ;
}
DcamImgTiffSave( "c9266.tif", pDataBuff, nWidth, nHeight, 16, 12 );
delete [] pDataBuff;
DcamStop();
DcamClose();
DcamUninitialize();
}
|
|
|
|
|
Hi Jason,
The C demo code is interesting, here are some facts:
1. the image buffer needs to be allocated by the caller of the library, we got that right.
2. DcamGetImageSize is used to obtain the image sizes in pixels, and nImageSize is counting pixels, not bytes.
3. the demo code shows a big wait loop polling with DcamWait, so DcamCaptureReverseX is only starting the image capture, not waiting for it to get integrated, scanned, converted and presented in the array, hence the buffer is still untouched at that point in time.
and one strong suspicion:
1. Not sure what the second parameter of DcamCaptureReverseX is meant to be, they have 2*nImageSize, so that probably means size of the buffer in bytes, where each pixel takes 2 bytes (that fits the fact they have a WORD array, WORD=16-bit; however it is in contradiction with the memset where they clear only one byte per pixel); and your C# code does not match up, since you don't have the 2* at all.
my suggestions:
1. I would switch from int pixels to ushort pixels, allowing for 16-bit unsigned values. I now think your camera is a grayscale CCD with at best 16 bits of resolution. If less than 16 bits, the unsigned wouldn't matter at all. Don't forget the factor 2 in the DcamCaptureReverseX call.
2. you need to include a wait scheme; it needs to be inside the fixed block, since the buffer should not be unpinned for as long as the library is using it or going to use it.
Luc Pattyn [Forum Guidelines] [My Articles]
- before you ask a question here, search CodeProject, then Google
- the quality and detail of your question reflects on the effectiveness of the help you are likely to get
- use the code block button (PRE tags) to preserve formatting when showing multi-line code snippets
|
|
|
|
|
I got it working, needed to change a setting - set the trigger mode to internal. Using fixed worked great.
Thank you!
|
|
|
|
|
Well done.
BTW: I did not get an email notification this time, because you replied to one of your own messages...
Luc Pattyn [Forum Guidelines] [My Articles]
- before you ask a question here, search CodeProject, then Google
- the quality and detail of your question reflects on the effectiveness of the help you are likely to get
- use the code block button (PRE tags) to preserve formatting when showing multi-line code snippets
|
|
|
|
|
I forgot the example C code:
int nImageSize = nWidth * nHeight;
WORD* pDataBuff = new WORD[ nImageSize ];
if( pDataBuff != NULL )
{
memset( pDataBuff, '\0', nImageSize );
// Acquire the image data
DcamCapture( pDataBuff, nImageSize * 2 );
}
|
|
|
|
|
I don't know why all the LinkButton in my C#.net website cann't work,
It means that if i clicked the button just like i have nothing to do with it.
Can someone help me?waiting online
the browser has not any problem.
modified on Saturday, March 14, 2009 12:09 PM
|
|
|
|
|
what browser you're using...? BTW you should ask this in asp forum
TVMU^P[[IGIOQHG^JSH`A#@`RFJ\c^JPL>;"[,*/|+&WLEZGc`AFXc!L
%^]*IRXD#@GKCQ`R\^SF_WcHbORY87֦ʻ6ϣN8ȤBcRAV\Z^&SU~%CSWQ@#2
W_AD`EPABIKRDFVS)EVLQK)JKSQXUFYK[M`UKs*$GwU#(QDXBER@CBN%
Rs0~53%eYrd8mt^7Z6]iTF+(EWfJ9zaK-iTV.C\y<pjxsg-b$f4ia>
--------------------------------------------------------
128 bit encrypted signature, crack if you can
|
|
|
|
|
Hi!
Have you tried setting AutoPOstBAck property
Thanks!
Develop2Program & Program2Develop
|
|
|
|
|
I want to execute a CLASS in C#.NET 2.0 Console Application
I don't want to use Main() in the Program
How to Achive this I try the following code but it won't works
using System;
class StaticTest
{
static StaticTest()
{
Console.WriteLine("Hello!");
}
}
I know that there MUST be SOME WAY by which we can CREATE such a CLASS in C#.NET 2.0
BUT I don't Understand that HOW????????????????
THANKS in ADVANCE .....
With due respect to all those who replied me.
SIR I am not asking about creating Library or I don't want to make the object of this class at any other class Inside Main(),Simply I don't wanna use Main().
Actually this is not just a question its a Challange for me I am Searching over it and I hope that I will definately Found Some Satisfactory answer
If you could Help me than Please Help Me.
Bcoz I simply belive that-
"A TRUE Programmer can Code whatever he THINKS there is Nothing impossible for a TRUE Programmer"
modified on Saturday, March 14, 2009 2:58 PM
|
|
|
|
|
You MUST have at least one Main method in your application to act as an entry point.
If you have more than one Main method in your application, you can specify the startup object from the project's properties. But it's not the case here.
[Edit]Xmen is correct. I was talking about executables. I forgot about libraries.[/Edit]
The method you have here is a static constructor, a method that will be called only the first time you use that class in any way.
You can create objects from that class normally just like any other classes.
static void Main(string[] args)
{
StaticTest s1 = new StaticTest();
StaticTest s2 = new StaticTest();
StaticTest s3 = new StaticTest();
}
Eslam Afifi
modified on Saturday, March 14, 2009 12:09 PM
|
|
|
|
|
Set project Output Type to Class Library, then you wont need Main
TVMU^P[[IGIOQHG^JSH`A#@`RFJ\c^JPL>;"[,*/|+&WLEZGc`AFXc!L
%^]*IRXD#@GKCQ`R\^SF_WcHbORY87֦ʻ6ϣN8ȤBcRAV\Z^&SU~%CSWQ@#2
W_AD`EPABIKRDFVS)EVLQK)JKSQXUFYK[M`UKs*$GwU#(QDXBER@CBN%
Rs0~53%eYrd8mt^7Z6]iTF+(EWfJ9zaK-iTV.C\y<pjxsg-b$f4ia>
--------------------------------------------------------
128 bit encrypted signature, crack if you can
|
|
|
|
|
Xmen is right, but, of course, your code will not then execute, it will need to be imported into a project that DOES have a main method, which then will create instances of these classes and call them. There is no way to get C# code to execute without a static void main method, somewhere, unless it is in a class library that uses COM and thus can be loaded by a C++ app ( which would have an int main method ).
Christian Graus
Driven to the arms of OSX by Vista.
|
|
|
|
|
Simple, write a compiler that uses a different name.
|
|
|
|
|
Hi,
I have the client and Udp server communicate with each other.Now im not getting the exception "The existing connection was forcibly closed by the remote host".This is because i have defined the server in a separate project.
The client is now able to communicate with 1 server at one ip and port.But i want the client to call another udp server at another port but same ip.For eg:the client is communicating with udp server at port 10001.After every 15 secs the client should connect with the servers at different ports(10002,10003 etc)
How i can do this?Please give me your suggestions
|
|
|
|
|
Hi,
what could be the problem? duplicate what you already have. And if there are any blocking calls, consider using an extra thread/backgroundworker.
Luc Pattyn [Forum Guidelines] [My Articles]
- before you ask a question here, search CodeProject, then Google
- the quality and detail of your question reflects on the effectiveness of the help you are likely to get
- use the code block button (PRE tags) to preserve formatting when showing multi-line code snippets
|
|
|
|
|
"Hi, I have the client and Udp server communicate with each other.Now im not getting the exception "The existing connection was forcibly closed by the remote host".This is because i have defined the server in a separate project."
- Most likely because you are using UDP and not TCP (if thats what was used before) UDP doesnt care about "connections" etc, it just sends/recieves to/from endpoints. Not because you moved the server part into a seperate project...
"The client is now able to communicate with 1 server at one ip and port.But i want the client to call another UDP server at another port but same ip.For eg:the client is communicating with udp server at port 10001.After every 15 secs the client should connect with the servers at different ports(10002,10003 etc)"
- You will have to define another endpoint for the UDP sending socket (client) with a different port, tis all. If you still are having problems, please post up some code; it might help clear things up.
modified on Saturday, March 14, 2009 1:30 PM
|
|
|
|
|
Hi,
If iam defining a new endpoint the client will be able to call yet another udp server.But i want the client to recursively call the servers at different port for every 15 secs.
//client
private void SendMessage()
{
try
{
listBox6.Items.Add("Connecting....");
IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 10001);
Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
sock.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.SendBuffer, 1);
listBox6.Items.Add("Connected");
byte[] data = new byte[1024];
String snd = "hello";
data = Encoding.ASCII.GetBytes(snd);
listBox6.Items.Add("Transmitting...");
sock.SendTo(data, 0,data.Length, SocketFlags.None, ipep);
listBox6.Items.Add("Sent...");
EndPoint tmpRemote = (EndPoint)ipep;
listBox6.Items.Add("Message received from {0}:");
listBox6.Items.Add(ipep.ToString());
data = new byte[1024];
int recv = sock.ReceiveFrom(data, 0, data.Length, SocketFlags.None, ref tmpRemote);
String zz=Encoding.ASCII.GetString(data, 0, recv);
listBox6.Items.Add(zz);
if (zz == "Welcome to the Server")
{
lb9.Text = "Active";
lb9.BackColor = Color.Green;
}
else{
lb9.Text = "Inactive";
lb9.BackColor=Color.Red;
}
}
catch (SocketException e)
{
MessageBox.Show(e.Message);
}
}
//server
public static void start_server()
{
IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 10001);
Socket newsock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
newsock.Bind(ipep);
Console.WriteLine("Waiting for a client...");
while (true)
{
try
{
EndPoint tmpRemote = (EndPoint)ipep;
byte[] data = new byte[1024];
Console.WriteLine("hai");
int recv = newsock.ReceiveFrom(data, 0, data.Length, SocketFlags.None, ref tmpRemote);
Console.WriteLine("gfgjfk");
Console.WriteLine("Message received from {0}:", tmpRemote.ToString());
Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv));
data = new byte[1024];
string ss = "Welcome to the Server";
data = Encoding.ASCII.GetBytes(ss);
newsock.SendTo(data, 0, data.Length, SocketFlags.None, tmpRemote);
Console.WriteLine("\nSent Acknowledgement");
}
catch (SocketException e)
{
Console.WriteLine(e.Message);
}
start_server();
}
}
}
|
|
|
|
|
did you try my last[^] suggestion?
|
|
|
|
|
Hi,
I used multithreading concept so the client is able to communicate with any number of servers.Using the same concept i tried to call the 2nd server after 10 secs.When it comes to the client the 2nd time it gives"Invalid OperationException Cross-thread operation not valid: Control 'listBox6' accessed from a thread other than the thread it was created on."
//server
public UdpServer()
{
try
{
Thread startServer = new Thread(new ThreadStart(start_server));
startServer.Start();
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
try
{
Thread.Sleep(10000);
startServer2 = new Thread(new hreadStart(start_server2));
startServer2.Start();
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
public static void start_server()
{
IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 10001);
Socket newsock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
newsock.Bind(ipep);
Console.WriteLine("Waiting for a client...");
while (true)
{
try
{
EndPoint tmpRemote = (EndPoint)ipep;
byte[] data = new byte[1024];
Console.WriteLine("hai");
int recv = newsock.ReceiveFrom(data, 0, data.Length, SocketFlags.None, ref tmpRemote);
Console.WriteLine("gfgjfk");
Console.WriteLine("Message received from {0}:", tmpRemote.ToString());
Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv));
data = new byte[1024];
string ss = "Welcome to the Server";
data = Encoding.ASCII.GetBytes(ss);
newsock.SendTo(data, 0, data.Length, SocketFlags.None, tmpRemote);
Console.WriteLine("\nSent Acknowledgement");
}
catch (SocketException e)
{
Console.WriteLine(e.Message);
}
}
}
public static void start_server2()
{
IPEndPoint ipep1 = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 10002);
Socket newsock1 = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
newsock1.Bind(ipep1);
Console.WriteLine("Waiting for a client2...");
while (true)
{
try
{
EndPoint tmpRemote1 = (EndPoint)ipep1;
byte[] data = new byte[1024];
Console.WriteLine("hai");
int recv = newsock1.ReceiveFrom(data, 0, data.Length, SocketFlags.None, ref tmpRemote1);
Console.WriteLine("gfgjfk");
Console.WriteLine("Message received from {0}:", tmpRemote1.ToString());
Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv));
data = new byte[1024];
string ss = "Welcome to the Server";
data = Encoding.ASCII.GetBytes(ss);
newsock1.SendTo(data, 0, data.Length, SocketFlags.None, tmpRemote1);
Console.WriteLine("\nSent Acknowledgement");
}
catch (SocketException e)
{
Console.WriteLine(e.Message);
}
}
} //client
private void SendMessage()
{
try
{
listBox6.Items.Add("Connecting....");
IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 10001);
Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
sock.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.SendBuffer, 1);
listBox6.Items.Add("Connected");
byte[] data = new byte[1024];
String snd = "hello";
data = Encoding.ASCII.GetBytes(snd);
listBox6.Items.Add("Transmitting...");
sock.SendTo(data, 0,data.Length, SocketFlags.None, ipep);
listBox6.Items.Add("Sent...");
EndPoint tmpRemote = (EndPoint)ipep;
listBox6.Items.Add("Message received from {0}:");
listBox6.Items.Add(ipep.ToString());
data = new byte[1024];
int recv = sock.ReceiveFrom(data, 0, data.Length, SocketFlags.None, ref tmpRemote);
String zz=Encoding.ASCII.GetString(data, 0, recv);
listBox6.Items.Add(zz);
if (zz == "Welcome to the Server")
{
lb9.Text = "Active";
lb9.BackColor = Color.Green;
}
else{
lb9.Text = "Inactive";
lb9.BackColor=Color.Red;
}
}
catch (SocketException e)
{
MessageBox.Show(e.Message);
}
}
private void SendMessage1()
{
try
{
listBox6.Items.Add("Connecting....");
IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 10002);
}} I am calling the SendMessage1 in a timer event
[code] private void tim_Elapsed(object sender,ElapsedEventArgs e)
{
SendMessage1();
}
Please help me with this
modified on Sunday, March 15, 2009 4:13 AM
|
|
|
|
|
Hi
The following code gives me the output:
Waiting for client...
hai
Waiting for client2.....
hai
Message received from...
hello
Sent ackn....
hai
Message received from...
server
Sent ackn....
I want it to be like:
Waiting for client...
hai
Message received from...
hello
Sent ackn....
Waiting for client 2...
I tried to change but im getting"the existing connection was forcibly closed by the remote host"..Please help me with this
//client
public void SendMessage()
{
try
{
listBox6.Items.Add("Connecting....");
IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 10001);
Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
sock.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.SendBuffer, 1);
listBox6.Items.Add("Connected");
byte[] data = new byte[1024];
String snd = "hello";
data = Encoding.ASCII.GetBytes(snd);
listBox6.Items.Add("Transmitting...");
sock.SendTo(data, 0,data.Length, SocketFlags.None, ipep);
listBox6.Items.Add("Sent...");
EndPoint tmpRemote = (EndPoint)ipep;
listBox6.Items.Add("Message received from {0}:");
listBox6.Items.Add(ipep.ToString());
data = new byte[1024];
int recv = sock.ReceiveFrom(data, 0, data.Length, SocketFlags.None, ref tmpRemote);
String zz=Encoding.ASCII.GetString(data, 0, recv);
listBox6.Items.Add(zz);
if (zz == "Welcome to the Server")
{
lb9.Text = "Active";
lb9.BackColor = Color.Green;
}
else{
lb9.Text = "Inactive";
lb9.BackColor=Color.Red;
}
}
catch (SocketException e)
{
MessageBox.Show(e.Message);
}
}
public void SendMessage1()
{
}
//server
public UdpServer()
{
try
{
startServer = new Thread(new ThreadStart(start_server));
startServer.Start();
}
catch (Exception e)
{
Console.WriteLine(e.Message);
startServer.Abort();
}
try
{
startServer2 = new Thread(new ThreadStart(start_server2));
startServer2.Start();
}
catch (Exception e)
{
Console.WriteLine(e.Message);
startServer2.Abort();
}
}
public static void start_server()
{
IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 10001);
Socket newsock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
newsock.Bind(ipep);
Console.WriteLine("Waiting for a client...");
while (true)
{
try
{
EndPoint tmpRemote = (EndPoint)ipep;
byte[] data = new byte[1024];
Console.WriteLine("hai");
int recv = newsock.ReceiveFrom(data, 0, data.Length, SocketFlags.None, ref tmpRemote);
Console.WriteLine("gfgjfk");
Console.WriteLine("Message received from {0}:", tmpRemote.ToString());
Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv));
data = new byte[1024];
string ss = "Welcome to the Server";
data = Encoding.ASCII.GetBytes(ss);
newsock.SendTo(data, 0, data.Length, SocketFlags.None, tmpRemote);
Console.WriteLine("\nSent Acknowledgement"); }
catch (SocketException e)
{
Console.WriteLine(e.Message);
}
}
}
public static void start_server2()
{
}
|
|
|
|
|
Hi
I used the Thread.Sleep()
public UdpServer()
{
try
{
startServer = new Thread(new ThreadStart(start_server));
startServer.Start();
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
try
{
Thread.Sleep(20000);
startServer2 = new Thread(new ThreadStart(start_server2));
startServer2.Start();
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
} Im getting the output as
Waiting for client...
hai
Message received....
hello
Sent ack
Waiting for client2...
hai
At this it shows"existing connection was forcibly closed by the remote host".Please give me your suggestion
|
|
|
|
|
I have made some user controls. I will be using them in another application in C# where these will be added on the form dynamically at the click of a button. The sizes of the user controls differ from one another.
The problem is that when I add them dynamically it aligns itself at the top left corner. I want it to automatically align itself to centre of the main form and when I resize the form, it should realign itself.
I have tried setting its dock property to fill but it doesn't help at all.
Always Keep Smiling.
Yours Pankaj Nikam
|
|
|
|
|