Graphics programming in Delphi

This was a brief introduction to Graphics programming that I wrote a few years back… The concepts are all good even if the links are not.  🙂  Many of the resources for Delphi graphics programming were disappearing even then.  So this article is now the only place to get some of these examples…

http://www.TheCodeCave.com/Queeg/GraphicsProgramming/index.htm

Brian Layman on .Net Programming

I’ve used this twice now.  So I’ll add it here.

Some PHP zealot stated that because PHP could be used in conjunction with AJAX, .NET was dead.  I should have just let him go, but he was being so arrogant that he could only be some 14 year old sitting in his parents house spouting “wisdom” for the masses despite his bragging of being a VB programmer with 20 years of experience.  And frankly I don’t see much difference between a 14 year old living with his parents and a Visual Basic programmer with 20 years of experience (so sorry ;p).

So, here is my response and more importantly my explanation of what .NET programming is and isn’t:

“[..] Microsoft is spouting that Win32 is dead not that .NET is dead.  While I agree that is not correct (Win32 is far from dead), it is not because .NET is going to leave the scene any time in the next 20 years.  .NET
programming is the only manner of programming MS’s new compilers allow. Really .NET isn’t a language at all.  It is a standard that can be used by any programming language to get your code into a third neutral language that will run on any platform. Basically you don’t compile into machine code anymore.  That way all of the tricks the hacker uses are eliminated.  No more reading areas of memory that don’t belong to you.  No more expanding your strings with binary code to put stuff where it doesn’t belong.  [No more grabbing initialized memory and accidentally getting the contents of an email that was just sent out.] The second level of compiling ensures none of that exists in the new final machine code.  Then the OS (Vienna?) will not allow anything that is not .NET compliant to run.

So, you write something in C or Delphi in a way that conforms to the .Net standard.  That compiler translates your code into a Common Intermediate Language that will be compiled again in a by a Common Language Runtime (CLR) to run on specific platforms (OSs).  MS’s .Net framework, the only.net “platform” that we have right now, is just the transition path to allow us to start writing applications now that will compatible with their future OS’s.  It’s a pretty smart plan really.  We are a long time away from having a OS that only supports programs written under the .NET specs (2009?), but MS is starting to make those programs the only type that can be written.”  

[continuing] 

And in that fashion Microsoft ensures their new OS standard will be adopted even when drop backwards compatibility to Windows Server 200x and Windows Vista and Windows XP by saying that their OS will  no longer allow 16 bit and Win32 bit programs to run.  The fact that no major programming languages, other than Delphi 2006, support Win32 programming ensures that by 2009 most apps that are less than 5 years old will be .NET and run on MS Vienna without a problem and MS can say that they have achieved 95% compatibility.  They have found a way achieve forward compatibility with an operating system half a decade into the future.

I have to say that is somewhat impressive. They definately do some things right.  Just don’t get me started about feature level de-activation in Windows Vista.

There are problems there. For instance, I changed some hardware in my computer. Outlook deactivated itself and required I put in the original disk to get it to work. Fine. I did that and ti was working again. But just now it deactivated itself again, because it suddenly decided I must be a thief. I’m connecting via Remote Desktop and some bug must have led it to determine that my hardware had changed again.  I AM VPNING IN HOW CAN I INSERT THE CD???? IT IS ON MY DESK AT HOME!!!! AAAGGHHH! I guess you take the good with the bad…

*UPDATE: AND NOW IT’S HAPPENED TWICE!!! but that’s for another post….

What is this Category?

What is this Category?

The WordPress-list-heirarchical-categories feature has a bug that means that parent categories must have at least one post or the categories underneath won’t be displayed.  SOOOOO….. Here’s the obligatory post for this category…

Here I will write about stuff I want to do – and maybe I’ll add a category specifically for stuff I’ve said I’ll do…

What is this Category?

What is this Category?

The WordPress-list-heirarchical-categories feature has a bug that means that parent categories must have at least one post or the categories underneath won’t be displayed.  SOOOOO….. Here’s the obligatory post for this category…

