``````{
Here's a few routines you might find useful For your name problem.
I call the Function "UpperName" whenever the user presses a
valid Text key in a name field, but it can also be called just
once after the entire input String is entered.
}

(* First, some general routines: *)
(* ----------------------------- *)

Function  FindStrLength(S: String): Byte;
{ Finds "S"'s length, not counting trailing spaces }
Var
StrLen: Byte Absolute S;
I     : Byte;

begin
I := StrLen;
if StrLen > 0 then
For I := StrLen downto 0 do
if S[I] <> ' ' then
Break;
FindStrLength := I;
end; { FindStrLength }

Function WordDelimiter(C: Char): Boolean;
{ -Checks if "C" qualifies as a String Word-delimiter }
Const
WordDels: Array[1..34] of Char =
#32#9#13#10#39',./?;:"<>[]{}-=\+|()*%@&^\$#!~';
Var
I: Integer;

begin
WordDelimiter := False;
For I := 1 to 34 do
if C = WordDels[I] then
begin
WordDelimiter := True;
Break;
end;
end; { WordDelimiter }

Function  ParceWord(S: String; Ind, L: Integer): String;
{ Returns the next Word from "Ind" index in "S" }
Var
I: Integer;

begin
ParceWord := '';
I := Ind;
For I := Ind to L do
if WordDelimiter(S[I+1]) then
begin
ParceWord := Copy(S, Ind, I-Ind+1);
Break;
end;
end; { ParceWord }

(* Now down to business: *)
(* --------------------- *)

Procedure UpperName(Var S: String);
{ Converts the first Character in Words to upper Case letters }
Var
I, L: Integer;
St  : String;

begin
L := FindStrLength(S);
if L = 0 then
Exit;
For I := L downto 2 do
if WordDelimiter(S[I-1]) then
begin
St := StUpCase(ParceWord(S, I, L));
{ you can put in exception Words here... }
if (St = 'DE') or (St = 'DEN') then
{ ie: Markis de Bleuchamp or van den Haag }
S[I] := 'd'
else
S[I] := UpCase(S[I]);
end;
S := UpCase(S);
end; { UpperName }

{
(The Function "StupCase" is from TurboPower Tpro, but any
routine that converts a String to upper Case letters will do).