|
Don't do that like that, compute the letters list where you want, give it to your "grid container" UserControl which it is supposed to know the list of "letter controls" that it contains. Loop in your letters list and give a letter to each sub-control. Each sub-control is supposed to have a stupid Text property, in which you can set the value of a label that would be docked full in your sub-control.
Really, don't put all this useless complexity like that.
Jean-Christophe Grégoire
|
|
|
|
|
Hi Jean-Christophe, i'm only quite new to C# and programming as a whole and i'm not really understanding what your meaning. Maybe a good see what you mean with some pseudo code or just initial code to get me on my way?
|
|
|
|
|
Okay sorry, give me some more time and I will mail you a sample project
Jean-Christophe Grégoire
|
|
|
|
|
Thank you Jean-Christophe, i really appreciate your help. I think once i see what your meaning i will be able to get a grasp of it!
Many thanks
|
|
|
|
|
Hi VinceAshbySmith,
I made your sample project, how can I provide the zip file ?
Jean-Christophe Grégoire
|
|
|
|
|
Hi Jean-Christophe not sure if you got my email, so if you could send the code sample to vinny.as@tiscali.co.uk, that would be great!
|
|
|
|
|
string drawThis = "Hello world";
int cellRow = 0;
while (cellRow < this.maxRow)
{
int cellCol = 0;
while (cellCol < this.maxCol)
{
if (this.cellSelected[cellCol, cellRow] == true)
{
this.customColor = Color.FromArgb(100, 100, 100);
SolidBrush myBrush = new SolidBrush(customColor);
gfx.FillRectangle(myBrush, (cellCol * this.squareSize) + 1, (cellRow * this.squareSize) + 1, this.squareSize - 1, this.squareSize - 1);
if (cellCol < drawThis.Length)
gfx.DrawString(
drawThis[cellCol].ToString(),
this.Font,
Brushes.Wheat,
new Point(cellCol * this.squareSize, cellRow * this.squareSize));
myBrush.Dispose();
}
else
{
if (cellCol < drawThis.Length)
gfx.DrawString(
drawThis[cellCol].ToString(),
this.Font,
Brushes.Green,
new Point(cellCol * this.squareSize, cellRow * this.squareSize));
}
cellCol++;
}
cellRow++;
}
..and yes, there are more paths to Rome
I are troll
|
|
|
|
|
You should try a more object-oriented approach, you are really complexifying your life. Split this code in multiple small elements responsible of a single responsibility. The rectangle that holds a letter is one object. If you make a UserControl for this simple responsibility, you can delegate the complexity of catching MouseEnter/MouseLeave/etc... events in the control itself. Via two small event handlers, you can highlight and unhighlight your control without having to determine any coordinate.
The "host" of you multiple rectangles is another UserControl. Its only responsibility is to put all the small rectangles in a bigger rectangle. Eventually, it computes the size that a single "letter rectangle" can have, as it knows it own size and the total number of smaller rectangles to put in itself.
And finally, generating letters is another responsibility. The generation of the letters occurs outside, is provided to the big UserControl, and it will instantiate the correct number of small rectanges, providing the text and the size.
Don't play with positioning that you compute yourself, use docking. All this code can be reduced to 10 lines.
Jean-Christophe Grégoire
|
|
|
|
|
Hi everyone,
I'm trying to read data from crt-310 card reader using serial port.
When I send "CARD_EJECT" command it does work. The problem is when I'd like to receive data from the reader.
There is a pdf file whihc is about communication protocol says;
First host sends STX command and if the reader returns ACK (positive answer) and host send ENQ command and the reader execute it and response.
Actually I didn't quite catch something about the protocol. How can I cope with it? Here is some code of it.
I'd like to keep this writing fairly brief, I'm not going to post all the methods like CalcBCC and ExecuteCommand which are below,
but if someone interested in I can send them also. Many thanks already.
public CRT310_DATA GenerateCommand(string commandName, _CARDEJECTTYPE cardEjectType)
{
CRT310_DATA data = new CRT310_DATA();
if (commandName == "CARD_EJECT")
{
data.bytCommmand = CMD_CARD_EJECT;
data.bytCommandParameter = (byte)cardEjectType;
data.intDataLength = 0;
data.bytTxDataBuffer = new byte[1];
data.bytRxDataBuffer = new byte[0x109];
}
return data;
}
public bool SendData(CRT310_DATA data, _CRT310_STATUS status, int intTimeout)
{
try
{
byte[] bytDataToSend = new byte[0x109];
int intDataLength = 0;
int intDataLengthToSend = data.intDataLength + 2;
bytDataToSend[intDataLength] = STX;
intDataLength++;
bytDataToSend[intDataLength] = (byte)(intDataLengthToSend >>;
intDataLength++;
bytDataToSend[intDataLength] = (byte)(intDataLengthToSend & 0xff);
intDataLength++;
bytDataToSend[intDataLength] = data.bytCommmand;
intDataLength++;
bytDataToSend[intDataLength] = data.bytCommandParameter;
intDataLength++;
data.bytTxDataBuffer.CopyTo(bytDataToSend, intDataLength);
intDataLength += data.intDataLength;
bytDataToSend[intDataLength] = ETX;
intDataLength++;bytDataToSend[intDataLength] = this.CalcBCC(bytDataToSend, intDataLength);
intDataLength++;
com.Write(bytDataToSend, 0, bytDataToSend.Length);
}
catch (Exception ex)
{return false;}
return true;
}
|
|
|
|
|
Hi,
I can't give you the solution to your problems, since it is a broad topic that needs lots of information
you did not provide, but I can give you some commments and suggestions:
1.
please show your code using PRE tags, that makes it easier to read and spot mistakes.
2.
I suggest you start using autoincrement as in bytDataToSend[intDataLength++] = data.bytCommandParameter;
that makes your intentions more clear and your code less error-prone.
3.
make sure your SerialPort initialization is correct; is there anything working? are some characters coming through in one direction? in the other?
4.
on your SendData method:
- parameter intTimeout is not used
- buffer size: what is the magical 0x109? you don't fill that many bytes in the array, but you
do send them (unless the driver discards the NULL bytes). Shouldn't the last parameter of com.Write
be intDataLength?
- you insert a 2B length at the beginning, are you sure adding 2 to it is correct?
- the data length gets handled by intDataLength += data.intDataLength;
this may or may not be correct, I don't know your data struct/class,
intDataLength += data.bytTxDataBuffer.Length would always be right.
5.
your SendData sends STX somedata ETX; your textual description of a read said
sending STX waiting for ACK then sending ENQ; that would not be possible based on the SendData
you have shown (but then maybe you don't use SendData where you implement Read).
BTW: ENQ is just a simple ASCII character, similar to STX and others.
Hope this helps.
|
|
|
|
|
Hi, Mr Pattyn
Yes, Card eject method works as I have mentioned in the first message (When I send "CARD_EJECT" command it does work...)
here is all;
CardReader class which you can easily copy and paste it and btnConnect, btnCardEject clicks too.
Many thanks for suggestions.
#region using
using System;
using System.Collections.Generic;
using System.Text;
using System.IO.Ports;
using System.Timers;
using System.Runtime.InteropServices;
using System.Threading;
#endregion
namespace ABCD
{
public delegate void CardDataReceivedEventHandler(byte[] bayt);
public class CardReaderCRT310
{
private SerialPort com = null;
private string comPort = "";
private int baudRate = 0;
private string parity = "";
private int dataBits = 0;
private string stopBits = "";
private bool isConnected = false;
public event CardDataReceivedEventHandler DataReceived;
// timer
private System.Timers.Timer tmr = null;
public string ComPort
{
get { return comPort; }
set { comPort = value; }
}
public int BaudRate
{
get { return baudRate; }
set { baudRate = value; }
}
public string Prty
{
get { return parity; }
set { parity = value; }
}
public int DBits
{
get { return dataBits; }
set { dataBits = value; }
}
public string SBits
{
get { return stopBits; }
set { stopBits = value; }
}
public bool IsConnected
{
get { return isConnected; }
}
public void Connect()
{
if (isConnected == true) return;
// create com port object
com = new SerialPort(ComPort, BaudRate, (Parity)Enum.Parse(typeof(Parity), Prty, true), DBits, (StopBits)Enum.Parse(typeof(StopBits), SBits, true));
com.ReceivedBytesThreshold = 1;
com.ReadBufferSize = 1024;
com.WriteBufferSize = 1024;
com.DtrEnable = true;
com.Handshake = Handshake.None;
com.DiscardNull = false;
com.Encoding = System.Text.Encoding.Default;
// open com port
com.Open();
isConnected = true;
// start poller timer
tmr = new System.Timers.Timer(200);
tmr.Elapsed += new System.Timers.ElapsedEventHandler(tmr_Elapsed);
tmr.Start();
}
public byte[] StrToByteArray(string str)
{
System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding();
return encoding.GetBytes(str);
}
public string BtyeArrayToStr(byte[] b)
{
System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding();
return encoding.GetString(b);
}
public char[] BtyeArrayToChar(byte[] b)
{
System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding();
return encoding.GetChars(b);
}
private void tmr_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
// stop & process & start
try
{
byte[] ba = new byte[20];
string buffer = "";
string newData = com.ReadExisting();
if (newData != "" & newData.Length > 0)
{
tmr.Stop();
buffer = newData;
if (newData != null && newData.Length > 0) buffer += newData;
ba = new byte[buffer.Length];
ba = StrToByteArray(buffer);
if (DataReceived != null) DataReceived(ba);
}
buffer = "";
tmr.Start();
}
catch
{
}
}
[StructLayout(LayoutKind.Sequential)]
public struct CRT310_DATA
{
public int intDataLength;
public byte bytCommmand;
public byte bytCommandParameter;
public byte[] bytTxDataBuffer;
public byte[] bytRxDataBuffer;
}
private RX_FUNC rx_treat;
private _CRT310_STATUS rx_state;
private int rx_data_cnt;
private byte rx_BCC_calc;
private delegate bool RX_FUNC(byte bytDataIn, ref CRT310_DATA dat);
#region Private methods
private bool ExecuteCommand(ref CRT310_DATA dat, ref _CRT310_STATUS status, int intTimeout)
{
byte[] bytTxData = new byte[2];
bool blnFirstByte = true;
bool blnStop = false;
bytTxData[0] = 5;
this.com.DiscardInBuffer();
this.com.Write(bytTxData, 0, 1);
while (this.com.BytesToWrite > 0)
{
}
this.com.ReadTimeout = intTimeout;
this.rx_treat = new RX_FUNC(this.recieve_STX);
this.rx_state = _CRT310_STATUS.Busy;
while (!blnStop)
{
byte bytDataIn = 0;
if (this.recieve_byte(ref bytDataIn))
{
blnFirstByte = false;
blnStop = this.rx_treat(bytDataIn, ref dat);
}
else
{
if (!blnFirstByte)
{
status = _CRT310_STATUS.CharTimeout;
}
else
{
status = _CRT310_STATUS.MsgTimeout;
}
return false;
}
}
status = this.rx_state;
if (status == _CRT310_STATUS.Ok)
{
if (dat.bytCommmand != 0x4e)
{
return true;
}
status = (_CRT310_STATUS)dat.bytRxDataBuffer[0];
return false;
}
return false;
}
private byte CalcBCC(byte[] dat, int intLength)
{
byte bytBCC = 0;
int i = intLength - 1;
for (int intCharCnt = 0; intCharCnt <= i; intCharCnt++)
{
bytBCC = (byte)(bytBCC ^ dat[intCharCnt]);
}
return bytBCC;
}
private bool recieve_STX(byte bytDataIn, ref CRT310_DATA dat)
{
this.rx_BCC_calc = bytDataIn;
this.com.ReadTimeout = 100;
this.rx_treat = new RX_FUNC(this.recieve_NoRxBytesHO);
return false;
}
private bool recieve_NoRxBytesHO(byte bytDataIn, ref CRT310_DATA dat)
{
this.rx_BCC_calc = (byte)(this.rx_BCC_calc ^ bytDataIn);
this.com.ReadTimeout = 100;
dat.intDataLength = (byte)(bytDataIn << 0);
this.rx_treat = new RX_FUNC(this.recieve_NoRxBytesLO);
return false;
}
private bool recieve_NoRxBytesLO(byte bytDataIn, ref CRT310_DATA dat)
{
this.rx_BCC_calc = (byte)(this.rx_BCC_calc ^ bytDataIn);
this.com.ReadTimeout = 100;
dat.intDataLength += bytDataIn;
this.rx_treat = new RX_FUNC(this.recieve_command);
return false;
}
private bool recieve_command(byte bytDataIn, ref CRT310_DATA dat)
{
this.rx_BCC_calc = (byte)(this.rx_BCC_calc ^ bytDataIn);
this.com.ReadTimeout = 100;
dat.bytCommmand = bytDataIn;
this.rx_treat = new RX_FUNC(this.recieve_commandparameter);
return false;
}
private bool recieve_commandparameter(byte bytDataIn, ref CRT310_DATA dat)
{
this.rx_BCC_calc = (byte)(this.rx_BCC_calc ^ bytDataIn);
this.com.ReadTimeout = 100;
dat.bytCommandParameter = bytDataIn;
this.rx_data_cnt = 0;
if (dat.intDataLength > 2)
{
this.rx_treat = new RX_FUNC(this.recieve_data);
}
else
{
this.rx_treat = new RX_FUNC(this.recieve_etx);
}
return false;
}
private bool recieve_data(byte bytDataIn, ref CRT310_DATA dat)
{
this.rx_BCC_calc = (byte)(this.rx_BCC_calc ^ bytDataIn);
this.com.ReadTimeout = 100;
dat.bytRxDataBuffer[this.rx_data_cnt] = bytDataIn;
this.rx_data_cnt++;
if (this.rx_data_cnt == (dat.intDataLength - 2))
{
this.rx_treat = new RX_FUNC(this.recieve_etx);
}
return false;
}
private bool recieve_etx(byte bytDataIn, ref CRT310_DATA dat)
{
this.rx_BCC_calc = (byte)(this.rx_BCC_calc ^ bytDataIn);
this.com.ReadTimeout = 100;
this.rx_treat = new RX_FUNC(this.recieve_BCC);
return false;
}
private bool recieve_BCC(byte bytDataIn, ref CRT310_DATA dat)
{
if (bytDataIn != this.rx_BCC_calc)
{
this.rx_state = _CRT310_STATUS.Checksum;
}
else
{
this.rx_state = _CRT310_STATUS.Ok;
}
return true;
}
private bool recieve_byte(ref byte bytDataIn)
{
try
{
bytDataIn = (byte)this.com.ReadByte();
}
catch (Exception exception1)
{
return false;
}
return true;
}
#endregion
#region Enumarations
public enum _CRT310_STATUS
{
AbnormalCardLength = 6,
AckTimeout = 0xf4,
Busy = 0xf5,
CharTimeout = 0xf3,
Checksum = 0xf7,
CommandCanNotBeExecuted = 2,
CommandDataError = 4,
MsgTimeout = 0xf2,
Nak = 0xf1,
Ok = 240,
ParameterError = 1,
PowerSupply = 5,
UndefinedCommand = 0,
Unknown = 0xf6
}
public enum _CARDEJECTTYPE
{
CardEjectFrontHold = 0x31,
CardEjectFrontNoHold = 0x30,
CardEjectRearHold = 50,
CardEjectRearNoHold = 0x33
}
public enum _CARDSTOPTYPE
{
CardInStopFrontSideHoldCard = 0x31,
CardInStopFrontSideNoHoldCard = 0x30,
CardInStopInsideReaderICCardConnect = 0x33,
CardInStopInsideReaderICCardNoConnect = 50,
CardInStopRearSideHoldCard = 0x34,
CardInStopRearSideNoHold = 0x35
}
#endregion
#region Public connst (start-end etc, commands, command parameters, timeout values)
public const int STX = 0x2; // 'start char data package
public const int ETX = 0x3; // 'end char data package
public const int ENQ = 0x5; // 'sending require command
public const int ACK = 0x6; // 'positive answer
public const int NAK = 0x15; // 'negative answer
public const int EOT = 0x4; // 'cancel communication
public const int CRT310_RETRIES = 3;
// Commands
public const byte CMD_READ_DATA = 0x30;
public const byte CMD_CHECK_STATUS_OF_EACH_SENSOR = 0x31;
public const byte CMD_CARD_EJECT = 50;
public const byte CMD_CARD_STOP = 0x2e;
// Command Parameters
public const byte CMD_PRM_READ_DATA = 0x3A;
public const byte CMD_PRM_CHECK_STATUS_OF_EACH_SENSOR = 0x2F;
public const byte CMD_PRM_CARD_EJECT = 50;
public const byte CMD_PRM_CARD_STOP = 0x2e;
// Timeouts
public const int CMD_CARDEJECT_RESPONSTIMEOUT = 5000;
#endregion
public void CloseComport()
{
if (isConnected == false) return;
// stop poller timer
if (tmr != null)
{
tmr.Stop();
tmr.Dispose();
tmr = null;
}
if (com != null && com.IsOpen == true)
{
com.Close();
com.Dispose();
com = null;
}
isConnected = false;
}
public CRT310_DATA GenerateCommand(string commandName)
{
CRT310_DATA data = new CRT310_DATA();
if (commandName == "READ_DATA")
{
data.bytCommmand = CMD_READ_DATA;
data.bytCommandParameter = CMD_PRM_READ_DATA;
data.intDataLength = 1;
data.bytTxDataBuffer = new byte[3];
data.bytRxDataBuffer = new byte[264];
}
if (commandName == "CHECK_STATUS_OF_EACH_SENSOR")
{
data.bytCommmand = CMD_CHECK_STATUS_OF_EACH_SENSOR;
data.bytCommandParameter = CMD_PRM_CHECK_STATUS_OF_EACH_SENSOR;
data.intDataLength = 1;
data.bytTxDataBuffer = new byte[3];
data.bytRxDataBuffer = new byte[0x109];
}
return data;
}
public CRT310_DATA GenerateCommand(string commandName, _CARDSTOPTYPE CardStopType)
{
CRT310_DATA data = new CRT310_DATA();
if (commandName == "CARD_STOP")
{
data.bytCommmand = CMD_CARD_STOP;
data.bytCommandParameter = (byte)CardStopType;
data.intDataLength = 0;
data.bytTxDataBuffer = new byte[1];
data.bytRxDataBuffer = new byte[0x109];
}
return data;
}
public CRT310_DATA GenerateCommand(string commandName, _CARDEJECTTYPE cardEjectType)
{
CRT310_DATA data = new CRT310_DATA();
if (commandName == "CARD_EJECT")
{
data.bytCommmand = CMD_CARD_EJECT;
data.bytCommandParameter = (byte)cardEjectType;
data.intDataLength = 0;
data.bytTxDataBuffer = new byte[1];
data.bytRxDataBuffer = new byte[0x109];
}
return data;
}
public bool SendData(CRT310_DATA data, _CRT310_STATUS status, int intTimeout)
{
try
{
byte[] bytDataToSend = new byte[0x109];
int intDataLength = 0;
int intDataLengthToSend = data.intDataLength + 2;
bytDataToSend[intDataLength] = STX;
intDataLength++;
bytDataToSend[intDataLength] = (byte)(intDataLengthToSend >> 8);
intDataLength++;
bytDataToSend[intDataLength] = (byte)(intDataLengthToSend & 0xff);
intDataLength++;
bytDataToSend[intDataLength] = data.bytCommmand;
intDataLength++;
bytDataToSend[intDataLength] = data.bytCommandParameter;
intDataLength++;
data.bytTxDataBuffer.CopyTo(bytDataToSend, intDataLength);
intDataLength += data.intDataLength;
bytDataToSend[intDataLength] = ETX;
intDataLength++;
bytDataToSend[intDataLength] = this.CalcBCC(bytDataToSend, intDataLength);
intDataLength++;
byte[] newByteArray = new byte[intDataLength];
Array.Copy(bytDataToSend, newByteArray, intDataLength);
com.Write(newByteArray, 0, newByteArray.Length);
}
catch (Exception ex)
{
return false;
}
return true;
}
public bool CardEject(_CARDEJECTTYPE CardEjectType)
{
try
{
_CRT310_STATUS status = _CRT310_STATUS.Ok;
CRT310_DATA data = GenerateCommand("CARD_EJECT", CardEjectType);
if (SendData(data, status, 1000) == true)
{
Thread.Sleep(100);
if (this.ExecuteCommand(ref data, ref status, CMD_CARDEJECT_RESPONSTIMEOUT))
{
return true;
}
}
return false;
}
catch (Exception ex)
{
return false;
}
}
}
}
And I wrote something at the form side like;
CardReaderCRT310 cardReader = null;
private void btnConnect_Click(object sender, EventArgs e)
{
try
{
if (cardReader == null)
{
// connect card reader
cardReader = new CardReaderCRT310();
cardReader.DataReceived += new CardDataReceivedEventHandler(cardReader_DataReceived);
cardReader.ComPort = cmbPortName.Text;
cardReader.BaudRate = Convert.ToInt16(cmbBaudRate.Text);
cardReader.Prty = cmbParity.Text;
cardReader.DBits = Convert.ToInt16(cmbDataBits.Text);
cardReader.SBits = cmbStopBits.Text;
cardReader.Connect();
}
}
catch (Exception ex)
{
}
}
private void btnCardEject_Click(object sender, EventArgs e)
{
if (cardReader.CardEject(CardReaderCRT310._CARDEJECTTYPE.CardEjectFrontNoHold) == true)
{
//
}
cardReader.CloseComport();
}
Many thanks again.
|
|
|
|
|
Sorry I forgot to send the DataReceived event (which is on the form side) here is;
private void cardReader_DataReceived(byte[] b)
{
this.Invoke(new CardDataReceivedEventHandler(cardReader_DataReceivedInvoke), b);
}
private void cardReader_DataReceivedInvoke(byte[] b)
{
try
{
if (b.Length != 0)
{
string s = cardReader.BtyeArrayToStr(b);
}
}
catch (Exception ex)
{
}
}
|
|
|
|
|
Thanks for all the code, it does not really help; what one needs to design, implement and debug the
whole thing is documentation and a device for experimentation/verification.
You once more did not apply PRE tags (use the "CODE BLOCK" button below the edit field), so I am not going to even look at it.
And I forgot to tell you it is a very bad idea to catch an exception and then hardly do anything with it;
when things go wrong, the exception tells you the details of a problem, so let it show all it is holding
as in Console.WriteLine(exc.ToString())
Have you found the ASCII ENQ character yet?
modified on Saturday, January 10, 2009 9:44 AM
|
|
|
|
|
Hello,
I have a default page on which there are three user controls put inside three panels within the page. Based on a click event of a button in any of the user control, i want to unload a user control in the page and load a diferent user control in its place. I am using VS 2008 and C# as the code behind... Your inputs would be very helpful....Thanks in advance
|
|
|
|
|
I believe this is a ASP.Net Question , So please post it on asp.net forum.
cheers,
Abhijit
CodeProject.Com MVP
|
|
|
|
|
You can do it using delegates.
Create a delegate in the usercontrol with some return type / parameters with which you can set the visibility of the usercontrol, add an event for this delegate.
Add a button with a button click event in user ctrl.
Call the event in the webpage which in turn should call the user control's button click event.
Try this out.
Cheers,
Sudhanva
|
|
|
|
|
You could make the Set the Visible property on the controls to the appropriate value so they are not rendered to the client unless they need to be.
|
|
|
|
|
I would personally instantiate all of them with the Visible property set to false, and then show/hide them as necessary.
You can even initialize them when he VisibleChanged event is fired.
"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." - Jason Jystad, 10/26/2001
|
|
|
|
|
Thank you for the response. But here i am having around 50-60 controls now and the number is again going to increase. Do you think its a good idea to load as many number of controls on the form and keep its visible property false? The requirement is something as that of how Microsoft Dynamics work. We have one default page with left and main content panels that holds the user-controls which keep changing as per the button clicked...
|
|
|
|
|
I want to create my own 'URL' in a RichTextBox. when a user types [[LinkName]], it should display as a link.
Example
The documents with name [[The road to C#]] and [[An introduction to C#]] are very interesting.
How can this be created in a C# RichTextBox and how can I add a ClickEvent.
Thanks!
modified on Saturday, January 10, 2009 6:13 AM
|
|
|
|
|
You can do this by tweaking the registry, without lots of coding;
Hope this helps
I are troll
|
|
|
|
|
Thanks for this reply. It already helps me a bit.
Does anyone know if it is also possible to do whithin the application code (so without tweaking the registry)?
|
|
|
|
|
Hi!
Does this article[^] help?
Regards,
mav
--
Black holes are the places where God divided by 0...
|
|
|
|
|
Looks very good. I will look into it.
Thanks!
|
|
|
|
|
Is there any way other than Abort to terminate a thread.
How can i Suspend or resume Asynchronous threads
|
|
|
|
|