These categories will Show information about me as a person.  Who I am, what I do, what I like, how I think.  It’s a bit risky putting all this out there in the wild, but people that know me know that I don’t often hold back at the artificial bondaries others have put up…

A command line method to reattach to networks

This routine does the same thing as the Windows Network Repair function, but from the command prompt.  Now why is this important? Well, it is VERY important when you have effected network changes, or physically had someone detach the computer from one network and attach it to another.  When this is done, the computer has to know to forget everything it knew about the old network and learn what it can from the new network.  Double clicking on a short cut to this batch file can take care of that and it is much simpler than leading someone through the steps to get to the network repair option.

Concepts Demonstrated: Network manipulation
Concepts Demonstrated: Quiet Parameter

      ::@Echo off ::************************************************************************* :: This Batch file performs the rough equivelant of a Windows XP SP1  :: Network Connection Repair. :: :: Usage: ::   NetworkRepair      <-- Prompts for permission & repairs all networks ::   NetworkRepair [ConnectionName]     <-- Prompts & repairs one network ::   NetworkRepair Quiet    <-- Does Not Prompt (Quiet is Case Sensitive) ::   NetworkRepair Quiet [ConnectionName]    <-- Repairs only one network :: :: A Windows Network Connection Repair (Right click on the Local Area  :: Connection and choose Repair) performs a series of commands that allows :: a computer to rebuild a its connection to the network.  The commands :: that are invoked by Repair are included below in their command-line :: equivalents.  The only current  difference is that the Repair process :: first checks whether DHCP is enabled and then, if enabled, it issues a :: broadcast renew to refresh the IP address.   This will cause the  :: computer to accept a lease from *any* DHCP server that is on the network.  :: You cannot do that from the command line.  In contrast, a unicast renew :: (as done through ipconfig /renew) will only renew the existing lease :: from the currently used DHCP server.  I've  tried to work around that :: difference calling ipconfig /release.  Hopefully, putting the :: ipconfig /renew further down in the batch file will cause a broadcast :: request for a new IP address.  I do not know if that will happen or not.  :: In any case, this would only affect the behavior of the repair if your :: network has multiple DHCP servers. :: :: In addition, a normal repair is performed for one connection at a time. :: This batch file will repair all network connections unless you specify :: the mask to use for finding the correct networks. Like so: ::   NetworkRepair Wi*         <-- Repair any connection that has its name ::                                 starting with "Wi" ::   NetworkRepair Quiet *Con* <-- Quietly repair all connections with, ::                                 "Con" anywhere in the name.  Examples ::                                 include "Local Area Connection 1" or ::                                         "Local Area Connection 2":: ::   NetworkRepair quiet       <-- Repair all networks named "quiet" :: :: :: Author - Brian Layman :: Created - 5/29/2003 :: Last Modified - 7/27/2005 :: :: License - If this helps you - Great! Use it, modify it share it. :: :: Indemnity - You're playing with network settings and clearing caches. ::    That means that if your settings are messed up on this computer or any ::    of your network servers or routers, running this batch may cause it to ::    see even fewer network resources from this computer.  This batch file  ::    makes the computer forget everything it ever knew about the way the  ::    network was working before.  When it asks the routers and servers for new ::    information, that information must be correct for your problem to go away. ::    ::    Use this batch file at your own risk.  I'm only calling built-in Windows ::    commands, but if a typo or service pack change affects what this routine ::    does, it is not my fault.  In fact, you should just stop right now and ::    not run this file.  For if it causes blue smoke to be emitted from your ::    network card, if it resets your home site to HowToKillMyBoss.com, or if ::    it makes your sister break up with her lawyer boyfriend and start dating ::    a caver, it is not my fault.  (Actually that last one might be an ::    improvement, but it is still not my fault.) :: :: Uses - This routine allows you to automate switching from one network ::    connection to another simply by double-clicking a link on the desktop. ::    It may also be useful in performing quick repairs of network connections ::    rather than guiding your relative/friend/spouse through the process over ::    the phone. :: :: Donations - If this batch file really helps you out, feel free to make a $5 ::    (US) donation via Paypal to Brian@TheCodeCave.com or just send a Thank ::    You via email to that address and include your country of origin. :: :: MD5 - The correct MD5 is available at: ::                     http://www.The-WildWest.com/Queeg/NetworkRepair :: :: Enjoy! :: ::*************************************************************************  :: ************************************************************************* :Quiet Check ::  Check for the Quiet password. :: ************************************************************************* :: Put a bracket around the %1 to trap for empty values and to allow the :: string comparison to work if [%1] == [Quiet] GOTO :TheWorks :: *************************************************************************  :: ************************************************************************* :TheWarning ::  ::  Display some info about the program and also allow several ways to ::  abort an accidental launch. :: :: ************************************************************************* Echo. Echo This batch file will reset your network connection.   Echo. Echo. By running it you're playing with network settings and clearing caches. Echo. That means that if your settings are messed up on this computer or any Echo. of your network servers or routers, running this batch may cause it to Echo. see even fewer network resources from this computer.  This batch file Echo. makes the computer forget everything it ever knew about the way the network Echo. was working before.  When it asks the routers and servers for new Echo. information, that information must be correct for your problem to go away. Echo. Echo. Use this batch file at your own risk.  I'm only calling built-in Windows Echo. commands, but if a typo or service pack change affects what this routine Echo. does, it is not my fault.  In fact, you should just stop right now and Echo. not run this file.  For if it causes blue smoke to be emitted from your Echo. network card, if it resets your home site to HowToKillMyBoss.com, or if Echo. it makes your sister break up with her lawyer boyfriend and start dating Echo. a caver, it is not my fault.  (Actually that last one might be an Echo. improvement, but it is still not my fault.) Echo.  @pause  :: ************************************************************************* :TheWorks :: ::  Let the fun begin! :: :: ************************************************************************* if NOT [%1] == [Quiet] Echo. if NOT [%1] == [Quiet] Echo * Release the DHCP lease - NOT PART OF REPAIR if NOT [%1] == [Quiet] ipconfig /release %1 if [%1] == [Quiet] ipconfig /release %2 if NOT [%1] == [Quiet] Echo. if NOT [%1] == [Quiet] Echo * Flush the ARP cache arp -d *  if NOT [%1] == [Quiet] Echo. if NOT [%1] == [Quiet] Echo * Flush the NetBIOS cache nbtstat -R  if NOT [%1] == [Quiet] Echo. if NOT [%1] == [Quiet] Echo * Flush the DNS cache ipconfig /flushdns  if NOT [%1] == [Quiet] Echo. if NOT [%1] == [Quiet] Echo * Request a new the DHCP lease - NOT PART OF REPAIR if NOT [%1] == [Quiet] ipconfig /renew %1 if [%1] == [Quiet] ipconfig /renew %2  if NOT [%1] == [Quiet] Echo. if NOT [%1] == [Quiet] Echo * Re-register with WINS nbtstat -RR  if NOT [%1] == [Quiet] Echo. if NOT [%1] == [Quiet] Echo * Re-registers with DNS ipconfig /registerdns  if [%1] == [Quiet] CLS  :: ************************************************************************* :TheEnd :: ::  So long and thanks for all the fish! :: :: ************************************************************************* 

