This is a must have for Delphi developers moving to C#.
TStringList is delphi’s swiss army knife:
I have used it for:
- Buffered output
- String parsing
- Generic container
- Sorting Data
Random outpourings of a software developer
This is a must have for Delphi developers moving to C#.
TStringList is delphi’s swiss army knife:
I have used it for:
It aims to add those bits that Microsoft forgot to put in the framework.
By default an unhandled exception in any application will kill an application and return an exception trace even in a windows form.
In Delphi in a forms application the exception shows as a message box.
The assumption in Visual C++ and then C# is that an unhandled exception could result in data corruption so you must shut down now. The assumption in delphi is that some error has occoured.
It is possible to add simple code to emulate the Delphi behavior
// Add the following to your uses clause:
using System.Threading;
//In your main method before run implement the following
Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(new CustomExceptionHandler().OnThreadException);
// Here is the exception handler (in production code use something more elegant, but for development this is fine:
// Creates a class to handle the exception event.
internal class CustomExceptionHandler
{
//Handles the exception event
public void OnThreadException(object sender, ThreadExceptionEventArgs t)
{
DialogResult result = DialogResult.Cancel;
try
{
result = this.ShowThreadExceptionDialog(t.Exception);
}
catch
{
try
{
MessageBox.Show(“Fatal Error”, “Fatal Error”,
MessageBoxButtons.AbortRetryIgnore, MessageBoxIcon.Stop);
}
finally
{
Application.Exit();
}
}
// Exits the program when the user clicks Abort.
if (result == DialogResult.Abort)
Application.Exit();
}
// Creates the error message and display it.
private DialogResult ShowThreadExceptionDialog(Exception e)
{
string errorMsg = “An error occurred please contact the adminstrator ” +
“with the following information: “;
errorMsg = errorMsg + e.Message + ” Stack Trace: ” + e.StackTrace;
return MessageBox.Show(errorMsg, “Application Error”,
MessageBoxButtons.AbortRetryIgnore, MessageBoxIcon.Stop);
}
}
}
However this should be the default behaviour.
Today I used:
I use compiled languages for the heavy lifting.
SQL is for data manipulation (mostly stored procs).
Expect and Python provide the flexible utilities (database creation).
Want (the delphi port of ant) provides the build tools.
TFoo = class(TObject);
TFooClass = class of TFoo;
function MakeFoo( aFooClass : TFooClass ) : TFoo;
begin
result := aFooClass.Create();
end;
This allows very generic code where you can get away with just passing in a class name.
I use this heavily in Delphi as part of a test framework (the meta class represents test data).
I think that this can be done in C# using reflection but there should be a cleaner method.
The first 7 are part of the Enterprise Library:
Enterprise Library
These are the Microsoft Patterns and Practice best practices (I can only find 11 distinct items)
Note that microsoft do not support these so as soon as you take them you own the code.
It would make a great open source project to take these on and centralise extensions to them.
Given the following two classes:
class First
{
First(string message)
{
System.Console.WriteLn(message);
}
}
class Second
{
}
The following will not compile:
Second = new Second(“Test”);
Now I know if I add the following to Second
Second(string message) : base(message)
{
}
This is not much code for a simple constructor, but what about classes with multiple constructors like exceptions? That makes them more difficult to define than necessary.
This allows code such as:
System.Net.WebClient wc = new System.Net.WebClient();
byte[] myDataBuffer = wc.DownloadData(url);
string download = System.Text.Encoding.ASCII.GetString(myDataBuffer);
This allows the text at a given url to be extracted.
Welcome to your own web spider.
In addition I have found that certain security API’s are missing on Windows Server 2003 custom builds. What is the point of developing against a fixed plaform if a custom build take away API calls?