uses math;

function GenID:String;
var
b, x: byte;
begin
  Result := '{';
  Randomize;
  for b:= 1 to 8 do
  begin
    if Random(100) > 50 then Result := Result + chr(RandomRange(48,57))
    else Result := Result + chr(RandomRange(65,90));
  end;
  Result := Result + '-';
  for x:= 1 to 3 do
  begin
    for b:= 1 to 4 do
    begin
      if Random(100) < 50 then Result := Result + chr(RandomRange(48,57))
      else Result := Result + chr(RandomRange(65,90));
    end;
    Result := Result + '-';
  end;
  for b:= 1 to 12 do
  begin
    if Random(100) < 50 then Result := Result + chr(RandomRange(48,57))
    else Result := Result + chr(RandomRange(65,90));
  end;
  Result := Result + '}';
end;

function genkey :string;
const
  Chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
var
  S: string;
  i, N: integer;
begin
  Randomize;
  S := '';
  for i := 1 to 30 do begin
    N := Random(Length(Chars)) + 1;
    S := S + Chars[N];
  end;
  result := S;
end;

function genkey2(c:integer) :string;
const
  Chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
var
  S: string;
  i, N: integer;
begin
  if c < 20 then c := 30;
  Randomize;
  S := '';
  for i := 1 to c do begin
    N := Random(Length(Chars)) + 1;
    S := S + Chars[N];
  end;
  result := S;
end;


procedure TForm1.FormCreate(Sender: TObject);
begin
memo1.Lines.Add(GenID);
memo1.Lines.Add(genkey);
memo1.Lines.Add(genkey2(10));
end;