Demonstration: Manipulating the Clipboard in Delphi

Here’s a quick demonstration of how easy programming is in Delphi.

This small app allows you to copy text and past it again right away with it converted to proper case or upper case.  This was written for a ZTree user that had a bunch of files that he wanted t rename to partially uppercase.  There was no way to pick out the part of the name he wanted in upper case. So I wrote this routine to allow him to highlight part of the text, hit copy and then hit paste.  And viola, he it would be fixed.

So in Delphi, how do you access the clip board? Well, it couldn’t be simpler.  Just add the clipbrd unit to your uses statement like this:

[delphi]uses Clipbrd;[/delphi]

Then you can read and write to the clipboard  as text like this:

[delphi]A := Clipboard.AsText;
Clipboard.AsText := A + ‘BC’;[/delphi]

Of course it is best to check that you are dealing with text befor you try to get the information back from the clipboard.  That can be done like this:

[delphi]if (Clipboard.HasFormat(CF_TEXT)) then DoIt;[/delphi]

See! It is THAT straight forward.  If you want to see what  other clipboard formats there are, just highlight CF_TEXT in Delphi and hit F1 and you’ll get a full list.

Value Meaning
CF_TEXT Text with a CR-LF combination at the end of each line. A null character identifies the end of the text.
CF_BITMAP A Windows bitmap graphic.
CF_METAFILEPICT A Windows metafile graphic.
CF_PICTURE An object of type TPicture.
CF_COMPONENT Any persistent object.

