I don't want to save all possible strings, just the ones that are matching the hash.

To avoid further misunderstanding, I will copy my current code here, and maybe you could tell me what's wrong because just when I thought it would work, it doesn't really. It runs, it's trying out everything, but something is bugged...

Code:
Program Md5BruteForce;

Uses Md5;

Var

hash,test,tri:string;

Num,Max,j:integer;

Results: array[1..100] of string;


Function NextChar(c:char):char; //This is for changing the characters in the string

Begin

 if c='z' then NextChar:='0'
 else
 if c='9' then NextChar:='a'
 else
 NextChar:=Succ(c);

End;

Procedure ChangeChar(MaxLength,spot:integer; Var Str:string); //The main procedure

Var

 counter:integer;
 i:integer;

Begin

 counter:=0;


 if Str[spot]='9' then 

 begin

  if length(Str)<=MaxLength then 

  begin

   for i:=1 to length(Str) do
   begin

    if Str[i]='9' then counter:=counter+1; //Count the 9s in the string

   end;

   if counter=length(Str) then
   begin

    for i:=1 to length(Str) do Str[i]:='a'; 
    Str:=Str+'a'; //If every character is a 9, then change all of them back to 'a', and add a plus 'a' to the string
   end

   else
   begin
    Str[spot]:='a';
    ChangeChar(MaxLength, spot-1,Str); //The procedure calls itself, until a non-9 character is found
   end;
  end;
 end
 else

 Str[spot]:=NextChar(Str[spot]); //If a non-9 character is found then it is simply switched to the next character


End;



Begin

for j:=1 to 100 do Results[j]:='' //Clearing the array, just to make sure...

Writeln('Please Give me the hash');
Readln(hash);

Writeln('Please give me the estimated maximum length of the original text(characters)');
Readln(Max);

test:='a';

Num:=1;

Repeat

tri:=MD5Print(Md5String(test));

if tri=hash then

begin

 Results[Num]:=test;
 Num:=Num+1; //Storing the matches in an array

end;

Write('Now trying: ',test);
Write('       ');
Writeln('Hash: ',tri); //A bit redundant, but it helped me debug the recursion, and it looks cool so I kept it.

ChangeChar(Max,length(test),test); //Go to the next variation

Until length(test)>Max; //Loop ends if the maximum character length is exceeded

if Num>1 then //Checking if there is more than 0 results

begin

 for j:=1 to Num do
  begin

  Writeln('Result #',j,': ',Results[Num]); //Writing out all the results
  end;
end
else

Writeln('Sorry, your hash could not be recovered'); //If the search fails...

Readln;

End.
I was testing with the string 'c7' at maximum length 2 and 3. (hash is: 4d3a21d8c684c09c19b93be911827fd5)
The problem is that eventhough it tries every possible permutation now, for some reason it can't list the results. The output is exactly this(except for the long blocks of tries)
'Result #1:
Result #2:'
And that's it. Empty strings. Arrrrgh it's driving me soooo mad, I'm pretty much done with the hard part, and some stupid error is stopping me.