views:

261

answers:

3

Here is my attempt to solve the About.com Delphi challenge to un-camel-case a string.

unit challenge1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
   check = 65..90;
  TForm1 = class(TForm)
    Edit1: TEdit;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  var s1,s2 :string;
  int : integer;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer;
  checks : set of check;
begin
  s1 := edit1.Text;
  for i := 1 to 20  do
  begin
    int  :=ord(s1[i]) ;
    if int in checks then
      insert('  ',s1,i-1);
  end;
  showmessage(s1); 
end;

end.

check is a set that contains capital letters so basically whenever a capital letter is encountered the insert function adds space before its encountered (inside the s1 string), but my code does nothing. ShowMessage just shows text as it was entered in Edit1. What have I done wrong?

+2  A: 

checks is local to the method and never initialized. It may contain random data, but most probably not the data you expect (perhaps it it is an empty set). So the IF-condition will probably never become true.

Uwe Raabe
+3  A: 

You're correct that check is a set, but you haven't assigned any value to it yet, so its value is indeterminate. There are not the characters you expect in it, so the in test probably always fails. (Didn't the compiler warn you that you hadn't assigned anything check yet?)

You don't really want to define check as a subrange type. Rather, you should replace check with the built-in TSysCharSet type, which is a set of characters. Then assign check like this:

check := ['A'..'Z'];

Furthermore, rather than check the numeric value of the string with int and Ord, just use the Char values directly: if s1[i] in check. You'll also want to use the Length function so you process the entire string instead of assuming that the input will always be exactly 20 characters long. You'll also want to store the result into something other than s1 since, as Caldon points out, you don't want to modify it at the same time that you're still reading more characters from it.

Rob Kennedy
Why is it empty? Undefined as Uwe says makes more sense to me.
Marco van de Voort
+3  A: 

if you try your program on e.g. string "MyText", then in the first loop it correctly recognizes that "M" is capital, and so it enters one space before it... so the string is " MyText"... now in the next loop, i=2, and s1[i] is again "M" and so it inserts one space before it... and so on...

Ondra C.