So the instructions to create a full app are quite simple:
In Delphi, create a new app. In the Object Inspector, Name the main form frmCBFix, change the Border style to bsToolWindow, and change the form style to fsStayOnTop

Place a TEdit on the form and name it editCorrected text, clearing the default text value.

Add Clipbrd to the uses.

Put a TTimer on the form and double click the timer event in the Object Inspector.

Paste the following code into the unit replacing the automatic generated Timer1Timer procedure:

[delphi]{******************************************************************************
ProperCase
Converts a string to proper case by capitalizing each letter after a space or
punctuation. The only common punctuation not used is the apostrophe/single
quote. This avoids changing don’t to Don’T, but will sentences quoted
inside single quotes will not have their first letter capitalized.
******************************************************************************}
function ProperCase(aSrcStr: String): String;
var
Len, Index: integer;
begin
aSrcStr := Lowercase(aSrcStr);
Len := Length(aSrcStr);
aSrcStr[1] := UpperCase(string(aSrcStr[1]))[1];
for Index := 1 to Len – 1
do begin
if (aSrcStr[Index] in [‘ ‘,’$’,'”‘,'(‘,’)’,’`’,’!’,’?’,’<','!','>‘,’#’,’=’,’+’,’:’,’,’,’/’,’.’,’&’,’-‘,'{‘,’}’,'[‘,’]’,’|’])
then aSrcStr[Index + 1] := UpperCase(String(aSrcStr[Index + 1]))[1];
end;
Result := aSrcStr;
end;

{******************************************************************************
Timer1Timer
Fires periodically (orignally every 250ms), checks the clip board for text,
if it has changed, convert it to proper case and put the result in the
clipboard and the edit control.
******************************************************************************}
procedure TfrmCBFix.Timer1Timer(Sender: TObject);
begin // Timer1Timer
if Clipboard.HasFormat(CF_TEXT)
then begin
if (editCorrectedText.Text <> Clipboard.AsText)
then begin
editCorrectedText.Text := ProperCase(Clipboard.AsText);
Clipboard.AsText := editCorrectedText.Text;
end;
end;
end; // Timer1Timer [/delphi]
And you’re done!

Here are the files for this project:
http://www.TheCodeCave.com/downloads/delphi/CBFixerUpper.exe
http://www.TheCodeCave.com/downloads/delphi/CBFixerUpper.dpr
http://www.TheCodeCave.com/downloads/delphi/u_CBFix.dfm
http://www.TheCodeCave.com/downloads/delphi/u_CBFix.pas

The WordPress 2.0 theme competition ends today

Today is the last day for submissions.  I hope this means there are pleanty of good themes coming out soon.  Now that I know a little about this, I realize that this competition is being done the right way.  In reality, appearance, which to the new WordPress user seems to all there is to themes, is MUCH less important than the underpinnings and design of the theme.  In this competion, prizes are being given for How the theme was written and what features it includes.  In stead of, or perhaps in addition to, the theme appearance.  See here: http://kcyap.com/competition/?p=3

Feature: Category choices.

It would be neat if a browser could only see the categories on a blog that they are interested in.  If the theme could save a cookie with a bitmap of the blogs themes, the user could ignore stuff like  this that they do not care about.  Why would a delphi programmer care about a possible feature I intend to maybe someday include in a theme May or May Not ever get around to writing.